Urlopen Breaking de Urllib em alguns sites (por exemplo, API de Stackapps): retorna resultados de lixo

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

Pergunta

estou a usar urllib2's urlopen Função para tentar obter um resultado JSON da API do Stackoverflow.

O código que estou usando:

>>> import urllib2
>>> conn = urllib2.urlopen("http://api.stackoverflow.com/0.8/users/")
>>> conn.readline()

O resultado que estou recebendo:

'\x1f\x8b\x08\x00\x00\x00\x00\x00\x04\x00\xed\xbd\x07`\x1cI\x96%&/m\xca{\x7fJ\...

Sou bastante novo no urllib, mas isso não parece o resultado que eu deveria estar recebendo. Eu tentei em outros lugares e recebo o que espero (o mesmo que visitar o endereço com um navegador me dá: um objeto JSON).

Usando urlopen em outros sites (por exemplo, "http://google.com") Funciona bem e me dá html real. Eu também tentei usar urllib E dá o mesmo resultado.

Estou muito preso, nem mesmo sabendo onde procurar resolver esse problema. Alguma ideia?

Foi útil?

Solução

Isso quase parece algo que você estaria alimentando para apodrecer. Talvez algo na sequência de agentes do usuário ou aceite o cabeçalho que o Urllib2 está enviando está fazendo com que o StackOverflow envie algo diferente do JSON.

Um Telltale deve olhar conn.headers.headers Para ver o que o cabeçalho do tipo conteúdo diz.

E essa pergunta, Formato de string ímpar resultante da chamada da API, pode ter sua resposta. Basicamente, você pode ter que executar seu resultado através de um descompressor GZIP.

Verificando duas vezes com este código:

>>> 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'

Sim, você definitivamente está recuperando os dados codificados do GZIP.

Como você parece estar obtendo resultados diferentes em diferentes máquinas com a mesma versão do Python e, em geral algum lugar.

Eu vi uma apresentação do EFF no CodeCon em 2009. Eles estavam fazendo testes de conectividade de ponta a ponta para descobrir truques sujos do ISP de vários tipos. Uma das coisas que eles descobriram ao fazer esse teste é que um número surpreendente de roteadores NAT em nível de consumidor adiciona cabeçalhos HTTP aleatórios ou faz proxy transparente. Você pode ter algum equipamento em sua rede que está adicionando ou modificando o Accept-Encoding Cabeçalho para fazer sua conexão parecer mais rápida.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top