15

Web スクレイピングに Python Selenium と BeautifulSoup を使用する方法を学んでいます。現在、Google の検索トレンドhttp://www.google.com/trends/hottrends#pn=p5でホットな検索をスクレイピングしようとしています。

これが私の現在のコードです。ただし、完全な html がダウンロードされておらず、最近のいくつかの日付のコンテンツしかないことに気付きました。この問題を修正するにはどうすればよいですか?

from selenium import webdriver
from bs4 import BeautifulSoup

googleURL = "http://www.google.com/trends/hottrends#pn=p5"

browser = webdriver.Firefox()
browser.get(googleURL)
content = browser.page_source

soup = BeautifulSoup(content)
print soup
4

1 に答える 1

9

<div onclick="control.moreData()" id="moreLink">More...</div>ユーザーは、ページの下部にある要素をクリックして、(以前の日付から) ページにさらにコンテンツを追加します。

したがって、目的のコンテンツを取得するには、Selenium を使用してid="moreLink"要素をクリックするか、JavaScript を実行control.moreData();してループ内で呼び出すことができます。

たとえば、2013 年 2 月 15 日金曜日までさかのぼってすべてのコンテンツを取得する場合 (この形式の文字列は、読み込まれたコンテンツのすべての日付に存在するように見えます)、Python は次のようになります。

content = browser.page_source
desired_content_is_loaded = false;
while (desired_content_is_loaded == false):
     if not "Friday, February 15, 2013" in content:
          sel.run_script("control.moreData();")
          content = browser.page_source
     else:
          desired_content_is_loaded = true;

編集:

ブラウザで JavaScript を無効にしてページをリロードすると、「トレンド」コンテンツがまったくないことがわかります。つまり、これらのアイテムは動的にロードされるということです。つまり、ページを開いたときにダウンロードされる HTML ドキュメントの一部ではありません。Selenium の .get() は、HTML ドキュメントが読み込まれるのを待ちますが、すべての JS が完了するのを待ちません。非同期 JS が他のイベントの前または後に完了するかどうかはわかりません。準備ができたら完了し、毎回異なる可能性があります。これは、呼び出し時にそのコンテンツのすべて、一部、またはまったく取得できない場合がある理由を説明しています。browser.page_sourceこれは、非同期 JS がその時点でどれだけ高速に動作しているかに依存するためです。

そのため、ページを開いた後、ソースを取得する前に数秒待ってみてください。これにより、コンテンツをロードする JS が完了するまで時間がかかります。

browser.get(googleURL)
time.sleep(3)
content = browser.page_source
于 2013-05-17T23:13:58.897 に答える