Pergunta

Eu tento buscar um artigo da Wikipedia com urllib do Python:

f = urllib.urlopen("http://en.wikipedia.org/w/index.php?title=Albert_Einstein&printable=yes")           
s = f.read()
f.close()

No entanto, em vez da página html recebo a seguinte resposta: Erro - Wikimedia Foundation:

Request: GET http://en.wikipedia.org/w/index.php?title=Albert_Einstein&printable=yes, from 192.35.17.11 via knsq1.knams.wikimedia.org (squid/2.6.STABLE21) to ()
Error: ERR_ACCESS_DENIED, errno [No Error] at Tue, 23 Sep 2008 09:09:08 GMT 

Wikipedia parece pedido bloco que não são de um navegador padrão.

Alguém sabe como resolver isso?

Foi útil?

Solução

Você precisa usar o urllib2 que superseedes urllib na python std biblioteca, a fim de mudar o agente do usuário.

Direto dos exemplos

import urllib2
opener = urllib2.build_opener()
opener.addheaders = [('User-agent', 'Mozilla/5.0')]
infile = opener.open('http://en.wikipedia.org/w/index.php?title=Albert_Einstein&printable=yes')
page = infile.read()

Outras dicas

Não é uma solução para o problema específico. Mas pode ser intersting para você usar a biblioteca mwclient ( http://botwiki.sno.cc/ wiki / Python: Mwclient ) em vez. Isso seria muito mais fácil. Especialmente desde que você receberá diretamente o conteúdo do artigo que elimina a necessidade de você para analisar o html.

Eu usei-me para dois projetos, e ele funciona muito bem.

Ao invés de tentar enganar Wikipedia, você deve considerar o uso de seu Alto Nível API .

No caso de você está tentando acessar conteúdo da Wikipedia (e não precisa de qualquer informação específica sobre a própria página), em vez de usar a api você deve apenas chamar index.php com 'Action = raw', a fim de obter a wikitext, como em:

'http://en.wikipedia.org/w/index.php? action = raw & title = Main_Page'

Ou, se você deseja que o código HTML, use 'action = tornar' como em:

'http://en.wikipedia.org/w/index.php? action = tornar & title = Main_Page'

Você também pode definir uma seção para obter apenas parte do conteúdo com algo como 'section = 3'.

Você pode então acessá-lo usando o módulo urllib2 (como sugerido na resposta escolhida). No entanto, se você precisar de informações sobre o próprio (tais como revisões), você vai ser melhor usando o mwclient como sugerido acima.

Consulte do MediaWiki FAQ se precisar de mais informações .

A solução de uso geral I para qualquer site é acessar a página usando o Firefox e, usando uma extensão como o Firebug, gravar todos os detalhes da solicitação HTTP incluindo quaisquer cookies.

Em seu programa (neste caso em Python) você deve tentar enviar uma solicitação HTTP tão semelhantes quanto necessário para aquele que trabalhou a partir de Firefox. Isso muitas vezes inclui a definição dos campos User-Agent, Referer e Cookie, mas pode haver outros.

requests é impressionante!

Aqui está como você pode obter o conteúdo html com requests:

import requests
html = requests.get('http://en.wikipedia.org/w/index.php?title=Albert_Einstein&printable=yes').text

Feito!

Tente alterar o cabeçalho de agente de usuário que você está enviando o seu pedido para algo como: User-Agent: Mozilla / 5.0 (X11; U; Linux i686; en-US; rv: 1.9.0.1) Gecko / 2008072820 Ubuntu / 8.04 (Hardy) Firefox / 3.0.1 (Linux Mint)

Você não precisa representar um navegador user-agent; qualquer usuário-agente em todo o trabalho de vontade, não apenas um em branco.

import urllib
s = urllib.urlopen('http://en.wikipedia.org/w/index.php?action=raw&title=Albert_Einstein').read()

Isso parece funcionar para mim, sem alterar o agente do usuário. Sem o "action = raw" ele não funciona para mim.

Solicitando a página com ?printable=yes dá-lhe todo um documento HTML relativamente limpa. ?action=render dá-lhe apenas o HTML corpo. Requerente para analisar a página através da ação API MediaWiki com action=parse da mesma forma dá-lhe apenas o HTML corpo, mas seria bom se você quiser um controle mais fino, ver parse API ajuda .

Se você quiser apenas a página HTML para que você possa torná-lo, ele é mais rápido e melhor é usar o novo RESTBase API, que retorna uma representação HTML em cache da página. Neste caso, https://en.wikipedia.org/api/rest_v1/page / html / Albert_Einstein .

A partir de novembro de 2015, você não tem que definir o seu user-agent, mas é fortemente encorajada . Além disso, quase todos Wikimedia wikis exigir HTTPS , portanto, evitar um redirecionamento 301 e fazer http s solicitações.

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