好的,这让我疯了。
我试图使用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。想法?
答案 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