una pagina leer extraer datos python urllib2 user-agent wikipedia http-status-code-403

pagina - Obtener un artículo de Wikipedia con Python



extraer datos de una pagina web python (10)

Intento buscar un artículo de Wikipedia con el urllib de Python:

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, recibo la siguiente respuesta: Error - 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 bloquear solicitudes que no provienen de un navegador estándar.

¿Alguien sabe cómo evitar esto?


Intente cambiar el encabezado del agente de usuario que está enviando en su solicitud a algo como: Usuario-Agente: Mozilla / 5.0 (X11; U; Linux i686; en-US; rv: 1.9.0.1) Gecko / 2008072820 Ubuntu / 8.04 (resistente) Firefox / 3.0.1 (Linux Mint)


La solución general que uso para cualquier sitio es acceder a la página usando Firefox y, usando una extensión como Firebug, registrar todos los detalles de la solicitud HTTP, incluidas las cookies.

En su programa (en este caso en Python) debe intentar enviar una solicitud HTTP tan similar como sea necesario a la que funcionó desde Firefox. Esto a menudo incluye configurar los campos User-Agent, Referer y Cookie, pero puede haber otros.


No es una solución al problema específico. Pero podría ser interesante para usted usar la biblioteca mwclient ( http://botwiki.sno.cc/wiki/Python:Mwclient ) en su lugar. Eso sería mucho más fácil. Especialmente dado que obtendrá los contenidos del artículo directamente, lo que elimina la necesidad de analizar el html.

Lo he usado yo mismo para dos proyectos, y funciona muy bien.


No necesita suplantar a un usuario-agente del navegador; cualquier user-agent funcionará, pero no en blanco.


En lugar de tratar de engañar a Wikipedia, debería considerar usar su API de alto nivel .


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 la "acción = raw" no funciona para mí.


En caso de que intentes acceder al contenido de Wikipedia (y no necesites ninguna información específica sobre la página en sí), en lugar de usar la API solo debes llamar a index.php con ''action = raw'' para obtener el wikitext, como en:

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

O bien, si quiere el código HTML, use ''action = render'' como en:

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

También puede definir una sección para obtener solo una parte del contenido con algo como ''sección = 3''.

A continuación, puede acceder utilizando el módulo urllib2 (como se sugiere en la respuesta elegida). Sin embargo, si necesita información sobre la página en sí (como revisiones), será mejor que use el mwclient como se indicó anteriormente.

Consulte las preguntas frecuentes de MediaWiki si necesita más información.


requests es increíble!

A continuación, le indicamos cómo puede obtener el contenido html con las requests :

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

¡Hecho!


Necesita usar el urllib2 que supervisa urllib en la biblioteca de python std para cambiar el agente de usuario.

Directamente de los 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()


Solicitar la página con ?printable=yes le proporciona un documento HTML relativamente limpio. ?action=render te da solo el cuerpo HTML. Solicitar parsear la página a través de la API de acción de MediaWiki con action=parse también le da solo el cuerpo HTML, pero sería bueno si desea un control más fino, consulte la ayuda de Parse API .

Si solo quiere el HTML de la página para poder renderizarlo, es más rápido y mejor usar la nueva API RESTBase , que devuelve una representación HTML en caché de la página. En este caso, https://en.wikipedia.org/api/rest_v1/page/html/Albert_Einstein .

A partir de noviembre de 2015, no tiene que configurar su agente de usuario, pero se recomienda encarecidamente . Además, casi todos los wikis de Wikimedia requieren HTTPS , así que evite una redirección 301 y realice las solicitudes de http.