2009-12-01 2 views
12

Я недоумеваю, почему я не могу загрузить все содержимое некоторых ответов JSON от FriendFeed, используя urllib2.urllib2 не извлекает весь HTTP-ответ

>>> 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?

+1

сайта сломана. Попробуйте в браузере. –

+0

Я получаю полный ответ 165 КБ при ударе по этому URL с Firefox 3.0 на Ubuntu 9.04. Полученный документ JSON хорошо сформирован в моем браузере. – gotgenes

+3

Да, сайт сломан. Но это, безусловно, ошибка как в «urllib», так и в «urllib2», поскольку другие инструменты (curl, wget) сообщают об неполном ответе. Было бы неплохо узнать, что не так в библиотеках python. –

ответ

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

+2

Я не мог заставить этот пример работать с примером URL, указанным в вопросе, http://friendfeed.com/api/room/the-life-scientists/profile?format=json. Ответ еще не завершен. Как я уже говорил Джону Уэлдону, повторные вызовы 'read()' возвращают только пустые строки, а 'read()' кажется исчерпывающим. – gotgenes

+0

Я только получаю 51.21 KB (52441 bytes) в моем браузере. Сайт сломан. –

+0

Также не работает для http://www.nylonmag.com/modules/magsection/article/uploaded_images/5463_head_minnie%20big.jpg, хотя wget возвращает полную страницу, а Firefox может отображать jpg. – dfrankow

2

Keep вызова stream.read(), пока это не сделано ...

while data = stream.read() : 
    ... do stuff with data 
+2

'read()' является исчерпывающим. Повторите вызовы, чтобы вернуть пустую строку. – gotgenes

+0

yes и пустая строка возвращает false ... –

0
readlines() 

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

+1

Это не для меня. Data = '. .join (stream.readlines()); print len ​​(data); print (data [-40:]) 'дает идентичные результаты. – gotgenes

+0

stream.readlines() возвращает список всех строк. Но я просто понял, что вы используете модуль urllib2. Мой ответ был основан на модуле urllib, который Я использовал дольше, и я просто дважды проверил stream.readlines() из модуля urllib le и он работает правильно – inspectorG4dget

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 

Сайт работает стабильно для меня, так что я не могу привести примеры находящих неудач :)

Смежные вопросы