2013-05-17 92 views
12

我正在學習使用Python Selenium和BeautifulSoup進行網頁抓取。目前,我正試圖在Google搜索趨勢上搜索熱門搜索http://www.google.com/trends/hottrends#pn=p5硒下載完整的HTML頁面

這是我當前的代碼。但是,我意識到完整的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 
+0

通過selenium爲此使用webdrivers的任何具體原因? – Torxed

+0

@Torxed - 我懷疑這是因爲動態內容/ JavaScript處理... – root

+0

是的,我試過urllib2,但它沒有工作,由於動態內容/ javascript – user2392965

回答

5

用戶通過點擊<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 
+0

感謝您的答案的好時機。然而,問題在於我甚至沒有從第一頁獲得所有結果,例如即使在初始屏幕上有六個,我也只能得到三條記錄。順便說一句,有沒有一種方法來自動滾動下來,而不是硬編碼日期星期五,2013年2月15日?謝謝。 – user2392965

+1

而不是time.sleep我會看看selenium.webdriver.support.ui.WebDriverWait http://stackoverflow.com/questions/9823272/python-selenium-waiting-for-frame-element-lookups – qwwqwwq

+0

我編輯我的答案解釋爲什麼當屏幕上出現更多信息時,您只能獲得一些結果。 –