今日、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 関数を作成するための文字列を作成する必要があります。
8. 一部の Web サイトには、console.log() などのコードが常に含まれており、再定義して必要な場所に出力する必要があります。これを達成するには、次のようにします:
すべての作業が完了すると、適切な PhantomJS リクエスト クローラー ソリューションが完成しました。 request() リクエストに戻る前に、PhantomJS を使用してログインする必要があります。PhantomJS に設定された Cookie を使用して、ログインしたセッションが認証されます。 request() のストリームを使用して PDF ファイルをダウンロードできるため、これは大きな利点です。
全体の計画は、Web 開発者が jQuery と CSS セレクターを使用してさまざまな Web サイト用のクローラーを作成する方法を比較的簡単に理解できるようにすることです。このアイデアが実現可能であることはまだ証明されていませんが、すぐに実現できると信じています。 。