首页前端开发JavaScriptNodejs实现定时爬虫的完整实例

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

时间2024-02-01 03:02:02发布访客分类JavaScript浏览818
导读:收集整理的这篇文章主要介绍了Nodejs实现定时爬虫的完整实例,觉得挺不错的,现在分享给大家,也给大家做个参考。 目录事件起因使用 Node Schedule 实现定时任务一、安装 no...
收集整理的这篇文章主要介绍了Nodejs实现定时爬虫的完整实例,觉得挺不错的,现在分享给大家,也给大家做个参考。
目录
  • 事件起因
  • 使用 Node Schedule 实现定时任务
    • 一、安装 node-schedule
    • 二、基本用法
    • 三、高级用法
    • 四、终止任务
  • 总结

    事件起因

    前两天要帮朋友B站舰长群审核,一个个去舰长列表查找,自然不是一个程序猿的首选,把任务交给计算机让他自己做,摸鱼才是正道。理论成立开始Coding .

    由于已知舰长列表的 API 爬虫使用 Axios 直接访问接口

    于是花了亿点点时间写完了这段爬虫我称之为bilibili-live-Captain-tools 1.0

    const axios = require('axios')const roomid = "146088"const ruid = "642922"const url = `https://api.live.bilibili.COM/xlive/app-room/v2/GuardTab/topList?roomid=${
    roomid}
        &
    ruid=${
    ruid}
        &
    page_size=30`const Captin = {
     1: '总督', 2: '提督', 3: '舰长'}
        const reqPromise = url =>
         axios.get(url);
    let CaptinList = []let UserList = []async function crawler(URL, pageNow) {
         const res = await reqPRomise(URL);
     if (pageNow == 1) {
         CaptinList = CaptinList.concat(res.data.data.toP3);
     }
         CaptinList = CaptinList.concat(res.data.data.list);
    }
    function getMaxpage(res) {
     const Info = res.data.data.info const {
     page: maxPage }
     = Info return maxPage}
    function getUserList(res) {
     for (let ITem of res) {
     const userInfo = item const {
     uid, username, guard_level }
     = userInfo UserList.push({
     uid, username, Captin: Captin[guard_level] }
    ) }
    }
    async function main(UID) {
     const maxPage = await reqPromise(`${
    url}
        &
        page=1`).then(getMaxPage) for (let pageNow = 1;
         pageNow  maxPage + 1;
     pageNow++) {
     const URL = `${
    url}
        &
    page=${
    pageNow}
        `;
         await crawler(URL, pageNow);
     }
     getUserList(CaptinList) console.LOG(seArch(UID, UserList)) return search(UID, UserList)}
    function search(uid, UserList) {
         for (let i = 0;
         i  UserList.length;
     i++) {
     if (UserList[i].uid === uid) {
         return UserList[i];
     }
     }
     return 0}
    module.exports = {
     main}
        

    很明显这个爬虫只能手动触发,直接跑还需要个命令行和node环境,于是就给他用Koa2开了个页面服务,写一个极其简陋的页面

    const Koa = require('koa');
        const app = new Koa();
        const path = require('path')const fs = require('fs');
        const router = require('koa-router')();
    const index = require('./index')const views = require('koa-views')app.use(views(path.join(__dirname, './'), {
     extension: 'ejs'}
        ))app.use(router.routes());
        router.get('/', async ctx =>
     {
         ctx.response.tyPE = 'htML';
         ctx.response.body = fs.createReadStream('./index.html');
    }
        )router.get('/api/captin', async (ctx) =>
     {
     const UID = ctx.request.query.uid console.log(UID) const Info = await index.main(parseint(UID)) await ctx.render('index', {
     Info, }
    )}
        );
        app.listen(3000);
        

    由于页面没有节流防抖,当前版本又只能实时爬取,等待时间较长,频繁刷新自然会触发b站的反爬虫机制,于是当前服务器ip就被风控了。

    于是bilibili-live-captain-tools 2.0横空出世

    function throTTLe(fn, delay) {
         VAR timer;
     return function () {
         var _this = this;
         var args = arguments;
     if (timer) {
          return;
     }
     timer = setTimeout(function () {
          fn.apply(_this, args);
          timer = null;
     // 在delay后执行完fn之后清空timer,此时timer为假,throttle触发可以进入计时器 }
    , delay) }
    }
        

    再添加节流防抖的同时,使用伪实时爬虫(通过定时任务一分钟爬取一次)

    这种情况我们需要去定时执行爬虫脚本了,这个时候我就想到了就可以利用egg的schedule功能了,可是不想让一个爬虫程序如此“大材小用”,遇事不决,百度一下。于是就有了下面的方案

    使用 Node Schedule 实现定时任务

    Node Schedule是用于Node.js的灵活的cron类和非cron类作业调度程序。 它允许您使用可选的重复规则来计划作业(任意函数),以在特定日期执行。 它在任何给定时间仅使用一个计时器(而不是每秒钟/分钟重新评估即将到来的作业)。

    一、安装 node-schedule

    npm install node-schedule# 或yarn add node-schedule

    二、基本用法

    一起啊看一下官方给的例子

    const schedule = require('node-schedule');
    const job = schedule.scheduleJob('42 * * * *', function(){
         console.log('The answer to life, the universe, and everything!');
    }
        );
        

    schedule.scheduleJob 的第一个参数需要如下按照规则输入

    Node Schedule规则按下表表示

    *  *  *  *  *  *
    ┬  ┬  ┬  ┬  ┬  ┬
    │  │  │  │  │  |
    │  │  │  │  │  └ 星期几,取值:0 - 7,其中 0 和 7 都表示是周日
    │  │  │  │  └─── 月份,取值:1 - 12
    │  │  │  └────── 日期,取值:1 - 31
    │  │  └───────── 时,取值:0 - 23
    │  └──────────── 分,取值:0 - 59
    └─────────────── 秒,取值:0 - 59(可选)
    也可以指定一个具体的时间,如:const date = new Date()

    看懂规则我们自己实现一个

    const schedule = require('node-schedule');
        // 定义一个时间let date = new Date(2021, 3, 10, 12, 00, 0);
        // 定义一个任务let job = schedule.scheduleJob(date, () =>
     {
         console.log("现在时间:",new Date());
    }
        );
        

    上面的例子就代表到2021年3月10日12点的时候执行报时

    三、高级用法

    除了基础的用法,我们还可以使用一些更为灵活的方法来实现定时任务。

    3.1、隔一分钟执行一次

    const schedule = require('node-schedule');
        // 定义规则let rule = new schedule.RecurrenceRule();
        rule.second = 0//每分钟 0 秒执行一次// 启动任务let job = schedule.scheduleJob(rule, () =>
     {
         console.log(new Date());
    }
        );
        

    rule 支持设置的值有 second、minute、hour、date、dayOfWeek、month、year 等。

    一些常见的规则如下表

    每秒执行
    rule.second = [0,1,2,3......59];
    每分钟 0 秒执行
    rule.second = 0;
    每小时 30 分执行
    rule.minute = 30;
    rule.second = 0;
    每天 0 点执行
    rule.hour =0;
    rule.minute =0;
    rule.second =0;
    每月 1 号的 10 点执行
    rule.date = 1;
    rule.hour = 10;
    rule.minute = 0;
    rule.second = 0;
    每周一、周三、周五的 0 点和 12 点执行
    rule.dayOfWeek = [1,3,5];
    rule.hour = [0,12];
    rule.minute = 0;
    rule.second = 0;

    四、终止任务

    可以使用 cancel() 终止一个运行中的任务。当任务出现异常及时取消终止任务

    job.cancel();
        

    总结

    node-schedule 是 Node.js 的一个 定时任务(crontab)模块。我们可以使用定时任务来对服务器系统进行维护,让其在固定的时间段执行某些必要的操作,还可以使用定时任务发送邮件、爬取数据等;

    到此这篇关于Nodejs实现定时爬虫的文章就介绍到这了,更多相关Nodejs定时爬虫内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

    您可能感兴趣的文章:
    • 如何利用nodejs实现命令行游戏
    • Nodejs实现多人同时在线移动鼠标的小游戏分享
    • 使用Node.js实现一个多人游戏服务器引擎
    • Node.js 制作实时多人游戏框架
    • node.js适合游戏后台开发吗?
    • NodeJS和浏览器中this关键字的不同之处
    • nodejs处理tcp连接的核心流程
    • 如何写Node.JS版本小游戏

    声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!

    nodenodejs定时任务

    若转载请注明出处: Nodejs实现定时爬虫的完整实例
    本文地址: https://pptw.com/jishu/594834.html
    vue cli3 实现分环境打包的步骤 vue中路由传参以及跨组件传参详解

    游客 回复需填写必要信息