質問
FriendFeed から一部のJSON応答のコンテンツ全体をダウンロードできない理由がわからない urllib2 を使用します。
>>> 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で完全な応答を取得するにはどうすればよいですか?
解決
すべてのデータを取得する最良の方法:
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
かもしれません)が見つかりません。
他のヒント
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
サイトは一貫して機能しているので、失敗を見つける例を挙げることはできません:)
終了するまでstream.read()を呼び出し続ける...
while data = stream.read() :
... do stuff with data
readlines()
も動作します
所属していません StackOverflow