12

urllib2を使用してFriendFeedから一部の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

4 に答える 4

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)、見つかりません。

于 2009-12-01T05:25:21.097 に答える
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

サイトは私のために一貫して機能しているので、失敗を見つける例をあげることはできません:)

于 2010-11-24T14:43:30.790 に答える
2

完了するまでstream.read()を呼び出し続けます...

while data = stream.read() :
    ... do stuff with data
于 2009-12-01T04:54:09.603 に答える
0
readlines() 

また動作します

于 2009-12-01T05:03:03.263 に答える