Nodejs でタイムドクローラーを実装する完全な例

Nodejs でタイムドクローラーを実装する完全な例

事件の原因

数日前、私は友人を手伝ってビリビリのキャプテングループをレビューしなければなりませんでした。キャプテンリストを1つずつ検索することは、当然プログラマーにとって第一選択ではありません。正しいやり方は、そのタスクをコンピューターに引き渡して、コンピューター自身に実行させることです。理論が確立されたら、コーディングを開始します。

既知のキャプテンリストのAPIクローラーはAxiosを使用してインターフェースに直接アクセスするため

そこで私は少し時間をかけてこのクローラーを書きました。このクローラーをbilibili-live-captain-tools 1.0と名付けました。

定数 axios = require('axios')
定数ルームID = "146088"
定数 ruid = "642922"
定数 url = `https://api.live.bilibili.com/xlive/app-room/v2/guardTab/topList?roomid=${roomid}&ruid=${ruid}&page_size=30`

const キャプテン = {
 1: 「知事」
 2: 「提督」
 3: 「キャプテン」
}

const reqPromise = url => axios.get(url);

CaptinList = [] とします
UserList = [] とします

非同期関数クローラー(URL、pageNow) {
 const res = reqPromise(URL) を待機します。
 ページナウ == 1 の場合
 CaptinList = CaptinList.concat(res.data.data.top3);
 }
 CaptinList = CaptinList.concat(res.data.data.list);
}


関数 getMaxPage(res) {

 定数情報 = res.data.data.info
 const { page: maxPage } = 情報
 maxPageを返す
}


関数 getUserList(res) {

 for (let 項目の res) {
 const ユーザー情報 = アイテム
 const { uid, ユーザー名, guard_level } = ユーザー情報
 UserList.push({ uid, ユーザー名, Captin: Captin[guard_level] })
 }
}

非同期関数main(UID) {
 const maxPage = reqPromise(`${url}&page=1`).then(getMaxPage) を待機します。
 (pageNow = 1; pageNow < maxPage + 1; pageNow++) の場合 {
 const URL = `${url}&page=${pageNow}`;
 クローラーを待機します(URL、pageNow);
 }
 ユーザーリストを取得します(CaptinList)
 console.log(検索(UID, ユーザーリスト))
 検索(UID, UserList)を返す
}

関数検索(uid, UserList) {
 (i = 0 とします; i < UserList.length; i++) {
 (UserList[i].uid === uid)の場合{
 UserList[i]を返します。
 }
 }
 0を返す
}

モジュール.エクスポート = {
 主要
}

当然ながら、このクローラーは手動でしか起動できず、直接実行するにはコマンドラインとノード環境が必要なので、Koa2でページサービスを開き、非常にシンプルなページを作成しました。

const Koa = require('koa');
const app = new Koa();
定数パス = require('path')
定数 fs = require('fs');
const ルーター = require('koa-router')();
定数インデックス = require('./index')
const views = require('koa-views')



app.use(views(path.join(__dirname, './'), {
 拡張子: 'ejs'
}))
ルーターのルートを使用します。

router.get('/', 非同期ctx => {
 ctx.response.type = 'html';
 ctx.response.body = fs.createReadStream('./index.html');
})

router.get('/api/captin', 非同期 (ctx) => {
 定数 UID = ctx.request.query.uid
 コンソール.log(UID)
 const Info = index.main(parseInt(UID)) を待機します
 ctx.render('index', {を待つ
 情報、
 })
});

アプリをリッスンする(3000);

ページにはスロットリングとアンチシェイクがないため、現在のバージョンはリアルタイムでのみクロールでき、待機時間が長く、頻繁に更新すると自然にBステーションのアンチクローラーメカニズムがトリガーされるため、現在のサーバーIPはリスク制御の対象となります。

こうしてbilibili-live-captain-tools 2.0が誕生しました

関数スロットル(fn, 遅延) {
 var タイマー;
 関数を返す(){
 var _this = これ;
 var args = 引数;
 if (タイマー) {
  戻る;
 }
 タイマー = setTimeout(関数() {
  fn.apply(_this, args);
  timer = null; // 遅延後に fn を実行した後、タイマーをクリアします。このとき、タイマーは false であり、スロットルトリガーはタイマーに入ることができます}, delay)
 }
}

スロットルと手ぶれ補正を追加し、疑似リアルタイムクローラーを使用する(スケジュールされたタスクを1分ごとにクロールする)

この場合、クローラー スクリプトを定期的に実行する必要があります。このとき、egg のスケジュール機能を使用することを考えましたが、クローラー プログラムをあまり「やりすぎ」にしたくありません。疑問に思ったときは、Baidu で検索するだけです。そこで私たちは次のような計画を立てました

Node Scheduleを使用してスケジュールされたタスクを実装する

Node Schedule は、Node.js 用の柔軟な cron および非 cron ジョブ スケジューラです。 オプションの繰り返しルールを使用して、特定の日付に実行されるジョブ (任意の機能) をスケジュールできます。 特定の時点では 1 つのタイマーのみを使用します (今後のジョブを毎秒/毎分再評価するのではなく)。

1. node-scheduleをインストールする

npm インストール ノード スケジュール
# または yarn add node-schedule

2. 基本的な使い方

公式の例を見てみましょう。

const スケジュール = require('node-schedule');

const job = schedule.scheduleJob('42 * * * *', 関数(){
 console.log('人生、宇宙、そしてすべてのものに対する答え!');
});

schedule.scheduleJobの最初のパラメータは、以下のルールに従って入力する必要があります。

ノードスケジュールルールは次の表に示すとおりです。

* * * * * *
┬ ┬ ┬ ┬ ┬ ┬
│ │ │ │ │ |
│ │ │ │ │ └ 曜日、値の範囲: 0 - 7、0 と 7 は両方とも日曜日を表します │ │ │ │ └─── 月、値の範囲: 1 - 12
│ │ │ └────── 日付、値: 1 - 31
│ │ └───────── 、値: 0 - 23
│ └──────────── ポイント、値: 0 - 59
└──────────────── 秒、値: 0 - 59 (オプション)
特定の時間を指定することもできます。例: const date = new Date()

ルールを理解し、自分で実装する

const スケジュール = require('node-schedule');

// 時間を定義します。let date = new Date(2021, 3, 10, 12, 00, 0);

// タスクを定義する let job = schedule.scheduleJob(date, () => {
 console.log("現在の時刻:",新しい日付());
});

上記の例は、2021年3月10日12:00に時刻が報告されることを意味します。

3. 高度な使い方

基本的な使用方法に加えて、スケジュールされたタスクを実装するために、より柔軟な方法を使用することもできます。

3.1. 1分ごとに実行する

const スケジュール = require('node-schedule');

// ルールを定義します。let rule = new schedule.RecurrenceRule();
ルール.秒 = 0
// 毎分 0 秒に 1 回実行 // タスクを開始します let job = schedule.scheduleJob(rule, () => {
 コンソールにログ出力します。
});

このルールは、秒、分、時間、日付、曜日、月、年などの値をサポートします。

いくつかの一般的なルールを次の表に示します。

1秒あたりの実行回数
ルール.秒 = [0,1,2,3......59];
毎分0秒に実行する
ルール.秒 = 0;
30分ごとに実行
ルール.分 = 30;
ルール.秒 = 0;
毎日0:00に実行されます
ルール.時間 =0;
ルール.分 =0;
ルール.秒 =0;
毎月1日10:00に実行
ルール.日付 = 1;
ルール.時間 = 10;
ルール.分 = 0;
ルール.秒 = 0;
毎週月曜、水曜、金曜の0:00と12:00に実行されます
ルール.dayOfWeek = [1,3,5];
ルール.時間 = [0,12];
ルール.分 = 0;
ルール.秒 = 0;

4. タスクの終了

実行中のタスクを終了するには、cancel() を使用します。タスクに異常が発生した場合は、時間内にタスクをキャンセルする

ジョブをキャンセルします。

要約する

node-schedule は Node.js 用の crontab モジュールです。スケジュールされたタスクを使用してサーバー システムを保守し、一定の期間に必要な特定の操作を実行できます。スケジュールされたタスクを使用して、電子メールの送信、データのクロールなどを行うこともできます。

Nodejs でスケジュールされたクローラーを実装する方法に関するこの記事はこれで終わりです。Nodejs スケジュールされたクローラーに関するより関連性の高いコンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Node.js を使用してコマンドライン ゲームを実装する方法
  • Nodejs は、複数の人が同時にオンラインでマウスを動かして小さなゲームを共有することを実現します。
  • Node.js を使用したマルチプレイヤー ゲーム サーバー エンジンの実装
  • Node.js リアルタイム マルチプレイヤー ゲーム フレームワーク
  • node.js はゲームのバックエンド開発に適していますか?
  • NodeJSとブラウザにおけるこのキーワードの違い
  • Node.js の TCP 接続処理のコア プロセス
  • ゲームの Node.JS バージョンを作成する方法

<<:  Ubuntu 18.04 Server に静的 IP を設定する方法

>>:  MySQL で珍しい文字を挿入できないときの対処方法 (文字列値が正しくない)

推薦する

JavaScript ステートメントの一般的な for ループの詳細な説明

JavaScript には、for、for in、for of、forEach ループなど、多くのル...

JavaScript イベント委任の原則

目次1. イベント委任とは何ですか? 2. イベント委任の原則3. イベント委託の役割1. イベント...

データ URI スキームを使用して Web ページに画像を埋め込む方法の紹介

データ URI スキームを使用すると、HTML、CSS、Javascript などで使用できるインラ...

MySQL マスタースレーブスイッチチャネルの問題の解決策

VIP を設定した後、アクティブ/スタンバイの切り替え中に表示されるエラー メッセージは次のとおりで...

Vue プロジェクトで垂直テーブルを 2 つの方法で実装するアイデアの分析

問題の説明私たちのプロジェクトでは、水平方向のテーブルが一般的ですが、必要に応じて垂直方向のテーブル...

Linuxでバージョン情報を表示する方法

Linux でバージョン情報を表示する方法。ビット数、バージョン情報、CPU コア情報、CPU 固有...

複数の X 軸を使用して 7 日間の天気予報を実現するための Echarts サンプル コード

目次UIデザインEcharts の例の効果序文サンプルコード最終結果UIデザイン Echarts の...

Linux 構成 SSH パスワードフリーログイン「ssh-keygen」の基本的な使い方

目次1 SSHとは何か2 SSHパスワードフリーログインを設定する2.1 必要なソフトウェアのインス...

Docker Hubの動作原理と実装プロセスの分析

GitHub が提供するコード ホスティング サービスと同様に、Docker Hub はイメージ ホ...

MySql5.7.18 の文字セット構成の詳細なグラフィック説明

背景:かなり前(2017.6.5、記事にはタイムリーさがあり、特に使用されているツールは頻繁に更新さ...

QTとJavaScript間のインタラクティブデータの実装

1. QTからJSへのデータフロー1. QTはJS関数を呼び出し、JSはパラメータを通じてQTの値を...

フロントエンドはJavaScriptを通じてCADグラフィックスの詳細を作成および変更します。

目次1. 現状2. JSでCADグラフィックを作成および変更する2.1 サポートされているCADエン...

Nginx でバージョン番号と Web ページのキャッシュ時間を非表示にする方法

Nginx の最適化 - バージョン番号と Web ページのキャッシュ時間を非表示にするバージョン番...

はじめに: HTML の基本的なタグと属性の簡単な紹介

HTML はタグと属性で構成されており、これらを組み合わせてブラウザにページの表示方法を指示します。...

Reactは適応性の高い仮想リストを実装する

目次変換前:変換後: 0x0の基本0x1 「固定高さ」の仮想リストを実装する原理:最適化: 0x2 ...