urllib2 не получает весь HTTP-ответ - PullRequest
12 голосов
/ 01 декабря 2009

Я озадачен, почему не могу загрузить все содержимое некоторых ответов JSON из FriendFeed , используя 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?

Ответы [ 4 ]

18 голосов
/ 01 декабря 2009

Лучший способ получить все данные:

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), но я не могу найти это.

4 голосов
/ 24 ноября 2010

Используйте 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

Сайт работает для меня постоянно, поэтому я не могу привести примеры обнаружения сбоев:)

2 голосов
/ 01 декабря 2009

Продолжайте вызывать stream.read (), пока это не будет сделано ...

while data = stream.read() :
    ... do stuff with data
0 голосов
/ 01 декабря 2009
readlines() 

также работает

...