2012-07-12 58 views
8

我正在學習製作網頁抓取工具,並希望抓取TripAdvisor的個人項目,並使用urllib2抓取html。 但是,我遇到了一個問題,使用下面的代碼,我得到的html不正確,因爲頁面似乎需要一秒鐘重定向(您可以通過訪問url來驗證) - 取而代之的是,代碼來自最初短暫出現的頁面。python urllib2 - 等待頁面在抓取前完成加載/重定向?

是否有一些行爲或參數要設置,以確保頁面在獲取網站內容之前完全加載/重定向?

import urllib2 
from bs4 import BeautifulSoup 

bostonPage = urllib2.urlopen("http://www.tripadvisor.com/HACSearch?geo=34438#02,1342106684473,rad:S0,sponsors:ABEST_WESTERN,style:Szff_6") 
soup = BeautifulSoup(bostonPage) 
print soup.prettify() 

編輯:答案是徹底的,但是,在什麼解決我的問題是這樣的結尾: https://stackoverflow.com/a/3210737/1157283

+0

犯規的urllib引發錯誤?有這種情況下的redirectdirector ... – 2012-07-12 20:50:54

+0

@DonQuestion沒有錯誤,我只是從被重定向之前短暫出現的頁面獲取html。我想從最後出現的頁面獲得html。這個redirectdirector是什麼,你可以詳細說明一下嗎? – Ken 2012-07-12 20:55:26

+0

如果你使用urlopen,你正在使用OpenerDirector.open()看​​看python-docs - 不幸的是它沒有在2-3個字中解釋:-(:http://docs.python.org/library/urllib2.html? highlight = urllib2#urllib2.OpenerDirector – 2012-07-12 21:08:53

回答

5

Inreresting問題是不是一個重定向是網頁修改使用JavaScript的內容,但urllib2沒有JS引擎,它只是GETS數據,如果您在您的瀏覽器禁用了JavaScript,你會注意到它基本上加載同樣內容的urllib2回報

import urllib2 
from BeautifulSoup import BeautifulSoup 

bostonPage = urllib2.urlopen("http://www.tripadvisor.com/HACSearch?geo=34438#02,1342106684473,rad:S0,sponsors:ABEST_WESTERN,style:Szff_6") 
soup = BeautifulSoup(bostonPage) 
open('test.html', 'w').write(soup.read()) 

test.html並在瀏覽器中禁用JS,在Firefox中最容易 - >取消選中啓用JavaScript,生成相同的結果集。

因此,我們有什麼可以做的很好,我們首先應該檢查是否該網站提供的API,報廢趨於皺眉了 http://www.tripadvisor.com/help/what_type_of_tripadvisor_content_is_available

Travel/Hotel API's? 看起來搞不好,雖然有一些限制。

但是如果我們仍然需要刮掉它,用JS,那麼我們可以使用它主要用於測試的seleniumhttp://seleniumhq.org/,但它的易用性和相當好的文檔。

我也發現了這個Scraping websites with Javascript enabled?http://grep.codeconsult.ch/2007/02/24/crowbar-scrape-javascript-generated-pages-via-gecko-and-rest/

希望幫助。

補充說明:

>>> import urllib2 
>>> from bs4 import BeautifulSoup 
>>> 
>>> bostonPage = urllib2.urlopen("http://www.tripadvisor.com/HACSearch?geo=34438#02,1342106684473,rad:S0,sponsors:ABEST_WESTERN,style:Szff_6") 
>>> value = bostonPage.read() 
>>> soup = BeautifulSoup(value) 
>>> open('test.html', 'w').write(value) 
+0

感謝您的回答,讓我試着重申一下:所以當您點擊「豪華」或「家庭」等不同類別時,您在頁面上看到的更改僅通過javascript?(即頁面的代碼永遠不會改變?)我需要做的是找到一個工具來運行JS,然後返回這些內容?什麼是最簡單/最好的建議?我覺得api是 – Ken 2012-07-12 21:16:49

+0

selenium可能是實現這一目標的最佳方式,它使用實際的瀏覽器,儘管它是全自動的,但是因爲它需要一個至少安裝了虛擬幀緩衝區或瀏覽器的瀏覽器桌面環境,因爲它會調用一個... – 2012-07-12 21:26:51