2012-10-24 72 views
0

我擁有的將解析網站的部分代碼不起作用。urllib2不會讀取整個頁面

我可以將問題追溯到我的urllib2.urlopen對象的.read函數。

page = urllib2.urlopen('http://magiccards.info/us/en.html') 
data = page.read() 

直到昨天,這工作得很好;但現在數據的長度始終是69496而不是122989,但是當我打開較小的頁面時,我的代碼工作正常。

我已經在Ubuntu,Linux Mint和Windows 7上測試過了。所有的行爲都一樣。

我假設在網絡服務器上發生了變化;但是當我使用網絡瀏覽器時該頁面已完成。我試圖用wireshark診斷這個問題,但是收到的頁面是完整的。

有人知道爲什麼會發生這種情況,或者我可以嘗試確定問題嗎?

+2

如果你認爲這與Web服務器做,你怎麼可以做任何事情 –

+1

這是我在py3k的urllib得到錯誤:?'HTTP。 client.IncompleteRead:IncompleteRead(69496 bytes read,53493 more expected)' – SilentGhost

+0

因爲Web瀏覽器仍然能夠顯示完整的頁面,我的代碼也需要能夠處理整個頁面 – kannerke

回答

4

除非您請求編碼爲gzip的內容,否則該頁似乎行爲不端。這給一個鏡頭:

import urllib2 
import zlib 

request = urllib2.Request('http://magiccards.info/us/en.html') 
request.add_header('Accept-Encoding', 'gzip') 
response = urllib2.urlopen(request) 
data = zlib.decompress(response.read(), 16 + zlib.MAX_WBITS) 

彌敦道建議,你也可以使用大Requests庫,默認情況下接受的gzip。

import requests 

data = requests.get('http://magiccards.info/us/en.html').text 
+0

這可能是'keep-活着「與此無關在所有。我需要用Wireshark進行調查。 –

+0

是的,可以。捲曲支持保持活躍並且似乎具有相同的問題。 – Solon

+0

curl具有相同的問題,但是如果您傳遞'--compressed'選項,它將起作用。這絕對是一個服務器問題。 –

0

是的,服務器正在關閉連接,您需要發送keep-alive。 urllib2沒有這個功能(:-()。使用的是urlgrabber,你可以使用一個HTTPHandler,它可以和urllib2 opener一起工作,但不幸的是,我沒有發現這個工作,此刻,你可能是其他庫,像如證明對方的回答或請求httplib2

import httplib2 
h = httplib2.Http(".cache") 
resp, content = h.request("http://magiccards.info/us/en.html", "GET") 
print len(content)