Node.js_node.jsで実装した簡易Webクローリング機能の例
今日、Web クローリングはよく知られたテクノロジーですが、単純な Web クローラーは、Ajax ローテーション トレーニング、XMLHttpRequest、WebSocket、Flash Sockets などのさまざまな複雑なテクノロジーに対応するのが依然として困難です。 Webサイト。
Hubdoc プロジェクトの基本的なニーズを例として考えてみましょう。このプロジェクトでは、請求金額、支払期日、口座番号、そして最も重要なことに、以下の企業の Web サイトからデータを収集します。最近の請求書のPDF。このプロジェクトでは、非常に単純なソリューション (当面は評価している高価な商用製品は使用しません) から始めました。これは、MessageLab/Symantec で Perl を使用する前に行った単純なクローラー プロジェクトです。しかし、結果は悲惨なものでした。スパム送信者が作成した Web サイトは、銀行や電力会社の Web サイトよりもはるかにシンプルでした。
それでは、この問題をどうやって解決するのでしょうか?私たちは主に、Mikea によって開発された優れた request ライブラリを使用することから始めました。ブラウザでリクエストを作成し、送信されるリクエスト ヘッダーを [ネットワーク] ウィンドウで確認し、これらのリクエスト ヘッダーをコードにコピーします。プロセスは簡単です。ログインから PDF ファイルのダウンロードまでのプロセスを追跡し、このプロセス内のすべてのリクエストをシミュレートするだけです。同様の処理を簡単にし、Web 開発者がより合理的にクローラー プログラムを作成できるようにするために、HTML から結果を取得するメソッドを (軽量の cheerio ライブラリを使用して) jQuery にエクスポートしました。タスクが簡単になり、CSS セレクターを使用してページ上の要素を選択するのも簡単になります。プロセス全体はフレームワークにラップされており、このフレームワークはデータベースからの証明書の取得、個々のロボットのロード、socket.io を介した UI との通信などの追加作業も実行できます。
これは一部の Web サイトでは機能しますが、これは単なる JS スクリプトであり、これらの企業がサイトに配置している私の node.js コードではありません。従来の問題が複雑さに重ねられ、ログイン情報ポイントを取得するために何をすべきかを理解することが非常に困難になっています。 request() ライブラリと組み合わせていくつかのサイトを取得しようと数日間試しましたが、それでも無駄でした。
クラッシュしそうになった後、phantomjs ヘッドレス Webkit ブラウザをノードから制御できるライブラリである node-phantomjs を発見しました (翻訳者注: 私はこれを持っていません)対応する名詞を考えると、ここでの headless は、ページのレンダリングが表示デバイスなしでバックグラウンドで完了することを意味します)。これは簡単な解決策のように思えますが、phantomjs には解決する必要がある避けられない問題がまだいくつかあります。
1. PhantomJS はページが読み込まれたかどうかのみを通知しますが、プロセス内で JavaScript またはメタ タグを介したリダイレクトがあるかどうかを判断することはできません。特に JavaScript が setTimeout() を使用して呼び出しを遅らせる場合はそうです。2.PhantomJS は、上記の問題を処理できるようにする pageLoadStarted フックを提供しますが、この関数は、ロードするページ数を決定し、各ページがロードされるときにこの数を減らす場合にのみ使用できます。また、タイムアウトが発生する可能性がある場合の処理を提供します (常にタイムアウトが発生するわけではないため)。これにより、数値が 0 に減少したときにコールバック関数が呼び出されます。このアプローチは機能しますが、常にハッキングのように感じられます。
3. PhantomJS では、クロールするページごとに完全に独立したプロセスが必要です。そうしないと、各ページ間の Cookie を分離できません。同じ phantomjs プロセスを使用すると、ログイン ページのセッションが別のページに送信されます。
4. PhantomJS を使用してリソースをダウンロードできません。ページは png または pdf としてのみ保存できます。これは便利ですが、PDF をダウンロードするには request() を使用する必要があることを意味します。
5. 上記の理由により、PhantomJS のセッションから request() のセッション ライブラリに Cookie を配布する方法を見つける必要があります。 document.cookie 文字列を配布し、解析して、request() Cookie jar に注入するだけです。
6. ブラウザー セッションに変数を挿入するのは簡単ではありません。これを行うには、JavaScript 関数を作成するための文字列を作成する必要があります。
page.evaluate(
"function () { var " name " = window." name " = " JSON.stringify(data) "}"
);
}
7. 一部の Web サイトには、console.log() などのコードが常に満載されており、再定義して必要な場所に出力する必要があります。これを達成するには、次のようにします:
if (!console.log) {
var iframe = document.createElement("iframe");
document.body.appendChild(iframe);
console = window.frames[0].console;
}
8. 一部の Web サイトには、console.log() などのコードが常に含まれており、再定義して必要な場所に出力する必要があります。これを達成するには、次のようにします:
if (!console.log) {
var iframe = document.createElement("iframe");
document.body.appendChild(iframe);
console = window.frames[0].console;
}
9. a タグをクリックしたことをブラウザに伝えるのは簡単ではありません。これらを完了するために、次のコードを追加しました。
var a = document.getElementById(id);
var e = document.createEvent("MouseEvents");
e.initMouseEvent("クリック", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
a.dispatchEvent(e);
};
すべての作業が完了すると、適切な PhantomJS リクエスト クローラー ソリューションが完成しました。 request() リクエストに戻る前に、PhantomJS を使用してログインする必要があります。PhantomJS に設定された Cookie を使用して、ログインしたセッションが認証されます。 request() のストリームを使用して PDF ファイルをダウンロードできるため、これは大きな利点です。
全体の計画は、Web 開発者が jQuery と CSS セレクターを使用してさまざまな Web サイト用のクローラーを作成する方法を比較的簡単に理解できるようにすることです。このアイデアが実現可能であることはまだ証明されていませんが、すぐに実現できると信じています。 。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











ノンブロッキングおよびイベント駆動に基づいて構築されたノード サービスには、メモリ消費量が少ないという利点があり、大量のネットワーク リクエストの処理に非常に適しています。大量のリクエストを前提として、「メモリ制御」に関する問題を考慮する必要があります。 1. V8 のガベージ コレクション メカニズムとメモリ制限 Js はガベージ コレクション マシンによって制御されます

この記事では、NodeJS V8 エンジンのメモリとガベージ コレクター (GC) について詳しく説明します。

Node 19 が正式リリースされましたので、この記事では Node.js 19 の 6 つの主要な機能について詳しく説明します。

ファイル モジュールは、ファイルの読み取り/書き込み/開く/閉じる/削除の追加など、基礎となるファイル操作をカプセル化したものです。ファイル モジュールの最大の特徴は、すべてのメソッドが **同期** と ** の 2 つのバージョンを提供することです。 asynchronous**、sync サフィックスが付いているメソッドはすべて同期メソッドであり、持たないメソッドはすべて異種メソッドです。

ノード用の Docker イメージの選択は些細なことのように思えるかもしれませんが、イメージのサイズと潜在的な脆弱性は、CI/CD プロセスとセキュリティに大きな影響を与える可能性があります。では、最適な Node.js Docker イメージを選択するにはどうすればよいでしょうか?

Node.js はどのように GC (ガベージ コレクション) を行うのでしょうか?次の記事で詳しく説明します。

ノードが npm コマンドを使用できない理由は、環境変数が正しく設定されていないためです。解決策は次のとおりです: 1. 「システムのプロパティ」を開きます; 2. 「環境変数」->「システム変数」を見つけて、環境を編集します。変数; 3.nodejs フォルダーの場所を見つけます; 4.「OK」をクリックします。

イベント ループは Node.js の基本的な部分であり、メイン スレッドがブロックされていないことを確認することで非同期プログラミングが可能になります。イベント ループを理解することは、効率的なアプリケーションを構築するために重要です。次の記事では、Node のイベント ループについて詳しく説明します。お役に立てれば幸いです。
