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 で珍しい文字を挿入できないときの対処方法 (文字列値が正しくない)

推薦する

この記事では、MySQLのマスタースレーブ同期の原理を説明します。

目次MySQL マスタースレーブ同期原理の簡単な分析1. マスタースレーブとは何ですか? 2. 主従...

Tudou.comのホームページのデザイン方法

<br />私は数年間フロントエンドに取り組んできました。フロントエンドについて完全に理...

ウィンドウの中央にブロック要素の位置を設定する方法

ウィンドウの中央にブロック要素の位置を設定する方法ブロック要素をウィンドウの中央に配置する上記の方法...

MySQLをシンプルに学ぶ

序文データベースは常に私の弱点でした。自分の経験 (python+sqlalchemy) を組み合わ...

MYSQLデータベーステーブル構造の最適化方法の詳細な説明

この記事では、例を使用して、MYSQL データベース テーブル構造を最適化する方法を説明します。ご参...

CSS グリッドレイアウトで列にアイテムを埋め込む方法

n 個のアイテムがあり、これらのアイテムをグリッド レイアウトの列に並べ替える必要があるとします。列...

フロートをクリアするための CSS メソッドの概要

フロートはWebページのレイアウトでよく使用されますが、フローティングブロックレベル要素は標準のドキ...

HTTP 戻りコード一覧(中国語と英語の説明)

httpリターンコードリスト(以下は概要です)詳細な中国語の説明についてはここをクリックしてくださ...

さまざまなMySQLインデックスの使用方法の詳細な説明

1. 遅いクエリログ1.1 MySQL ログの種類ログは、データベースの操作や、ユーザーがデータベー...

INS と DEL を使用してドキュメントの変更をマークする方法の詳細な説明

ins と del は、HTML 4.0 で導入され、文書の作成時に作成者が共同作業できるようにし、...

VMware 仮想マシンのインストール Apple Mac OS の超詳細なチュートリアル

目次要約する仕事の都合で Apple の Mac OS に対応するソフトウェアをインストールする必要...

MySQL が uuid または snowflake id を主キーとして使用することを推奨しない理由の詳細な分析

前書き: MySQL でテーブルを設計する場合、MySQL では UUID や非連続かつ非繰り返しの...

VMware Workstation 14 Pro のインストールとアクティベーションのグラフィック チュートリアル

この記事では、VMware Workstation 14 Proのインストールとアクティベーションに...

Windows での MySQL 8.X インストール チュートリアル

以前は MySQL 5.7 を使用していましたが、MySQL にいくつか新しい機能が追加されたため、...

選択/フォーカス時にすべてのオプションをリストする現在のより良い方法

開発中にこのような要件に遭遇したので、将来使用するために記録しました。需要背景キーボード ショートカ...