Python urllib.urlopen () chamada não funciona com um URL que um navegador aceita
Pergunta
Se eu apontar o Firefox em http://bitbucket.org/tortoisehg/stable/wiki/home/releasenotes, Eu recebo uma página de HTML. Mas se eu tentar isso em Python:
import urllib site = 'http://bitbucket.org/tortoisehg/stable/wiki/Home/ReleaseNotes' req = urllib.urlopen(site) text = req.read()
Eu recebo o seguinte:
500 ERRADOR DO SERVIDO INTERNO O servidor encontrou um erro interno ou equívoco e não conseguiu concluir sua solicitação.
O que estou fazendo errado?
Solução
Você não está fazendo nada de errado, o Bitbucket faz alguma detecção de agentes de usuário (para detectar clientes mercuriais, por exemplo). Apenas Mudando o agente do usuário conserta (se não tiver urllib
como uma substring).
Você deve preencher um problema sobre isso: http://bitbucket.org/jespern/bitbucket/issues/new/
Outras dicas
Você não está fazendo nada de errado, na superfície, e como a página de erro diz que você deve entrar em contato com os administradores do site, porque eles são os com os logs do servidor que podem explicar o que está acontecendo. Felizmente, os administradores do site do Bitbucket são um grupo amigável!
Sem dúvida, há algum cabeçalho ou combinação de cabeçalhos que os navegadores definem de uma maneira, o Urllib define de outra maneira e um bug no servidor é agradado no último caso. Você pode querer ver exatamente quais cabeçalhos estão sendo enviados, por exemplo, com o Firebug no Firefox e reproduzi -los até que você isole exatamente o bug do servidor; Provavelmente, será o agente do usuário ou algum cabeçalho "aceitar" que faça cócegas no bug.
Eu não acho que você está fazendo algo de errado - parece que esse servidor foi apenas inativo? Seu script funcionou bem para mim ('texto' continha os mesmos dados exibidos no navegador).