web-dev-qa-db-ja.com

WebスクレイピングのためのSeleniumとBeautifulSoupの比較

Pythonを使用してWebサイトからコンテンツを取得しています。最初にBeautifulSoupMechanizeをPythonで使用しましたが、JavaScriptを介してコンテンツを作成するボタンがWebサイトにあることがわかりましたので、Selenium

要素を見つけてSeleniumとdriver.find_element_by_xpath、Seleniumをすべてに使用できるのに、BeautifulSoupを使用する理由は何ですか?

そして、この特定のケースでは、JavaScriptボタンをクリックするためにSeleniumを使用する必要があるので、Seleniumを使用して解析するのも良いのですか、それともSeleniumとBeautiful Soupの両方を使用するのですか?

37
elie

質問に直接回答する前に、出発点として一言だけ言っておきましょう。静的HTMLページからコンテンツをプルするだけの場合は、おそらく Requests または組み込みのHTTPライブラリを使用する必要があります。 urllib.requestlxml または BeautifulSoup を使用しますが、Seleniumではありません(ただし、Seleniumでも十分でしょう)。 Seleniumを不必要に使用しないことの利点:

  • 帯域幅、およびスクリプトを実行する時間。 Seleniumを使用するということは、ブラウザでページにアクセスしたときに通常フェッチされるすべてのリソース(スタイルシート、スクリプト、画像など)をフェッチすることを意味します。これはおそらく不要です。
  • 安定性とエラー回復の容易さ。私の経験では、Seleniumは少し壊れやすい場合があります-PhantomJSを使用した場合でも-ハングしたSeleniumインスタンスを強制終了して新しいインスタンスを作成するアーキテクチャを作成することは、requests
  • 潜在的に、CPUとメモリの使用量-クロールするサイト、および並列で実行しようとしているスパイダースレッドの数に応じて、DOMレイアウトロジックまたはJavaScript実行のいずれかがかなり高価になる可能性があります。

機能するためにCookieを必要とするサイトがSeleniumを破壊する理由ではないことに注意してください。 cookielib / を使用して、魔法のようにHTTPリクエストでCookieを設定して送信するURLオープン関数を簡単に作成できます。 cookiejar

では、なぜSeleniumの使用を検討するのでしょうか。クロールしたいコンテンツがHTMLに焼き付けられるのではなく、JavaScriptを介してページに追加されている場合を処理するためにほぼ完全に。それでも、重い機械を壊すことなく、必要なデータを取得できる場合があります。通常、これらのシナリオの1つが適用されます。

  • ページで提供されるJavaScriptには、コンテンツが既に組み込まれています。 JavaScriptは、コンテンツをページに配置するテンプレートやその他のDOM操作を実行するためだけにあります。この場合、関心のあるコンテンツを正規表現を使用してJavaScriptから直接取り出す簡単な方法があるかどうかを確認することをお勧めします。
  • JavaScriptがコンテンツをロードするためにWeb APIにアクセスしています。この場合は、関連するAPI URLを識別して、自分でヒットできるかどうかを検討してください。これは、実際にJavaScriptを実行してWebページからコンテンツをスクレイピングするよりもはるかに単純で直接的かもしれません。

doSeleniumを使用して状況のメリットを判断した場合は、ヘッドレスモードで使用してください。これは、(少なくとも)FirefoxとChromeドライバー。Webスパイダーは通常、実際にページをグラフィカルにレンダリングしたり、ブラウザー固有の癖や機能を使用したりする必要がないため、ヘッドレスブラウザー-CPUとメモリのコストが低く、クラッシュやハングする可動部分が少ない-理想的です。

54
Mark Amery

Seleniumは、本格的なブラウザであっても、ヘッドレスChromeなどのヘッドレスモードのブラウザであっても、Webページの操作などに使用することをお勧めします。また、要素が見つかった場合やWHATが見つかった場合に依存するステートメントを観察および記述し、Seleniumを使用して、ユーザーが希望する場合はページでインタラクティブタスクを実行するには、美しいスープの方が適しているとも言います。

1
LiamººT