Nodejs实现定时爬虫的完整实例

yizhihongxing

下面是" Nodejs实现定时爬虫的完整实例 "的完整攻略:

简介

本文将介绍如何使用 Nodejs 实现一个定时爬虫的完整实例。本文将涵盖以下方面:
- 单次爬虫的实现方法
- 定时任务的实现方法
- 着重讲解使用 node-schedule 实现定时任务的方法
- 代码的分析

单次爬虫的实现方法

使用 Nodejs 实现一个爬虫,需要借助一个第三方库 cheerio。cheerio 可以将页面转化为 HTML,实现快速的 DOM 操作,并且它的使用方法和 jQuery 非常相似。

本文以爬取天气预报的数据为例,其中天气预报的数据来源于 中国气象局

首先需要安装依赖:

npm install axios cheerio

然后,我们通过 axios 爬取页面信息,使用 cheerio 提取需要的数据,并将数据以 JSON 的形式输出。代码如下:

// 引入依赖
const axios = require('axios');
const cheerio = require('cheerio');

// 爬取页面信息
axios.get('http://www.weather.com.cn/weather/101200101.shtml').then(res => {

    // 将页面转化为 HTML
    const $ = cheerio.load(res.data);

    // 提取需要的数据
    const city = $('.crumbs.fl > a').eq(1).text(); // 城市
    const temperature = $('.tem > span').eq(0).text(); // 气温
    const weather = $('.wea').eq(0).text(); // 天气

    // 将数据以 JSON 的形式输出
    console.log({
        city,
        temperature,
        weather,
    });
}).catch(err => console.error(err));

运行以上代码,将会输出以下结果:

{
    city: '武汉',
    temperature: '6℃',
    weather: '多云转晴',
}

我们可以看到,通过以上代码实现了单次爬虫的简单实例。

定时任务的实现方法

首先,我们需要了解 node-schedule 的基本用法,可以参考官方文档

首先,需要安装依赖:

npm install node-schedule

然后,我们可以通过以下代码实现每分钟执行一次任务:

const schedule = require('node-schedule');

schedule.scheduleJob('*/1 * * * *', function() {
    console.log('The answer to life, the universe, and everything!');
});

以上代码将会在每分钟执行一次,输出 "The answer to life, the universe, and everything!"。

在定时任务中,我们可以再次使用爬虫的方式获取数据,并且可以使用文件流将数据写入本地文件。下面是代码示例:

const fs = require('fs');
const axios = require('axios');
const cheerio = require('cheerio');
const schedule = require('node-schedule');

const filePath = './data.json';

const spider = () => {
    axios.get('http://www.weather.com.cn/weather/101200101.shtml').then(res => {
        const $ = cheerio.load(res.data);
        const city = $('.crumbs.fl > a').eq(1).text();
        const temperature = $('.tem > span').eq(0).text();
        const weather = $('.wea').eq(0).text();

        const data = {
            city,
            temperature,
            weather,
            date: new Date(),
        };

        fs.writeFile(filePath, JSON.stringify(data), { flag: 'a' }, function (err) {
            if (err) {
                console.error(err);
            } else {
                console.log('success');
            }
        });
    }).catch(err => console.error(err));
};

const job = schedule.scheduleJob('*/10 * * * * *', spider); // 每隔 10 秒执行一次任务

以上代码将会在每隔 10 秒执行一次任务,将爬取到的数据以 JSON 的形式写入./data.json 文件中。

代码分析

  • 以上代码中,我们引入了 axios、cheerio、node-schedule 三个依赖。
  • 在单次爬虫的实现方法中,我们使用 axios 爬取数据,使用 cheerio 提取数据。
  • 在定时任务的实现方法中,我们通过 schedule.scheduleJob() 方法实现了定时任务,并且在任务中调用了爬虫的方法,将爬取到的数据写入了本地文件。
  • 在爬虫的方法 spider() 中,我们将数据保存在 data 变量中,并将 data 变量以 JSON 的形式写入了文本文件中。由于我们希望每次运行都将数据追加到文本末尾,因此我们使用了 { flag: 'a' } 将文件写入方式设置为追加。

示例说明

下面是两个 Nodejs 实现定时爬虫的完整示例:

示例一

实现方式:每隔 10 秒钟爬取一次头条新闻,并将数据输出到控制台。

const axios = require('axios');
const cheerio = require('cheerio');
const schedule = require('node-schedule');

const spider = () => {
    axios.get('https://www.toutiao.com/').then(res => {
        const $ = cheerio.load(res.data);
        const title = $('title').text(); // 获取网页标题
        console.log(`${new Date()}: ${title}`);
    }).catch(err => console.error(err));
};

const job = schedule.scheduleJob('*/10 * * * * *', spider); // 每隔 10 秒执行一次任务

示例二

实现方式:每日早上 6 点整爬取一次全国疫情数据,并将数据以 JSON 的形式写入./data.json 文件中。

const fs = require('fs');
const axios = require('axios');
const cheerio = require('cheerio');
const schedule = require('node-schedule');

const filePath = './data.json';

const spider = () => {
    axios.get('https://ncov.dxy.cn/ncovh5/view/pneumonia').then(res => {
        const $ = cheerio.load(res.data);
        const dataScript = $('#getStatisticsService').next().html();
        const regExp = /window\.getStatisticsService\s=\s(\{.+\})\scatch/; // 通过正则表达式获取数据
        const result = JSON.parse(dataScript.match(regExp)[1]).statistics; // 解析数据

        const data = {
            confirmedCount: result.confirmedCount, // 确诊人数
            suspectedCount: result.suspectedCount, // 疑似病例数
            curedCount: result.curedCount, // 治愈人数
            deadCount: result.deadCount, // 死亡人数
            date: new Date(), // 日期
        };

        fs.writeFile(filePath, JSON.stringify(data), { flag: 'a' }, function (err) {
            if (err) {
                console.error(err);
            } else {
                console.log('success');
            }
        });
    }).catch(err => console.error(err));
};

const job = schedule.scheduleJob('0 6 * * *', spider); // 每天早上 6 点执行任务

以上就是使用 Nodejs 实现定时爬虫的完整攻略,希望对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Nodejs实现定时爬虫的完整实例 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • 浅谈Vue3中key的作用和工作原理

    下面就是“浅谈Vue3中key的作用和工作原理”的完整攻略。 什么是key? Vue中的key是v-for指令中的一个特殊属性。当Vue更新组件列表时,Vue会将列表中的每个节点与其之前的节点进行对比,并通过一种算法来尽量少地更改DOM树。通过使用key属性,同时考虑节点的顺序、类型和内容,Vue可以更好地确定哪些节点需要被更新,删除或添加。 key的作用 …

    node js 2023年6月8日
    00
  • 如何让Nodejs支持H5 History模式(connect-history-api-fallback源码分析)

    下面是完整攻略。 什么是H5 History模式? H5 History模式是HTML5中新增的History API。它通过更改浏览器地址栏的URL来实现页面不刷新的页面跳转效果。在使用H5 History API时,需要在Nodejs中配置路由规则来支持。一般来说,当你在单页应用中进行跳转时,H5 History模式都是被默认启用的。 解决方案 若要让N…

    node js 2023年6月8日
    00
  • Python调用JavaScript代码的方法

    Python 可以通过集成第三方库实现调用 JavaScript 代码。下面我介绍两种主流的方法以及示例说明。 方法一:使用 PyV8 PyV8 是一种 Python 和 JavaScript 之间的双向绑定引擎。通过它我们可以在 Python 中调用 JavaScript 代码,方法如下: 安装 PyV8 !pip install PyV8 使用 PyV8…

    node js 2023年6月8日
    00
  • Nodejs抓取html页面内容(推荐)

    Node.js 是一个用于编写高效且可扩展的网络应用程序的跨平台 JavaScript 运行时环境。它使用事件驱动、非阻塞 I/O 模型,使其轻松处理大量并发连接。在Node.js中,抓取HTML页面内容可以使用request和Cheerio两个库来实现。 安装依赖库 在使用Node.js抓取HTML页面内容之前,需要先安装所需的依赖库,即request和C…

    node js 2023年6月8日
    00
  • Node.js如何使用Diffie-Hellman密钥交换算法详解

    Node.js如何使用Diffie-Hellman密钥交换算法详解 简介 Diffie-Hellman密钥交换算法是一种非对称加密算法,用于在两个或多个参与方之间安全地传输秘密信息。该算法由Whitfield Diffie和Martin Hellman在1976年提出,是公钥加密的先驱算法之一。 在本文中,我们将讲解如何使用Node.js实现Diffie-H…

    node js 2023年6月8日
    00
  • Linux环境部署node服务并启动详细步骤

    下面是详细讲解Linux环境部署Node服务并启动的步骤: 环境准备 在开始部署Node服务之前,需要确保环境中已经安装了以下软件和工具: Linux操作系统,例如Ubuntu、CentOS Node.js运行环境 NPM包管理工具 Git版本控制工具 如果当前系统还没有安装这些软件或工具,可以通过以下方式进行安装: 安装Node.js和NPM 在Ubunt…

    node js 2023年6月8日
    00
  • 浅谈Express.js解析Post数据类型的正确姿势

    浅谈Express.js解析Post数据类型的正确姿势 在使用Node.js开发Web应用程序时,我们通常会使用Express.js框架来帮助我们搭建应用程序的基本结构。而处理Post请求,获取Post数据则是开发Web应用程序时必不可少的一部分。本篇文章将会详细讲解,在Express.js中,如何正确地解析不同类型的Post数据。 解析applicatio…

    node js 2023年6月8日
    00
  • node.js中优雅的使用Socket.IO模块的方法

    首先,为了优雅地使用Socket.IO模块,我们需要深入了解它的原理和使用方法。 Socket.IO模块简介 Socket.IO是一个实时通信库,它使得实时的双向通信变得轻而易举。它是建立在WebSockets之上的,但也可以在不支持WebSockets的浏览器中工作。 在Node.js中,通过安装Socket.IO模块,在服务端和客户端之间建立连接,可以实…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部