2009-12-01 7 views
12

ben urllib2 kullanarak FriendFeed bazı JSON yanıtları tüm içeriğini indirmek mümkün değilim neden olarak çapraşık değilim.tüm HTTP yanıt alınırken değil 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' 

Tam yanıtı urllib2 ile nasıl alabilirim?

+1

Sitesi en örnekler veremem benim için sürekli çalışan sitenin kırık. Bir tarayıcıda deneyin. –

+0

Ubuntu 9.04'te Firefox 3.0 ile bu URL'ye girerken yanıtın 165K'ını aldım. Elde edilen JSON belgesi tarayıcımda iyi oluşturuldu. – gotgenes

+3

Evet, site bozuk. Ancak bu, diğer araçlar (curl, wget) eksik yanıtı bildirdiği için, hem urllib hem de urllib2'de bir hatadır. Python kütüphanelerinde neyin yanlış olduğunu bilmek güzel olurdu. tarayıcımla veya kıvrılma ile alınırken –

cevap

18

En şekilde çalışır

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

Bu örnekte, http://friendfeed.com/api/room/the-life-scientists/profile?format=json adresinde verilen örnek URL ile çalışmak için bulamadım. Yanıt hala eksik. John Weldon'dan bahsettiğim gibi, 'read()' işlevini yalnızca boş dizelere geri döndürün ve read() 'aramaları kapsamlı görünüyor. – gotgenes

+0

Sadece tarayıcımda 51.21 KB (52441 bayt) alıyorum. Site bozuldu. wget tam sayfa döndürür rağmen –

+0

Ayrıca http://www.nylonmag.com/modules/magsection/article/uploaded_images/5463_head_minnie%20big.jpg için çalışmaz ve Firefox jpg görüntüleyebilir. – dfrankow

2

da tüm verileri almak için

+2

'boşluklarına sağlam ama urllib2.urlopen olup. . Benim için değil ... – gotgenes

+0

boş bir dize döndürür ve boş bir dize false döndürür 'veri = '' .join (stream.readlines());. baskı len (veri); print (data [-40:]) 'aynı sonuçları verir –

0
readlines() 

Tut yükleme bitene kadar) (stream.Read çağıran ...:

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 

The Bunun nedeni, .read()'un, soketlerin doğası göz önüne alındığında, tüm yanıtı döndürmesi garanti edilmemesidir. Bunun dokümantasyonda (belki urllib) ele alındığını düşündüm ama bulamıyorum. Gerçek ağ etkileşimleri izlemek için

+1

buna tekrarlayın çağrılar evet – gotgenes

+0

stream.readlines() tüm satırların bir listesini döndürür.Ama aynı zamanda urllib2 modülünü kullandığınızı da farkettim. Daha uzun süredir kullanıyorum ve urllib modülden stream.readlines() yöntemini iki kez kontrol ettim le ve düzgün çalışıyor – inspectorG4dget

4

kullanın tcpdump (veya bunun gibi bir şey) - site bazı istemci kütüphaneleri için bozuldu neden o zaman analiz edebilirsiniz. Eğer testi komut dosyası birden çok kez tekrar emin olun, böylece sorun tutarlı olup olmadığını görebilirsiniz:

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 

yüzden bulma arızaları :)