Взлом Urloib urlopen на некоторых сайтах (например, StackApps API): возвращает результаты мусора

Я использую urllib2"s urlopen функция, чтобы попытаться получить результат JSON из API Stackru.

Код, который я использую:

>>> import urllib2
>>> conn = urllib2.urlopen("http://api.stackru.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 ответ

Решение

Это почти похоже на то, что вы будете кормить, чтобы мариновать. Возможно, что-то в строке User-Agent или заголовке Accepts, которое отправляет urllib2, заставляет Stackru отправлять что-то отличное от JSON.

Одно контрольное сообщение - это посмотреть на conn.headers.headers чтобы увидеть, что говорит заголовок Content-Type.

И на этот вопрос, Результат нечетного формата строки из API Call, может быть ваш ответ. По сути, вам, возможно, придется прогнать свой результат через декомпрессор gzip.

Двойная проверка с этим кодом:

>>> req = urllib2.Request("http://api.stackru.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 заголовок для того, чтобы ваше соединение казалось быстрее.

Другие вопросы по тегам