2010-06-12 20 views
10

मैं urllib2 का urlopen फ़ंक्शन का उपयोग कर रहा हूं ताकि स्टैक ओवरफ़्लो एपीआई से JSON परिणाम प्राप्त करने और प्राप्त करने के लिए कार्य किया जा सके।कुछ साइट्स पर Urllib के urlopen तोड़ने (उदा। StackApps api): कचरा परिणाम

कोड मैं उपयोग कर रहा हूँ:

>>> import urllib2 
>>> conn = urllib2.urlopen("http://api.stackoverflow.com/0.8/users/") 
>>> conn.readline() 

परिणाम मैं हो रही है:

'\x1f\x8b\x08\x00\x00\x00\x00\x00\x04\x00\xed\xbd\x07`\x1cI\x96%&/m\xca{\x7fJ\... 

मैं काफी urllib के लिए नया हूँ, लेकिन इस परिणाम की तरह प्रतीत नहीं होता मैं होना चाहिए मैंने इसे अन्य स्थानों में आजमाया है और मुझे वह उम्मीद है जो मुझे उम्मीद है (ब्राउज़र के साथ पते पर जाने के समान ही मुझे देता है: एक JSON ऑब्जेक्ट)।

अन्य साइटों पर urlopen का उपयोग करना (उदा। "http://google.com") ठीक काम करता है, और मुझे वास्तविक HTML देता है। मैंने urllib का उपयोग करने का भी प्रयास किया है और यह वही परिणाम देता है।

मैं बहुत परेशान हूं, यह भी नहीं जानता कि इस समस्या को हल करने के लिए कहां देखना है। कोई विचार?

+1

धन्यवाद! इससे मुझे अपना खुद का एपीआई ऐप डीबग करने में मदद मिली :) – swanson

उत्तर

10

यह लगभग कुछ ऐसा लगता है जो आप अचार को खिला रहे हैं। हो सकता है कि उपयोगकर्ता-एजेंट स्ट्रिंग में कुछ हो या हेडर स्वीकार करता है जो urllib2 भेज रहा है, जो स्टैक ओवरव्लो जेएसओएन के अलावा कुछ और भेजने के लिए है।

सामग्री-प्रकार हेडर कहता है कि यह देखने के लिए conn.headers.headers पर एक बताना है।

और यह प्रश्न, Odd String Format Result from API Call, आपका उत्तर हो सकता है। असल में, आपको अपने परिणाम को gzip decompressor के माध्यम से चलाने पड़ सकते हैं।

इस कोड के साथ डबल की जाँच:

>>> req = urllib2.Request("http://api.stackoverflow.com/0.8/users/", 
          headers={'Accept-Encoding': 'gzip, identity'}) 
>>> conn = urllib2.urlopen(req) 
>>> val = conn.read() 
>>> conn.close() 
>>> val[0:25] 
'\x1f\x8b\x08\x00\x00\x00\x00\x00\x04\x00\xed\xbd\x07`\x1cI\x96%&/m\xca{\x7fJ' 

हाँ, आप निश्चित रूप से gzip इनकोडिंग डेटा वापस हो रही है।

चूंकि आपको पाइथन के समान संस्करण के साथ विभिन्न मशीनों पर अलग-अलग परिणाम मिल रहे हैं, और सामान्यतः ऐसा लगता है कि urllib2 एपीआई आपको gzip एन्कोडेड डेटा का अनुरोध करने के लिए कुछ विशेष करने की आवश्यकता होगी, मेरा अनुमान है कि आपके पास वहां कुछ जगह पारदर्शी प्रॉक्सी।

मैंने 200 9 में कोडेकॉन में ईएफएफ द्वारा एक प्रेजेंटेशन देखा। वे विभिन्न प्रकार की गंदे आईएसपी चालों को खोजने के लिए एंड-टू-एंड कनेक्टिविटी परीक्षण कर रहे थे। इस परीक्षण के दौरान खोजी गई चीज़ों में से एक यह है कि उपभोक्ता स्तर की एक आश्चर्यजनक संख्या एनएटी राउटर यादृच्छिक HTTP शीर्षलेख जोड़ती है या पारदर्शी प्रॉक्सी कर रही है। आपके कनेक्शन पर तेज़ लगने के लिए आपके पास अपने नेटवर्क पर कुछ टुकड़े हो सकते हैं जो Accept-Encoding शीर्षलेख जोड़ या संशोधित कर रहे हैं।

+0

हम्म, यह समझ में आता है। कोई विचार क्यों यह विभिन्न कंप्यूटरों पर अलग होगा (पायथन के समान संस्करण को चला रहा है)? –

+1

@ एडन माओर: मुझे कोई जानकारी नहीं है। यह मेरे लिए अजीब लगता है। – Omnifarious

+0

हां, मैंने अभी अपने सिस्टम पर जांच की है और यह निश्चित रूप से समस्या थी (मैंने http://diveintopython.org/http_web_services/gzip_compression.html पर खोजने और असम्पीडित करने के लिए मार्गदर्शिका का उपयोग किया था)। अभी भी कोई जानकारी नहीं है कि यह मेरे लिए क्यों होता है, क्योंकि यह यहां अन्य डेवलपर्स के लिए ठीक काम करता है, और स्पष्ट रूप से रैपर के लेखक के लिए भी ठीक काम करता है। –