一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

node.js|vue.js|jquery|angularjs|React|json|js教程|

服務器之家 - 編程語言 - JavaScript - node.js - Nodejs實現定時爬蟲的完整實例

Nodejs實現定時爬蟲的完整實例

2022-02-16 17:31咸魚愛前端 node.js

這篇文章主要給大家介紹了關于Nodejs實現定時爬蟲的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

事件起因

前兩天要幫朋友B站艦長群審核,一個個去艦長列表查找,自然不是一個程序猿的首選,把任務交給計算機讓他自己做,摸魚才是正道。理論成立開始Coding .

由于已知艦長列表的 API 爬蟲使用 Axios 直接訪問接口

于是花了億點點時間寫完了這段爬蟲我稱之為bilibili-live-captain-tools 1.0

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
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開了個頁面服務,寫一個極其簡陋的頁面

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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橫空出世

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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

?
1
2
3
npm install node-schedule
# 或
yarn add node-schedule

二、基本用法

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

?
1
2
3
4
5
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()

看懂規則我們自己實現一個

?
1
2
3
4
5
6
7
8
9
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、隔一分鐘執行一次

?
1
2
3
4
5
6
7
8
9
10
11
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() 終止一個運行中的任務。當任務出現異常及時取消終止任務

?
1
job.cancel();

總結

node-schedule 是 Node.js 的一個 定時任務(crontab)模塊。我們可以使用定時任務來對服務器系統進行維護,讓其在固定的時間段執行某些必要的操作,還可以使用定時任務發送郵件、爬取數據等;

到此這篇關于Nodejs實現定時爬蟲的文章就介紹到這了,更多相關Nodejs定時爬蟲內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://juejin.cn/post/6938249684896972808

延伸 · 閱讀

精彩推薦
  • node.jsk8s node節點重新加入master集群的實現

    k8s node節點重新加入master集群的實現

    這篇文章主要介紹了k8s node節點重新加入master集群的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋...

    Scarborought13922022-01-22
  • node.jslinux服務器快速卸載安裝node環境(簡單上手)

    linux服務器快速卸載安裝node環境(簡單上手)

    這篇文章主要介紹了linux服務器快速卸載安裝node環境(簡單上手),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需...

    mose-x8462022-01-22
  • node.js在瀏覽器中,把 Vite 跑起來了!

    在瀏覽器中,把 Vite 跑起來了!

    大家好,我是 ssh,前幾天在推上沖浪的時候,看到 Francois Valdy 宣布他制作了 browser-vite[1],成功把 Vite 成功在瀏覽器中運行起來了。這引起了我的興趣,如...

    前端從進階到入院9282022-01-11
  • node.jsrequire加載器實現原理的深入理解

    require加載器實現原理的深入理解

    這篇文章主要給大家介紹了關于require加載器實現原理的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需...

    隱冬8462022-03-03
  • node.jsNode.js ObjectWrap 的弱引用問題

    Node.js ObjectWrap 的弱引用問題

    最近在寫 Node.js Addon 的過程中,遇到了一個問題,然后發現是 ObjectWrap 弱引用導致的,本文介紹一下具體的問題和排查過程,以及 ObjectWrap 的使用問題。...

    編程雜技9852022-01-04
  • node.jsNode.js 中如何收集和解析命令行參數

    Node.js 中如何收集和解析命令行參數

    這篇文章主要介紹了Node.js 中如何收集和解析命令行參數,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋...

    descire8802021-12-28
  • node.jsnodejs中使用worker_threads來創建新的線程的方法

    nodejs中使用worker_threads來創建新的線程的方法

    這篇文章主要介紹了nodejs中使用worker_threads來創建新的線程的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友...

    flydean程序那些事8982022-01-06
  • node.js詳解node.js創建一個web服務器(Server)的詳細步驟

    詳解node.js創建一個web服務器(Server)的詳細步驟

    這篇文章主要介紹了詳解node.js創建一個web服務器(Server)的詳細步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,...

    王佳斌8952021-12-31
主站蜘蛛池模板: 无套白浆 | 日本在线www | 九九在线精品亚洲国产 | 好湿好紧太硬了我太爽了网站 | 久久受www免费人成_看片中文 | 四虎影视入口 | 欧美一区二区三区精品国产 | 四虎成人影院网址 | 99国产高清久久久久久网站 | 91短视频在线观看2019 | 99午夜高清在线视频在观看 | 丝袜老师好湿好紧我要进去了 | 亚洲国产天堂在线观看 | 韩国理论三级在线观看视频 | 日本在线观看视频 | 俄罗斯女人与公拘i交酡 | 私人家庭影院5577 | 美女的隐私视频免费看软件 | 俄罗斯12一15处交 | 香蕉久久久| 美女被灌浣肠失禁视频 | 禁止的爱善良的未删减版hd | 国产精品怡红院在线观看 | 冰雪奇缘1完整版免费观看 变形金刚第一部 | 日韩一区国产二区欧美三 | 91精品啪在线观看国产线免费 | 毛片视频在线免费观看 | 亚洲日日操 | 欧美日韩一区二区三在线 | 精品精品久久宅男的天堂 | 欧美sex另类孕妇 | 公妇仑乱在线观看 | 欧美不卡一区二区三区 | 日本高清免费观看 | 美女翘臀跪床被打屁股作文 | 日韩免费毛片视频杨思敏 | 动漫美丽妇人1~2在线看 | 人与善交大片免费看 | 男同激情视频 | 国内精品久久久久小说网 | 精品国产福利片在线观看 |