2013-07-30 40 views
6

由於某種原因,當我嘗試打開頁面http://questionablecontent.net時,我收到HTTP Error 403: Forbidden。我曾經得到一個robots.txt的錯誤,但是已經解決了。另外,我甚至找不到他們的robots.txt文件。爲什麼機械化拋出HTTP 403錯誤?

我仍然可以從chrome查看網頁,所以我想知道的是:即使設置了合適的標題,機械化看起來與chrome不同嗎?

這裏是我的代碼(不工作):

br = mechanize.Browser() 
cj = cookielib.LWPCookieJar() 
br.set_cookiejar(cj) 
br.set_handle_equiv(True) 
br.set_handle_redirect(True) 
br.set_handle_robots(False) 
br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1) 
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')] 

我也嘗試設置addheaders相同的標頭,我的瀏覽器(我發現here):

br.addheaders = [('User-agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.72 Safari/537.36')] 

。 ..但那也沒用。

最後,我嘗試使用Selenium並且工作,看到它在Chrome中加載頁面,然後與Python進行通信。但是,我仍然希望通過機械化來實現它。另外,我仍然不確定Chrome和機器的外觀與服務器的不同。

+0

你的問題真的幫助我,解決了我的問題!非常感謝您的支持 – Clement

回答

4

這個技巧可能是在selenium發送的請求標題中,除了用戶代理標題之外,一些服務器還檢查其他標題以確保真正的瀏覽器正在與它們交談。看看我的舊的答案之一:

urllib2.HTTPError: HTTP Error 403: Forbidden

在你的地方,我會嘗試將所有的真正的Chrome瀏覽器發送頭,然後消除不必要的。

+0

奇怪的是,我在不更改代碼的情況下停止了403錯誤。雖然我在他們的網站上使用了相同的代碼,但它曾經工作過,所以我會假設他們的結局正在發生變化。我已經去了,並添加額外的頭文件,以防萬一。 –

+0

爲了清楚起見,如果我發送了真正的Chrome瀏覽器發送的所有標題,它看起來就好像我的Chrome瀏覽器正在發送請求一樣嗎?還有其他事情嗎? –

+0

如果您發回所有收到的cookies以及真實瀏覽器發送的所有標頭,它看起來確實如此。唯一能夠改變的就是javascript。基於ajax的頁面通常在發送請求之前在客戶端進行一些數據/ cookie修改,並且可能很難「反向工程」並使用原始請求來模擬該行爲。在這種情況下,最好使用像selenium這樣的webdriver,或者使用PySide/PyQt的QtWebKit模塊從頭開始寫一個。 – andrean