Urlopen Urllib на некоторых сайтах (например, API Stackapps): возвращает результаты мусора

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

Вопрос

я использую urllib2С. urlopen Функция, чтобы попытаться получить json Result из 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\...

Я довольно новичок в Урлиби, но это не похоже на результат, который я должен получить. Я попробовал это в других местах, и я получаю то, что я ожидаю (такой же, как посещение адреса с браузером, дает мне: объект JSON).

С использованием urlopen на других сайтах (например, »http://google.com.") работает нормально, и дает мне реальный HTML. Я также пытался использовать urllib И это дает тот же результат.

Я довольно застрял, даже не зная, где смотреть, чтобы решить эту проблему. Есть идеи?

Это было полезно?

Решение

Это почти выглядит как-то, что вы будете кормить соленье. Может быть, что-то в строке пользовательского агента или принимает заголовок, который отправляет Urllib2, вызывает PackoverFlow для отправки чего-то другого, кроме JSON.

Один Телтал - смотреть на 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 году. Они выполняли сквозное тестирование связей, чтобы обнаружить грязные уловки провайдеров различных видов. Одна из вещей, которые они обнаружили при этом тестирование, заключается в том, что удивительное количество маршрутизаторов NAT потребительского уровня добавляет случайные заголовки HTTP или прозрачные прокси. У вас может быть какой-то кусок оборудования в вашей сети, который добавляет или изменяет Accept-Encoding заголовок, чтобы сделать ваше соединение, кажется быстрее.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top