Pregunta

Yo al intentar recuperar un artículo de Wikipedia con Python urllib:

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

Sin embargo, en lugar de la página html me sale el siguiente respuesta:Error - De La Fundación Wikimedia:

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 a petición de bloque que no son de un navegador estándar.

Alguien sabe cómo solucionar esto?

¿Fue útil?

Solución

Usted necesidad de utilizar el urllib2 que superseedes urllib en el python sexual, biblioteca con el fin de cambiar el agente de usuario.

Directamente desde el ejemplos

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()

Otros consejos

No es una solución para el problema específico.Pero podría ser interesantes para usted el uso de la mwclient biblioteca (http://botwiki.sno.cc/wiki/Python:Mwclient) en su lugar.Que sería mucho más fácil.Especialmente puesto que usted va a conseguir directamente el contenido del artículo que elimina la necesidad de analizar el código html.

Yo mismo la he utilizado para dos proyectos, y funciona muy bien.

En lugar de tratar de engañar a la Wikipedia, usted debe considerar el uso de sus API de alto Nivel.

En caso de que usted está tratando de acceder a contenido de Wikipedia (y no se necesita ninguna información específica acerca de la página en sí), en lugar de utilizar la api usted debe llamar index.php con "action=" raw con el fin de obtener el wikitext, como en:

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

O, si desea que el código HTML, el uso de "acción=render' como en:

'http://en.wikipedia.org/w/index.php?acción=render&title=Main_Page'

También puede definir una sección para obtener sólo una parte del contenido con algo parecido a la sección '=3'.

Entonces, usted puede acceder mediante el urllib2 módulo (como los sugeridos en la opción de respuesta).Sin embargo, si usted necesita información sobre la propia página (revisiones), estarás mejor con la mwclient como los sugeridos anteriormente.

Consulte MediaWiki del FAQ si necesita más información.

La solución general yo uso para cualquier sitio web es el acceso a la página con Firefox y, el uso de una extensión, como Firebug, registrar todos los detalles de la solicitud HTTP, incluyendo las cookies.

En su programa (en este caso en Python) usted debe tratar de enviar una petición HTTP como similares como sea necesario, para la que trabajó desde Firefox.Esto a menudo incluye la configuración del Agente de Usuario, Referer y Cookies campos, pero puede haber otros.

requests es impresionante!

Aquí es cómo usted puede conseguir el contenido html con requests:

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

Hecho!

Trate de cambiar el agente de usuario encabezado usted envía su solicitud a 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)

Usted no necesita para suplantar a un navegador de agente de usuario;cualquier agente de usuario en todo el trabajo, no sólo una en blanco.

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

Esto parece funcionar para mí sin cambiar el agente de usuario.Sin el "action=raw" no funciona para mí.

Solicita la página con ?printable=yes da todo relativamente limpia documento HTML. ?action=render le da el cuerpo HTML.Solicitar a analizar la página a través de la MediaWiki acción de la API con action=parse asimismo se proporciona sólo el cuerpo HTML, pero sería bueno si usted desea un control más fino, consulte la ayuda de la API de analizar.

Si sólo quieres el HTML de la página, así que usted puede hacer, es mejor y más rápido es el uso de las nuevas RESTBase API, que devuelve un caché representación de HTML de la página.En este caso, https://en.wikipedia.org/api/rest_v1/page/html/Albert_Einstein.

A partir de noviembre de 2015, usted no tiene que establecer su agente de usuario, pero se alienta encarecidamente.Además, casi todos los wikis de Wikimedia requerir HTTPS, para evitar una redirección 301 y hacer https las solicitudes.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top