91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用Nodejs怎么編寫一個定時爬蟲

發布時間:2021-03-12 17:06:24 來源:億速云 閱讀:240 作者:Leah 欄目:開發技術

使用Nodejs怎么編寫一個定時爬蟲?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

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

關于使用Nodejs怎么編寫一個定時爬蟲問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

阳泉市| 嵊泗县| 屏边| 阳春市| 灵石县| 乌兰浩特市| 山东| 丹寨县| 景洪市| 宿松县| 五寨县| 姚安县| 封丘县| 青河县| 黄石市| 北川| 云梦县| 满城县| 闽清县| 永年县| 阳信县| 陕西省| 穆棱市| 广饶县| 嘉鱼县| 都江堰市| 潼关县| 广宗县| 阳曲县| 抚松县| 扎赉特旗| 呼伦贝尔市| 伊金霍洛旗| 金湖县| 财经| 丹东市| 宁武县| 武威市| 盐边县| 自贡市| 常州市|