Urlopen Urllib на некоторых сайтах (например, API Stackapps): возвращает результаты мусора
Вопрос
я использую 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
заголовок, чтобы сделать ваше соединение, кажется быстрее.