2013-02-04 85 views
1

我試圖使用機械化從網頁獲取信息。它基本上取得了第一批信息的成功,但該網頁包含一個「Next」按鈕以獲取更多信息。我無法弄清楚如何以編程方式獲取附加信息。Python機械化阻止連接:關閉

通過使用Live HTTP Headers,我可以看到當我單擊瀏覽器中的下一個按鈕時生成的http請求。看起來好像我可以使用機械化發出相同的請求,但在後一種情況下,我沒有獲取下一頁,而是重定向到網站的主頁。

很明顯,機械化正在做一些不同於我的瀏覽器的東西,但我無法弄清楚什麼。在比較了頭,我沒有找到一個差異,這是瀏覽器中使用

連接:保持活躍

而機械化使用

連接:關閉

我不知道這是罪魁禍首,但是當我試圖添加標題('Connection','keep-alive')時,它沒有改變任何東西。

[UPDATE] 當我點擊按鈕Firefox內「2頁」,則生成的HTTP(根據活HTTP頭):

GET /statistics/movies/ww_load/the-fast-and-the-furious-6-2012?authenticity_token=ItU38334Qxh%2FRUW%2BhKoWk2qsPLwYKDfiNRoSuifo4ns%3D&facebook_fans_page=2&tbl=facebook_fans&authenticity_token=ItU38334Qxh%2FRUW%2BhKoWk2qsPLwYKDfiNRoSuifo4ns%3D HTTP/1.1 
Host: www.boxoffice.com 
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:18.0) Gecko/20100101 Firefox/18.0 
Accept: text/javascript, text/html, application/xml, text/xml, */* 
Accept-Language: en-US,en;q=0.5 
Accept-Encoding: gzip, deflate 
X-Requested-With: XMLHttpRequest 
X-Prototype-Version: 1.6.0.3 
Referer: http://www.boxoffice.com/statistics/movies/the-fast-and-the-furious-6-2012 
Cookie: __utma=179025207.1680379428.1359475480.1360001752.1360005948.13; __utmz=179025207.1359475480.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __qca=P0-668235205-1359475480409; zip=13421; country_code=US; _boxoffice_session=2202c6a47fc5eb92cd0ba57ef6fbd2c8; __utmc=179025207; user_credentials=d3adbc6ecf16c038fcbff11779ad16f528db8ebd470befeba69c38b8a107c38e9003c7977e32c28bfe3955909ddbf4034b9cc396dac4615a719eb47f49cc9eac%3A%3A15212; __utmb=179025207.2.10.1360005948 
Connection: keep-alive 

當我嘗試請求機械化內相同的URL ,它看起來像這樣:

GET /statistics/movies/ww_load/the-fast-and-the-furious-6-2012?facebook_fans_page=2&tbl=facebook_fans&authenticity_token=ZYcZzBHD3JPlupj%2F%2FYf4dQ42Kx9ZBW1gDCBuJ0xX8X4%3D HTTP/1.1 
Accept-Encoding: identity 
Host: www.boxoffice.com 
Accept: text/javascript, text/html, application/xml, text/xml, */* 
Keep-Alive: 115 
Connection: close 
Cookie: _boxoffice_session=ced53a0ca10caa9757fd56cd89f9983e; country_code=US; zip=13421; user_credentials=d3adbc6ecf16c038fcbff11779ad16f528db8ebd470befeba69c38b8a107c38e9003c7977e32c28bfe3955909ddbf4034b9cc396dac4615a719eb47f49cc9eac%3A%3A15212 
Referer: http://www.boxoffice.com/statistics/movies/the-fast-and-the-furious-6-2012 
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 

- 達里爾

+0

如果這是個問題,那將會很奇怪。 「連接」標題只是表示服務器是否應該保持連接打開以發送另一個網頁。這裏瀏覽器正在請求連接保持打開狀態,以便它可以下載圖像等,但是機械化不需要這樣做,因此它可以告訴服務器它已完成,並且在下次加載頁面時將請求新的連接。如果您可以對這兩個請求進行更完整的記錄,可能會有所幫助。 –

+0

謝謝,我已更新我的問題以包含更多信息。部分問題是「下一步」按鈕不僅僅是一個url,它是一個javascript調用,但最終javascript會導致一個http請求,所以看起來我應該能夠直接在機械化內發出這個請求。 –

+2

不發佈答案,因爲我只是猜測,但服務器可能正在檢查'X-Requested-With'和/或'X-Prototype-Version'。看看你是否可以複製機械化。 –

回答

1

服務器進行檢查X-Requested-With和/或X-Prototype-Version,所以將這兩個頭添加到機械化請求中修復了它。

+0

嗨達里爾 - 你應該在這裏發佈答案的實際內容,因爲評論可能隨時消失。答案中無需提供謝意。 –

+0

事實上,我編輯了答案給你一個例子,說明我們更喜歡在這裏寫下答案。你不必使用我的編輯;如果你想以不同的方式寫下它,請隨時自行改變它。 –

+0

@Daryl McCullough,我面臨同樣的問題。我已經添加了「X-Requested-With」和/或「X-Prototype-Version」,但沒有解決它。有什麼建議麼?? – 2016-01-27 10:17:28

0

也許有點晚了一個答案,但我通過添加_urllib2_forked.py的線固定這一

上線1098代表行:headers["Connection"] = "Close"

更改爲:

if not 'Connection' in headers: headers["Connection"] = "Close" 和確保你在你的腳本中設置標題,它會起作用。

Gr。 Squandor