2012-10-24 37 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)