2008-09-23 14 views
37

trato de buscar un artículo de Wikipedia con urllib de Python:Fetch un artículo de Wikipedia con 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 Me da la respuesta siguiente: 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 solucionar esto?

+3

Wikipedia no bloquea las peticiones no son de un navegador estándar, bloquea las peticiones que provienen de bibliotecas estándar sin cambiar su agente de usuario. – svick

Respuesta

50

Debe utilizar el urllib2 que superseedes urllib en el python std library para cambiar el agente de usuario.

Directamente desde el examples

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

Wikipedia intenta bloquear los raspadores de pantalla por alguna razón. Sus servidores tienen que trabajar mucho para convertir wikicode a HTML, cuando hay formas más fáciles de obtener el contenido del artículo. http://en.wikipedia.org/wiki/Wikipedia:Database_download#Please_do_not_use_a_web_crawler – Cerin

+1

No intente suplantar un navegador utilizando un agente de usuario como 'Mozilla/5.0'. En cambio, [debe usar un agente de usuario informativo con información de contacto] (http://meta.wikimedia.org/wiki/User-Agent_policy). – svick

+0

Y, la mayoría de los bots deberían leer y respetar "robots.txt". – Bryce

1

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

1

no es necesario para hacerse pasar por un agente de usuario del navegador; cualquier user-agent funcionará, pero no en blanco.

+4

urllib y urllib2 ambos envían un agente de usuario – Teifion

+2

's/blank/blank o default /' - la idea es exactamente que de alguna manera debe identificar su bot a través del encabezado de usuario-agente. Es por eso que bloquean el predeterminado 'urllib'. – njsg

36

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.

he utilizado yo mismo para los dos proyectos, y funciona muy bien.

+4

Usar bibliotecas de terceros para lo que se puede hacer fácilmente con las bibliotecas buildin en un par de líneas de código no es un buen consejo. –

+17

Como mwclient usa la api de mediawiki, no necesitará analizar el contenido. Y supongo que el póster original quiere el contenido, y no el html en bruto con menús y todo. –

2

La solución general que utilizo para cualquier sitio es acceder a la página utilizando Firefox y, utilizando una extensión como Firebug, registre todos los detalles de la petición HTTP incluyendo las cookies.

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

14

En lugar de tratar de engañar a Wikipedia, se debe considerar el uso de su High-Level API.

+0

Que, a su vez, todavía bloqueará las solicitudes de 'urllib' utilizando el encabezado de agente de usuario predeterminado de la biblioteca. Por lo tanto, el OP tendrá el mismo problema, aunque la API puede ser una forma más fácil de interactuar con el contenido del wiki, dependiendo de cuáles sean los objetivos del OP. – njsg

+0

Funcionan bien para mí. ¿No funcionan para ti? Ejemplo: http://en.wikipedia.org/w/api.php?format=xml&action=query&prop=info&titles=Main%20Page o http://en.wikipedia.org/w/api.php?format=xml&action= query & titles = Main% 20Page & prop = reviews & rvprop = content – sligocki

3

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

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

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

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

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

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

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

+0

hola si no conozco el número de la sección como 3 pero sé que el título de la sección es 'Sustantivo', ¿cómo obtener esa sección en particular? – emaillenin

0
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í.

2

requests es increíble!

Aquí es cómo puede obtener el contenido HTML con requests:

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

hecho!

0

que solicita la página con ?printable=yes le da todo un documento HTML relativamente limpio. ?action=render le da solo el cuerpo HTML. Solicitar analizar la página a través de la API de acción MediaWiki con action=parse también le da el cuerpo HTML, pero sería bueno si desea un control más preciso, see parse API help.

Si solo desea el HTML de la página para que pueda procesarlo, es más rápido y mejor es 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 el agente de usuario, pero it's strongly encouraged. Además, casi todos los wikis de Wikimedia require HTTPS, así que evite una redirección 301 y haga http s solicitudes.

Cuestiones relacionadas