تحطيم Urlopen Urlopen في بعض المواقع (على سبيل المثال stackapps API): إرجاع نتائج القمامة
سؤال
أنا استخدم urllib2
'س urlopen
وظيفة لمحاولة الحصول على نتيجة JSON من API Stackoverflow.
الرمز الذي أستخدمه:
>>> 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
ويعطي نفس النتيجة.
أنا عالق جدًا ، ولا حتى معرفة أين أتطلع إلى حل هذه المشكلة. أيه أفكار؟
المحلول
هذا يبدو وكأنه شيء سوف تتغذى على المخلل. ربما يكون هناك شيء ما في سلسلة وكيل المستخدم أو رأسه الذي يرسله urllib2 هو التسبب في إرسال StackOverflow لشيء آخر غير JSON.
واحد telltale هو أن ننظر إلى conn.headers.headers
لمعرفة ما يقوله رأس المحتوى.
وهذا السؤال ، نتيجة تنسيق السلسلة الفردية من استدعاء API, ، قد يكون لديك إجابتك. في الأساس ، قد تضطر إلى تشغيل نتيجتك من خلال فك ضغط GZIP.
التحقق المزدوج مع هذا الرمز:
>>> 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.
نظرًا لأنه يبدو أنك تحصل على نتائج مختلفة على أجهزة مختلفة مع نفس الإصدار من Python ، وبشكل عام ، يبدو أن API urllib2 سيتطلب منك القيام بشيء خاص لطلب بيانات GZIP المشفرة ، وأظن أن لديك وكيل شفاف هناك مكان ما.
لقد رأيت عرضًا تقديميًا من قبل EFF في برنامج Codecon في عام 2009. كانوا يقومون باختبار اتصال شامل لاكتشاف حيل ISP القذرة من أنواع مختلفة. أحد الأشياء التي اكتشفوها أثناء إجراء هذا الاختبار هو أن عددًا مفاجئًا من أجهزة توجيه NAT على مستوى المستهلك يضيفون رؤوس HTTP عشوائية أو القيام بالوكالة الشفافة. قد يكون لديك بعض المعدات على شبكتك التي تضيف أو تعديل Accept-Encoding
رأس لجعل اتصالك يبدو أسرع.