1

OK、これは私を夢中にさせています。

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 の長さ。~70k の長さの iPython として実行される Python 2.7.1、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がHTTP応答全体を取得していません

于 2012-06-05T01:48:06.937 に答える