تحطيم Urlopen Urlopen في بعض المواقع (على سبيل المثال stackapps API): إرجاع نتائج القمامة

StackOverflow https://stackoverflow.com/questions/3028426

سؤال

أنا استخدم urllib2urlopen وظيفة لمحاولة الحصول على نتيجة 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 رأس لجعل اتصالك يبدو أسرع.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top