今日、Webクロールはよく知られている技術ですが、まだ多くの複雑さがあります。シンプルなWebクローラーは、AJAXトレーニング、XMLHTTPRequest、WebSocket、Flash Socketなど、さまざまな複雑なテクノロジーによって開発された最新のWebサイトと競合することは依然として困難です。
Hubdocプロジェクトの基本的なニーズを例として、銀行、公益事業、クレジットカード会社のWebサイトからの最近の請求書のPDFを請求額、有効期限、アカウント番号、および最も重要なこととしてクロールします。このプロジェクトでは、私は非常にシンプルなソリューション(当分の間評価している高価な商用製品を使用していません)から始めました。しかし、結果はうまくいかず、スパマーは銀行やユーティリティのウェブサイトよりもはるかにシンプルなウェブサイトを作りました。
では、この問題を解決する方法は?主に、Mikeaを使用して開発された優れたリクエストライブラリから始めます。ブラウザでリクエストを行い、ネットワークウィンドウでリクエストヘッダーが送信されたリクエストヘッダーを確認し、これらのリクエストヘッダーをコードにコピーします。このプロセスは非常に簡単です。ログインからPDFファイルのダウンロードまでのすべてのリクエストを追跡し、このプロセスのすべてのリクエストをシミュレートするだけです。同様のものの処理を容易にし、Web開発者をCrawlerプログラムの書き込みにおいてより合理的にするために、HTMLの結果をjQueryに(軽量Cheateioライブラリを使用して)エクスポートしました。プロセス全体がフレームワークに包まれており、データベースから証明書を取得したり、個々のロボットを読み込んだり、socket.ioを介してUIと通信するなど、追加の作業を行うことができます。
これは一部のWebサイトで機能しますが、これらの企業によってサイトに配置されている私のnode.jsコードではなく、JSスクリプトにすぎません。残りの問題を重ねて複雑さに対処することができ、ログイン情報ポイントを取得するために何をすべきかを把握することは非常に困難です。一部のサイトでは、数日間リクエスト()ライブラリと組み合わせることでそれを取得しようとしましたが、それでもまだ無駄でした。
ほぼクラッシュした後、ノード-Phantomjsを発見しました。これは、ノードからPhantomJSヘッドレスWebKitブラウザを制御できるライブラリを発見しました(翻訳者の注:対応する名詞を期待していませんでした。ヘッドレスは、デバイスを表示せずにレンダリングページがバックグラウンドで完成することを意味します)。これは簡単な解決策のように思えますが、Phantomjsが避けられない問題がいくつかあります。
1.phantomjsは、ページが読み込まれているかどうかのみを知ることができますが、このプロセスでJavaScriptまたはMetaタグを使用してリダイレクト(リダイレクト)が実装されているかどうかを判断することはできません。特にJavaScriptがSettimeout()を使用して呼び出しを遅らせる場合。
2.phantomjsは、上記の問題に対処できるようにするPageloAdstartedフックを提供しますが、この関数はロードするページ数を決定した場合にのみこの数を減らすことができ、各ページがロードされたときにこの数を減らし、可能なタイムアウトの処理を提供し、0に減少する場合、コールバック機能は呼ばれます。この方法は機能する可能性がありますが、常に人々がハッカーのように感じさせます。
3.phantomjsは、各ページの完全で独立したプロセスをクロールする必要があります。これがそうでない場合、各ページ間でCookieを分離することは不可能であるためです。同じPhantomJSプロセスを使用している場合、ログインしたページのセッションは別のページに送信されます。
4. Phantomjsを使用してリソースをダウンロードできません - PNGまたはPDFとしてのみページを保存できます。これは便利ですが、PDFをダウンロードするためにリクエスト()に頼る必要があることを意味します。
5。上記の理由により、PhantomjsセッションからCookieをRequest()セッションライブラリに配布する方法を見つけなければなりません。 document.cookie文字列を配布して解析し、リクエスト()のクッキージャーに注入するだけです。
6.ブラウザセッションに変数を注入するのは簡単ではありません。これを行うには、JavaScript関数を作成するために文字列を作成する必要があります。
コードコピーは次のとおりです。
robot.prototype.add_page_data = function(page、name、data){
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);
コンソール= window.frames [0] .console;
}
8.一部のWebサイトには、Console.log()などのコードが常に入力されており、再定義して必要な場所に出力する必要があります。これを達成するために、私はこれをしました:
コードコピーは次のとおりです。
if(!console.log){
var iframe = document.createelement( "iframe");
document.body.appendChild(iframe);
コンソール= window.frames [0] .console;
}
9。Aタグをクリックしたことをブラウザに伝えるのは簡単ではありません。これらのことを達成するために、次のコードを追加しました。
コードコピーは次のとおりです。
var clickElement = window.clickelement = function(id){
var a = document.getElementById(id);
var e = document.createevent( "mousevents");
E.InitMouseEvent( "Click"、true、true、window、0、0、0、0、false、false、false、false、0、null);
a.dispatchevent(e);
};
10。また、サーバーを爆発しないようにするために、ブラウザセッションの最大並行性を制限する必要があります。それでも、この制限は、高価な商業ソリューションが提供できるものよりもはるかに高くなっています。 (翻訳者のメモ:つまり、商用ソリューションの並行性は、このソリューションの同時性よりも大きい)
すべての作業の後、私はPhantomJS +リクエストのための比較的適切なクローラーソリューションを持っています。 Request()リクエストに戻る前に、Phantomjsでログインする必要があります。 Phantomjsに設定されたCookieを使用して、ログインセッションを確認します。 Request()のStreamを使用してPDFファイルをダウンロードできるため、これは大きな勝利です。
計画全体は、Web開発者がJQueryおよびCSSセレクターを使用して、さまざまなWebサイトのクローラーを作成する方法を比較的簡単にすることです。私はこのアイデアが実行可能であることを成功裏に証明していませんが、すぐに起こると思います。