亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Nodejs實(shí)現(xiàn)定時(shí)爬蟲的完整實(shí)例

 更新時(shí)間:2021年03月12日 11:01:17   作者:咸魚愛前端  
這篇文章主要給大家介紹了關(guān)于Nodejs實(shí)現(xiàn)定時(shí)爬蟲的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

事件起因

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

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

于是花了億點(diǎn)點(diǎn)時(shí)間寫完了這段爬蟲我稱之為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
}

很明顯這個(gè)爬蟲只能手動(dòng)觸發(fā),直接跑還需要個(gè)命令行和node環(huán)境,于是就給他用Koa2開了個(gè)頁面服務(wù),寫一個(gè)極其簡陋的頁面

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);

由于頁面沒有節(jié)流防抖,當(dāng)前版本又只能實(shí)時(shí)爬取,等待時(shí)間較長,頻繁刷新自然會(huì)觸發(fā)b站的反爬蟲機(jī)制,于是當(dāng)前服務(wù)器ip就被風(fēng)控了。

于是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后執(zhí)行完fn之后清空timer,此時(shí)timer為假,throttle觸發(fā)可以進(jìn)入計(jì)時(shí)器
 }, delay)
 }
}

再添加節(jié)流防抖的同時(shí),使用偽實(shí)時(shí)爬蟲(通過定時(shí)任務(wù)一分鐘爬取一次)

這種情況我們需要去定時(shí)執(zhí)行爬蟲腳本了,這個(gè)時(shí)候我就想到了就可以利用egg的schedule功能了,可是不想讓一個(gè)爬蟲程序如此“大材小用”,遇事不決,百度一下。于是就有了下面的方案

使用 Node Schedule 實(shí)現(xiàn)定時(shí)任務(wù)

Node Schedule是用于Node.js的靈活的cron類和非cron類作業(yè)調(diào)度程序。 它允許您使用可選的重復(fù)規(guī)則來計(jì)劃作業(yè)(任意函數(shù)),以在特定日期執(zhí)行。 它在任何給定時(shí)間僅使用一個(gè)計(jì)時(shí)器(而不是每秒鐘/分鐘重新評(píng)估即將到來的作業(yè))。

一、安裝 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 的第一個(gè)參數(shù)需要如下按照規(guī)則輸入

Node Schedule規(guī)則按下表表示

*  *  *  *  *  *
┬  ┬  ┬  ┬  ┬  ┬
│  │  │  │  │  |
│  │  │  │  │  └ 星期幾,取值:0 - 7,其中 0 和 7 都表示是周日
│  │  │  │  └─── 月份,取值:1 - 12
│  │  │  └────── 日期,取值:1 - 31
│  │  └───────── 時(shí),取值:0 - 23
│  └──────────── 分,取值:0 - 59
└─────────────── 秒,取值:0 - 59(可選)
也可以指定一個(gè)具體的時(shí)間,如:const date = new Date()

看懂規(guī)則我們自己實(shí)現(xiàn)一個(gè)

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

// 定義一個(gè)時(shí)間
let date = new Date(2021, 3, 10, 12, 00, 0);

// 定義一個(gè)任務(wù)
let job = schedule.scheduleJob(date, () => {
 console.log("現(xiàn)在時(shí)間:",new Date());
});

上面的例子就代表到2021年3月10日12點(diǎn)的時(shí)候執(zhí)行報(bào)時(shí)

三、高級(jí)用法

除了基礎(chǔ)的用法,我們還可以使用一些更為靈活的方法來實(shí)現(xiàn)定時(shí)任務(wù)。

3.1、隔一分鐘執(zhí)行一次

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

// 定義規(guī)則
let rule = new schedule.RecurrenceRule();
rule.second = 0
//每分鐘 0 秒執(zhí)行一次

// 啟動(dòng)任務(wù)
let job = schedule.scheduleJob(rule, () => {
 console.log(new Date());
});

rule 支持設(shè)置的值有 second、minute、hour、date、dayOfWeek、month、year 等。

一些常見的規(guī)則如下表

每秒執(zhí)行
rule.second = [0,1,2,3......59];
每分鐘 0 秒執(zhí)行
rule.second = 0;
每小時(shí) 30 分執(zhí)行
rule.minute = 30;
rule.second = 0;
每天 0 點(diǎn)執(zhí)行
rule.hour =0;
rule.minute =0;
rule.second =0;
每月 1 號(hào)的 10 點(diǎn)執(zhí)行
rule.date = 1;
rule.hour = 10;
rule.minute = 0;
rule.second = 0;
每周一、周三、周五的 0 點(diǎn)和 12 點(diǎn)執(zhí)行
rule.dayOfWeek = [1,3,5];
rule.hour = [0,12];
rule.minute = 0;
rule.second = 0;

四、終止任務(wù)

可以使用 cancel() 終止一個(gè)運(yùn)行中的任務(wù)。當(dāng)任務(wù)出現(xiàn)異常及時(shí)取消終止任務(wù)

job.cancel();

總結(jié)

node-schedule 是 Node.js 的一個(gè) 定時(shí)任務(wù)(crontab)模塊。我們可以使用定時(shí)任務(wù)來對(duì)服務(wù)器系統(tǒng)進(jìn)行維護(hù),讓其在固定的時(shí)間段執(zhí)行某些必要的操作,還可以使用定時(shí)任務(wù)發(fā)送郵件、爬取數(shù)據(jù)等;

到此這篇關(guān)于Nodejs實(shí)現(xiàn)定時(shí)爬蟲的文章就介紹到這了,更多相關(guān)Nodejs定時(shí)爬蟲內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用nodejs實(shí)現(xiàn)JSON文件自動(dòng)轉(zhuǎn)Excel的工具(推薦)

    使用nodejs實(shí)現(xiàn)JSON文件自動(dòng)轉(zhuǎn)Excel的工具(推薦)

    這篇文章主要介紹了使用nodejs實(shí)現(xiàn),JSON文件自動(dòng)轉(zhuǎn)Excel的工具,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • 解決Mac下安裝nmp的淘寶鏡像失敗問題

    解決Mac下安裝nmp的淘寶鏡像失敗問題

    今天小編就為大家分享一篇解決Mac下安裝nmp的淘寶鏡像失敗問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • NodeJS實(shí)現(xiàn)圖片文本分割

    NodeJS實(shí)現(xiàn)圖片文本分割

    這篇文章主要為大家詳細(xì)介紹了NodeJS實(shí)現(xiàn)圖片文本分割,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Node.js中path.resolve與path.join的區(qū)別與作用詳解

    Node.js中path.resolve與path.join的區(qū)別與作用詳解

    path.resolve和path.join都是屬于path核心模塊下的方法,用來拼接路徑,下面這篇文章主要給大家介紹了關(guān)于Node.js中path.resolve與path.join的區(qū)別與作用的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • windows系統(tǒng)下安裝npm(Node.js)方法教程

    windows系統(tǒng)下安裝npm(Node.js)方法教程

    在Windows環(huán)境下進(jìn)行Node.js的安裝并不是一件復(fù)雜的事情,但是在安裝過程中需要注意一些細(xì)節(jié),下面這篇文章主要給大家介紹了關(guān)于windows系統(tǒng)下安裝npm(Node.js)的相關(guān)資料,需要的朋友可以參考下
    2023-12-12
  • node 解析圖片二維碼的內(nèi)容代碼實(shí)例

    node 解析圖片二維碼的內(nèi)容代碼實(shí)例

    這篇文章主要介紹了node 解析圖片二維碼的內(nèi)容代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • Node.js實(shí)現(xiàn)文件上傳的示例

    Node.js實(shí)現(xiàn)文件上傳的示例

    本篇文章主要介紹了Node.js實(shí)現(xiàn)文件上傳的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-06-06
  • 利用forever和pm2部署node.js項(xiàng)目過程

    利用forever和pm2部署node.js項(xiàng)目過程

    這篇文章主要給大家介紹了如何利用forever和pm2部署node.js項(xiàng)目的相關(guān)資料,文中給出了詳細(xì)的介紹和示例代碼供大家參考學(xué)習(xí),相信對(duì)大家的學(xué)習(xí)或者工作具有一定的學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編一起來看看吧。
    2017-05-05
  • Nodejs使用Mongodb存儲(chǔ)與提供后端CRD服務(wù)詳解

    Nodejs使用Mongodb存儲(chǔ)與提供后端CRD服務(wù)詳解

    這篇文章主要給大家介紹了關(guān)于Nodejs使用Mongodb存儲(chǔ)與提供后端CRD服務(wù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09
  • node文字生成圖片的示例代碼

    node文字生成圖片的示例代碼

    本篇文章主要介紹了node文字轉(zhuǎn)圖片的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-10-10

最新評(píng)論