urllib2未获取完整HTTP响应

12 投票
4 回答
9298 浏览
提问于 2025-04-15 16:33

我很困惑,为什么我无法用 urllib2FriendFeed 下载到一些 JSON 响应的全部内容。

>>> import urllib2
>>> stream = urllib2.urlopen('http://friendfeed.com/api/room/the-life-scientists/profile?format=json')
>>> stream.headers['content-length']
'168928'
>>> data = stream.read()
>>> len(data)
61058
>>> # We can see here that I did not retrieve the full JSON
... # given that the stream doesn't end with a closing }
... 
>>> data[-40:]
'ce2-003048343a40","name":"Vincent Racani'

我该如何用 urllib2 获取完整的响应呢?

4 个回答

2

一直调用 stream.read(),直到它完成为止...

while data = stream.read() :
    ... do stuff with data
4

使用 tcpdump(或者类似的工具)来监控实际的网络交互,这样你就可以分析为什么某些客户端库会导致网站出现问题。确保通过编写脚本来多次重复测试,这样你就能看到问题是否一直存在:

import urllib2
url = 'http://friendfeed.com/api/room/friendfeed-feedback/profile?format=json'
stream = urllib2.urlopen(url)
expected = int(stream.headers['content-length'])
data = stream.read()
datalen = len(data)
print expected, datalen, expected == datalen

对我来说,这个网站一直都能正常工作,所以我不能提供找到故障的例子 :)

18

获取所有数据的最佳方法:

fp = urllib2.urlopen("http://www.example.com/index.cfm")

response = ""
while 1:
    data = fp.read()
    if not data:         # This might need to be    if data == "":   -- can't remember
        break
    response += data

print response

原因是,.read() 这个方法并不能保证一次性返回所有的响应数据,这和网络连接的特性有关。我记得在文档里(可能是 urllib 的文档)有提到过这个问题,但我找不到相关内容。

撰写回答