0

我拥有的用于解析网站的部分代码不起作用。

我可以将问题追溯到.read我的 urllib2.urlopen 对象的功能。

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

直到昨天,这还不错;但是现在数据的长度始终是 69496 而不是 122989,但是当我打开较小的页面时,我的代码可以正常工作。

我已经在 Ubuntu、Linux Mint 和 windows 7 上对此进行了测试。它们都有相同的行为。

我假设 Web 服务器上发生了一些变化;但是当我使用网络浏览器时页面是完整的。我试图用wireshark诊断问题,但页面被完整接收。

有人知道为什么会发生这种情况,或者我可以尝试确定问题吗?

4

2 回答 2

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)

正如 Nathan 建议的那样,您还可以使用出色的Requests库,它默认接受 gzip。

import requests

data = requests.get('http://magiccards.info/us/en.html').text
于 2012-10-24T15:51:00.587 回答
0

是的,服务器正在关闭连接,您需要keep-alive被发送。urllib2 没有那个功能(:-()。曾经有一个urlgrabber,你可以使用它有一个与 urllib2 开启器一起工作的 HTTPHandler。但不幸的是,我发现它也不起作用。目前,你可能是其他库,像其他答案或httplib2中所示的请求。

import httplib2
h = httplib2.Http(".cache")
resp, content = h.request("http://magiccards.info/us/en.html", "GET")
print len(content)
于 2012-10-24T16:00:02.593 回答