事件の原因数日前、私は友人を手伝ってビリビリのキャプテングループをレビューしなければなりませんでした。キャプテンリストを1つずつ検索することは、当然プログラマーにとって第一選択ではありません。正しいやり方は、そのタスクをコンピューターに引き渡して、コンピューター自身に実行させることです。理論が確立されたら、コーディングを開始します。
そこで私は少し時間をかけてこのクローラーを書きました。このクローラーを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の最初のパラメータは、以下のルールに従って入力する必要があります。 ノードスケジュールルールは次の表に示すとおりです。
ルールを理解し、自分で実装する 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, () => { コンソールにログ出力します。 }); このルールは、秒、分、時間、日付、曜日、月、年などの値をサポートします。 いくつかの一般的なルールを次の表に示します。
4. タスクの終了実行中のタスクを終了するには、cancel() を使用します。タスクに異常が発生した場合は、時間内にタスクをキャンセルする ジョブをキャンセルします。 要約するnode-schedule は Node.js 用の crontab モジュールです。スケジュールされたタスクを使用してサーバー システムを保守し、一定の期間に必要な特定の操作を実行できます。スケジュールされたタスクを使用して、電子メールの送信、データのクロールなどを行うこともできます。 Nodejs でスケジュールされたクローラーを実装する方法に関するこの記事はこれで終わりです。Nodejs スケジュールされたクローラーに関するより関連性の高いコンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: Ubuntu 18.04 Server に静的 IP を設定する方法
>>: MySQL で珍しい文字を挿入できないときの対処方法 (文字列値が正しくない)
以前、UDP を使い始めるために簡単な UDP サーバーとクライアントの例を作成しましたが、実際に使...
スタイルシートの最も重要な機能の 1 つは、ページ、画面、電子シンセサイザーなどの複数のメディアに適...
みなさんこんにちは。今日は、MySQL 8.0.22 のインストールと構成について学習します。注意深...
目次1. 要素オフセットシリーズ2. 要素表示領域クライアントシリーズ3. 要素スクロールシリーズ1...
最適化のアイデア最適化には主に 2 つの方向があります。再レンダリングの回数を減らします。 Reac...
目次物体オブジェクト定義オブジェクトのメンバーを反復処理するJS組み込みオブジェクト数学オブジェクト...
変数の宣言グローバル変数の設定@a='新しい変数' を設定します。関数やストアドプロ...
目次安定導入手ぶれ補正シーン1(マウスの動き込み)手ぶれ補正シーン2(キーボードのキー)関数のスロッ...
HTML と CSS は誰もが知っていると思います。HTML の構造と CSS の表現の分離も知って...
これは今日私が踏んだ4つの落とし穴を記念したものです...落とし穴1:地元のせいエラー:エラー 39...
最近、Xiao Ming は新しい Mac を購入し、独自のブログ Web サイトを構築したいと考え...
Dockerコンテナのインストール時に遭遇しやすい2つの問題1.ポートはすでに割り当てられています(...
表では、左上の境界線の色を個別に定義したり、セルの右下の境界線の色を定義したりできます。これら 2 ...
背景スレッド•マスタースレッドコア バックグラウンド スレッドは主に、バッファー プール データをデ...
1. ナビゲーション: 順序なしリストとその他のラベル要素ナビゲーションを記述するために最も一般的に...