web-dev-qa-db-ja.com

SeleniumでWebドライバーを確実に実行するにはどうすればよいですか?

私はこれをソースごとに数十万の用語と潜在的に数百万のページに対して確実に機能させ、結果として得られたデータを自動化された方法でデータベースにETLするのにかなりの時間を費やしてきました。 Mesosでタスクを繰り返し実行する必要があります。必要な言語はScala/Javaです。

取得するには、JavaScriptを解析し、ajaxからデータをレンダリングし、Cookieを追跡する必要があります。サイトをこするためなど。私もこれを行うためにオープンソースのツールに取り組んでいます。私はこのタスクのためにSeleniumを取り巻く非常にシンプルなAPIを発見し、作成しました。このツールは、Webドライバー用のプラグアンドプレイです。

ただし、クロールはかなり分離されていて、互いに取り除かれているにもかかわらず常にハングするという問題に常に直面しています(キャッシュの場所を指定し、キャッシュサイズを最小化し、イメージをダウンロードしないなど)。

エラーの範囲は、phantomjsがクリーンアップエラーを返し、VisualVMによるメモリ不足が発生していないにもかかわらず、Chrome Driverで一般的なハングに失敗することです。実際、メモリの最大使用量は25%であり、 3〜5個の個別の子プロセスを使用して、CPU使用率が50%になる。

コンテナで各用語を実行する必要がありますか?数週間または数か月にわたってWebドライバーの信頼性を高める方法は?同様に一般的な代替手段はありますか?

4
user3916597

これは最も満足できるタイプの回答ではないかもしれませんが、実際には、数十万ページをフェッチしながら数週間または数か月間継続して実行されることを期待してWebブラウザーが構築およびテストされていません。

ブラウザー開発者はもちろん、長いブラウジングセッション中にソフトウェアを確実に機能させるために最善を尽くしますが、極端なユースケースでのみ発生する問題は、最高レベルの注意を引くことはほとんどありません。

したがって、まず最初に、定期的にブラウザプロセスをリサイクルしてください。数千ページごとにフェッチした後は、良い出発点になるかもしれません。

2番目に重要なことは、さまざまな種類のブラウザを試すことです。おそらく、Chrome/Chromium/PhantomJSは、現在のところ、ユースケースで最も安定したブラウザタイプではありません。 (執筆時点では、PhantomJSは現在活発に開発されていません。)Seleniumを使用する大きな利点は、さまざまな種類のブラウザーがサポートされていることです。 Firefoxを試して、パフォーマンスが向上するかどうかを確認してください。または、プラットフォームでサポートされている場合は、EdgeまたはSafariを試してください。

第3に、予期しない状況がリソースをあまり消費しない方法で処理されることを確認してください。たとえば、スクレイピング中にPDF=ファイル、ダウンロード可能なドキュメントなど)へのリンクが見つかった場合、またはポップアップウィンドウ、新しいタブまたはダイアログボックスが開いた場合。一部のWebサイトは、印刷ダイアログを開きます。

1
Otto G

ほとんどのWebサイトでは、ブラウザー全体と自動化フレームワークを立ち上げてそれらをこすり取る必要はありません。そうすることで、必要のない多くの機械を整理し、システム全体の信頼性を低下させる多くの複雑さをもたらします。

より軽量で信頼性の高いスクレーパーを作成する方法の例については、Jauntをご覧ください。 http://jaunt-api.com/

0
Robert Harvey