事件の原因数日前、私は友人を手伝ってビリビリのキャプテングループをレビューしなければなりませんでした。キャプテンリストを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 で珍しい文字を挿入できないときの対処方法 (文字列値が正しくない)
JavaScript には、for、for in、for of、forEach ループなど、多くのル...
目次1. イベント委任とは何ですか? 2. イベント委任の原則3. イベント委託の役割1. イベント...
データ URI スキームを使用すると、HTML、CSS、Javascript などで使用できるインラ...
VIP を設定した後、アクティブ/スタンバイの切り替え中に表示されるエラー メッセージは次のとおりで...
問題の説明私たちのプロジェクトでは、水平方向のテーブルが一般的ですが、必要に応じて垂直方向のテーブル...
Linux でバージョン情報を表示する方法。ビット数、バージョン情報、CPU コア情報、CPU 固有...
目次UIデザインEcharts の例の効果序文サンプルコード最終結果UIデザイン Echarts の...
目次1 SSHとは何か2 SSHパスワードフリーログインを設定する2.1 必要なソフトウェアのインス...
GitHub が提供するコード ホスティング サービスと同様に、Docker Hub はイメージ ホ...
背景:かなり前(2017.6.5、記事にはタイムリーさがあり、特に使用されているツールは頻繁に更新さ...
1. QTからJSへのデータフロー1. QTはJS関数を呼び出し、JSはパラメータを通じてQTの値を...
目次1. 現状2. JSでCADグラフィックを作成および変更する2.1 サポートされているCADエン...
Nginx の最適化 - バージョン番号と Web ページのキャッシュ時間を非表示にするバージョン番...
HTML はタグと属性で構成されており、これらを組み合わせてブラウザにページの表示方法を指示します。...
目次変換前:変換後: 0x0の基本0x1 「固定高さ」の仮想リストを実装する原理:最適化: 0x2 ...