2009-12-01 10 views
12

मुझे परेशान है कि मैं urllib2 का उपयोग कर FriendFeed से कुछ JSON प्रतिक्रियाओं की संपूर्ण सामग्री को डाउनलोड करने में सक्षम क्यों नहीं हूं।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

उबंटू 9.04 पर फ़ायरफ़ॉक्स 3.0 के साथ उस यूआरएल को मारते समय मुझे प्रतिक्रिया का पूरा 165K मिलता है। जेएसओएन दस्तावेज़ पुनर्प्राप्त मेरे ब्राउज़र में अच्छी तरह से बनाया गया है। – gotgenes

+3

हां, साइट टूटी हुई है। लेकिन यह निश्चित रूप से 'urllib' और' urllib2 'दोनों में एक बग है, क्योंकि अन्य टूल्स (कर्ल, wget) रिपोर्ट अपूर्ण प्रतिक्रिया है। यह जानना अच्छा होगा कि पाइथन पुस्तकालयों में क्या गलत है। –

उत्तर

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

मुझे इस उदाहरण को प्रश्न में दिए गए उदाहरण यूआरएल के साथ काम करने के लिए नहीं मिला, http://friendfeed.com/api/room/the-life-scientists/profile?format=json। प्रतिक्रिया अभी भी अपूर्ण है। जैसा कि मैंने जॉन वेल्डन का उल्लेख किया है, 'पढ़ने()' को केवल खाली तारों को वापस करने के लिए कॉल दोहराएं, और 'पढ़ें()' संपूर्ण लगता है। – gotgenes

+0

मुझे अपने ब्राउज़र में केवल 51.21 केबी (52441 बाइट्स) मिलते हैं। साइट टूटी हुई है। –

+0

http://www.nylonmag.com/modules/magsection/article/uploaded_images/5463_head_minnie%20big.jpg के लिए भी काम नहीं करता है, हालांकि wget पूरा पृष्ठ देता है, और फ़ायरफ़ॉक्स jpg प्रदर्शित कर सकता है। – dfrankow

2

रखें stream.read बुला() जब तक यह किया है ...

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

'read()' संपूर्ण है। इसे दोबारा कॉल करने के लिए रिक्त स्ट्रिंग लौटें। – gotgenes

+0

हां, और एक खाली स्ट्रिंग झूठी रिटर्न देता है ... –

0
readlines() 

भी

+1

यह मेरे लिए नहीं है। 'Data =' '.join (stream.readlines()); प्रिंट लेन (डेटा); प्रिंट (डेटा [-40:]) 'समान परिणाम देता है। – gotgenes

+0

stream.readlines() सभी लाइनों की एक सूची देता है। लेकिन मुझे यह भी एहसास हुआ कि आप urllib2 मॉड्यूल का उपयोग कर रहे हैं। मेरा जवाब उस यूआरएलआईबी मॉड्यूल पर आधारित था जो कि मैं लंबे समय तक उपयोग कर रहा हूं और मैंने urllib modu से stream.readlines() को दो बार चेक किया है 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 

साइट की मेरे लिए लगातार काम तो मैं खोजने विफलताओं :)

संबंधित मुद्दे