IE ブラウザーを使用して Web から大量のデータをマイニングしたいと考えています。ただし、WatiN を介して IE のインスタンスを大量に生成すると、システムがクラッシュします。これを行うより良い方法はありますか?単純にできるわけではないことに注意してくださいWebRequests
。サイトで JS 駆動の動作を操作する必要があるため、ブラウザーが本当に必要です。
4 に答える
私はWatiNでたくさんのページをマイニングしています。この時点で実は30以上。もちろん、多くのリソース (約 2.5 GB の RAM) を必要としますが、同じことを で行うことはほとんど不可能ですWebRequest
。妥当な時間内にそのようなことをする自分を想像することはできません。WatiN を使用すると、数時間かかります。
役立つかどうかはわかりませんが、私はそれを行うために webbrowser コントロールを使用しています。すべてのインスタンスは個別のプロセスです。しかし、あなたにとってもっと重要だと思うのは、すべてを単一のプロセスで実行することで、使用されるメモリの量を減らすことを一度試みたことです。AppDomain
新しいアプリ ドメインごとに同じ dll を個別にロードする代わりに、プロセスの代わりに別の を作成し、それらに同じ dll (特に Microsoft.mshtml.dll) を使用させることができます。今はその方法を思い出せませんが、グーグルで検索するのは難しくありません。私が覚えているのは、すべてが正常に機能し、RAM の使用量が大幅に減少したことです。試してみる価値があると思います。
最良の方法は、Web ブラウザーのインスタンスごとに 1 つのプロセスを実際に作成することです。これは、Web ブラウザーがマネージ コードではなく、その COM であり、マネージ コードでアンマネージ例外を処理できない場合があり、アプリケーションが確実にクラッシュするためです。 .
より良い方法は、複数のプロセスを生成するプロセス ホストを作成することです。必要に応じて、名前付きパイプ、ソケット、または WCF を使用して各プロセス間で通信できます。
最良の方法は、小さな SQL Embedded データベースを作成し、ジョブをキューに入れることです。マイニング プロセスは新しいリクエストをフェッチし、リクエストをデータベースにポストし、このデータベースを使用してすべてを同期できます。
データ マイニング ジョブを非同期的に処理するために、.NET アプリで WebBrowser コントロール (とにかく IE です) の複数のインスタンスを起動するのはどうですか?
パフォーマンスに問題がある場合は、ジョブを分割してクラウドにプッシュすることも役立つ場合があります。
私は、長期にわたって 4,500 万件のリクエスト (フォームの送信を含む) をスクレイピングするプロジェクトを持っていました。持続的に、私は約 20 の同時クライアントでスクレイピングを行っていましたが、私のパイプがボトルネックでした。
独自の WebClient である WaTiN/WaTiR を作成し、Microsoft の UI Automation API を使用して実験した後、Selinium Remote-Controlを使用しました。
Selenium RC では、ブラウザを選択できます。Firefox を使用しました。最初のスクレイピング スクリプトの設定には、約 1 時間の実験と調整が必要でした。Selenium は、自分でコードを作成するよりもはるかに高速であり、少ない投資ではるかに堅牢でした。素晴らしいツールです。
プロセスを拡張するために、いくつかの異なるアプローチを試しましたが、最終的に最も効果的だったのは、各 SRC インスタンスを独自の簡素化された VM に固定し、ワークステーションがサポートする RAM と同じ数の VM を生成することでした。VM の代わりにホストでネイティブに実行されている同数の SRC インスタンスは、最大 10 個のインスタンスを取得したため、必然的に停止しました。これには、スクレイピングを実行する前に、より多くのオーバーヘッドとセットアップ時間が必要でしたが、何日も途切れることなく強力に実行されました.
もう1つの考慮事項-Firefoxの設定を調整して、ホームページが読み込まれないようにし、不要なものをすべてオフにします(スプーフィングチェック、スクレイプに不要な場合はCookie、画像、adblock、flashblockなど)。