1

好吧,这让我发疯了。

我正在尝试使用 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。想法?

4

2 回答 2

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
于 2012-06-05T02:03:05.767 回答
2

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

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

编辑:使用您提供的代码,我也得到了len~36k

快速搜索并发现:urllib2 not retrieving entire HTTP response

于 2012-06-05T01:48:06.937 回答