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?

  • Wikipedia no bloquear las solicitudes que no son de un navegador estándar, lo que bloquea las solicitudes que son de las bibliotecas estándar, sin cambiar el agente de usuario.
InformationsquelleAutor dkp | 2008-09-23

10 Comentarios

  1. 51

    Que usted necesita para 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()
  2. 36

    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.

    • El uso de las bibliotecas de terceros por lo que se puede hacer fácilmente con la novación de las bibliotecas en un par de líneas de código no es un buen consejo.
    • Desde mwclient utiliza el mediawiki api es no requieren de un análisis de contenido. Y supongo que el cartel original quiere que el contenido, y no el raw html con menús y todo.
  3. 15

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

    • Que, a su vez, todavía bloquear las solicitudes de urllib el uso de la biblioteca por defecto encabezado de agente de usuario. Por lo que el OP todavía tiene el mismo problema, aunque la API puede ser una manera más fácil a la interfaz de la wiki de contenido, dependiendo de lo que son los OP metas.
    • Ellos trabajan muy bien para mí. No trabajan para usted? Ej: en.wikipedia.org/w/… o en.wikipedia.org/w/…
  4. 3

    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.

    Se refieren a MediaWiki del FAQ si usted necesita más información.

    • hola, si no sé el número de la sección 3, pero sé que el título de la sección a ser ‘Sustantivo’, ¿cómo conseguir esa sección en particular?
  5. 2

    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 el 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.

  6. 2

    las solicitudes 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!

  7. 1

    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)

  8. 1

    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.

    • urllib y urllib2 enviar un agente de usuario
    • s/blank/blank or default/ — la idea es exactamente lo que usted debe de alguna manera identificar el robot a través del encabezado de agente de usuario. Es por eso que el bloque de la urllib por defecto.
  9. 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 el «action=raw» no funciona para mí.

  10. 0

    Que solicita la página con ?printable=yes da todo relativamente limpia documento HTML. ?acción=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 preciso, 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 la nueva RESTBase de la 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 solicitudes.

Dejar respuesta

Please enter your comment!
Please enter your name here