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

下面是" 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日

相关文章

  • NodeJS 模块开发及发布详解分享

    下面给出关于“NodeJS模块开发及发布详解分享”的完整攻略,包括以下内容: NodeJS模块的基本概念; NodeJS模块的分类; NodeJS模块的使用方法; NodeJS模块的开发过程; NodeJS模块的发布过程; 示例说明。 NodeJS模块的基本概念 NodeJS模块是指NodeJS中可复用的代码单位,具有独立的作用域和命名空间,可以引入其他模块…

    node js 2023年6月8日
    00
  • nodejs个人博客开发第七步 后台登陆

    下面我将详细讲解“nodejs个人博客开发第七步 后台登陆”的完整攻略。 1. 确定需求和设计页面 在开始开发后台登录功能之前,需要先确定需求和设计登录页面。在设计登录页面时,需要考虑以下几个方面: 登录页面应该有输入账号和密码的表单,以及登录按钮。 检查用户输入的账号和密码是否合法,如果不合法,则需要提示用户重新输入。 如果用户输入的账号和密码正确,则跳转…

    node js 2023年6月8日
    00
  • React服务端渲染原理解析与实践

    React服务端渲染 (Server-Side Rendering, SSR) 是指在服务端实现页面渲染的技术。相对于客户端渲染(CSR),SSR有着更好的首屏渲染性能、更好的搜索引擎优化(SEO)和更好的社交分享体验,因此在实际项目中使用越来越广泛。 客户端渲染的问题 在客户端渲染模式下,首先浏览器请求到HTML,然后请求到JavaScript文件,随后J…

    node js 2023年6月8日
    00
  • Node.js API详解之 module模块用法实例分析

    下面是对“Node.js API详解之 module模块用法实例分析”的详细讲解: 模块的基本概念首先,我们需要理解 Node.js 中模块的基本概念。在 Node.js 中,每个文件都是一个模块。一个模块可以被其他模块引用,以便重复使用其中的代码。在每个模块内部,都有一个 module 对象代表当前模块。这个对象包含了该模块的各种属性和方法,可以方便我们管…

    node js 2023年6月8日
    00
  • Node.js进程退出的深入理解

    Node.js进程退出的深入理解 Node.js进程退出是一个非常重要的问题,在应用程序开发中经常会遇到各种问题,例如应用程序崩溃、进程无法退出等等,所以我们需要深入理解Node.js进程退出的原理及技巧,以避免这些问题的发生。 Node.js进程退出的原理 在Node.js中,进程的退出分为两种情况: 程序正常退出 程序异常退出 在程序正常退出的情况下,可…

    node js 2023年6月8日
    00
  • 超详细图解如何运行vue项目

    接下来我将详细讲解如何运行Vue项目的完整攻略。 步骤一:安装Node.js 在开始运行Vue项目之前,我们需要确保本地已经安装了Node.js。 可以访问官网下载对应操作系统的安装包,或者使用包管理工具进行安装。 如果你已经安装了Node.js,请跳过此步骤。 步骤二:安装Vue CLI Vue CLI是Vue.js官方提供的脚手架工具,可以帮助我们快速搭…

    node js 2023年6月8日
    00
  • node.js中实现kindEditor图片上传功能的方法教程

    下面是详细的“node.js中实现kindEditor图片上传功能的方法教程”的完整攻略: 1. 准备工作 首先需要安装 kindEditor 插件,在页面中引入插件相关JS和CSS文件。 2. 后台实现图片上传功能 2.1 安装 koa-body 中间件 为了方便处理上传的图片,我们需要安装一个中间件 koa-body,该中间件用于解析 multipart…

    node js 2023年6月8日
    00
  • NodeJs 文件系统操作模块fs使用方法详解

    NodeJs 文件系统操作模块fs使用方法详解 Node.js作为一款基于JavaScript的服务端脚本运行环境,拥有着强大的文件系统操作模块fs。fs模块提供了许多API以进行文件读、写等操作,本文将详细讲解fs模块的使用方法。 fs模块的引入 在使用fs模块之前,需要先进行引入。可以使用以下代码实现: const fs = require(‘fs’);…

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