Python Urllib2只读取文档的一部分

时间:2012-06-05 01:19:48

标签: python urllib2 urllib

好的,这让我疯了。

我试图使用Python的Urllib2库从Crunchbase API中读取。相关代码:

api_url="http://api.crunchbase.com/v/1/financial-organization/venrock.js"
len(urllib2.urlopen(api_url).read())

结果是73493或69397.文档的实际长度要长得多。当我在另一台计算机上尝试此操作时,长度为44821或40725.我尝试使用Urllib更改用户代理,将超时时间增加到非常大的数量,并一次读取小块。总是一样的结果。

我认为这是一个服务器问题,但我的浏览器会读取整个内容。

Python 2.7.2,OS X 10.6.8,长度约为40k。 Python 2.7.1作为iPython运行,长度约为70k,OS X 10.7.3。想法?

2 个答案:

答案 0 :(得分:4)

该服务器有些怪异的东西。如果您像浏览器一样使用gzip编码请求文件,它可能会有效。这里有一些代码可以解决这个问题:

import urllib2, gzip

api_url='http://api.crunchbase.com/v/1/financial-organization/venrock.js'
req = urllib2.Request(api_url)
req.add_header('Accept-encoding', 'gzip')
resp = urllib2.urlopen(req)
data = resp.read()

>>> print len(data)
26610

问题是解压缩数据。

from StringIO import StringIO

if resp.info().get('Content-Encoding') == 'gzip':
    g = gzip.GzipFile(fileobj=StringIO(data))
    data = g.read()

>>> print len(data)
183159

答案 1 :(得分:2)

我不确定这是否是一个有效的答案,因为它完全是一个不同的模块,但是使用requests模块,我得到了~188k响应:

import requests

url = r'http://api.crunchbase.com/v/1/financial-organization/venrock.js'

r = requests.get(url)

print len(r.text)

>>>183159

因此,如果项目进展不晚,请在此处查看:http://docs.python-requests.org/en/latest/index.html

编辑:使用您提供的代码,我也得到{36}的len

快速搜索并找到了这个:urllib2 not retrieving entire HTTP response