事件起因

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

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

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

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

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

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

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

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

使用 node schedule 实现定时任务

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

一、安装 node-schedule

二、基本用法

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

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

node schedule规则按下表表示

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

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

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

三、高级用法

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

3.1、隔一分钟执行一次

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() 终止一个运行中的任务。当任务出现异常及时取消终止任务

总结

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

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