Domanda

Provo a recuperare un articolo di Wikipedia con l'urllib di Python:

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

Tuttavia invece della pagina HTML ottengo la seguente risposta: Errore - 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 sembra bloccare le richieste che non provengono da un browser standard.

Qualcuno sa come aggirare questo?

È stato utile?

Soluzione

Devi utilizzare urllib2 che sostituisce urllib in libreria std python per cambiare il programma utente.

Direttamente dagli esempi

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

Altri suggerimenti

Non è una soluzione al problema specifico. Ma potrebbe essere interessante utilizzare la libreria mwclient ( http://botwiki.sno.cc/ wiki / Python: Mwclient ) invece. Sarebbe molto più facile. Soprattutto perché otterrai direttamente il contenuto dell'articolo che elimina la necessità di analizzare l'html.

L'ho usato io stesso per due progetti e funziona molto bene.

Invece di provare a ingannare Wikipedia, dovresti prendere in considerazione di utilizzare la loro API di alto livello .

Nel caso in cui tu stia provando ad accedere al contenuto di Wikipedia (e non hai bisogno di informazioni specifiche sulla pagina stessa), invece di usare l'API dovresti semplicemente chiamare index.php con 'action = raw' per ottenere il wikitext, come in:

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

Oppure, se vuoi il codice HTML, usa 'action = render' come in:

'http://en.wikipedia.org/w/index.php action = rendere & amp;? Title = Main_Page'

Puoi anche definire una sezione per ottenere solo una parte del contenuto con qualcosa come "sezione = 3".

Potresti quindi accedervi usando il modulo urllib2 (come suggerito nella risposta scelta). Tuttavia, se hai bisogno di informazioni sulla pagina stessa (come le revisioni), ti conviene utilizzare mwclient come suggerito sopra.

Fai riferimento a FAQ di MediaWiki se hai bisogno di maggiori informazioni .

La soluzione generale che utilizzo per qualsiasi sito è accedere alla pagina tramite Firefox e, utilizzando un'estensione come Firebug, registrare tutti i dettagli della richiesta HTTP, inclusi eventuali cookie.

Nel tuo programma (in questo caso in Python) dovresti provare a inviare una richiesta HTTP tanto simile quanto necessario a quella che ha funzionato da Firefox. Ciò include spesso l'impostazione dei campi User-Agent, Referer e Cookie, ma potrebbero essercene altri.

richieste è fantastico!

Ecco come ottenere il contenuto html con richieste :

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

Fatto!

Prova a cambiare l'intestazione dell'agente utente che stai inviando nella tua richiesta in qualcosa del tipo: 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)

Non è necessario impersonare un user-agent del browser; qualsiasi user-agent funzionerà, non solo vuoto.

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

Questo sembra funzionare per me senza cambiare l'agente utente. Senza l'azione "quot = raw" non funziona per me.

Richiesta della pagina con ? printable = yes ti dà un intero documento HTML relativamente pulito. ? action = render ti dà solo il corpo HTML . Richiesta di analisi della pagina tramite l'API di azione MediaWiki con action = parse ti dà anche solo l'HTML del corpo ma sarebbe buono se vuoi un controllo più preciso, consultare la guida dell'API di analisi .

Se vuoi solo l'HTML della pagina per renderlo, è più veloce e migliore è usare il nuovo RESTBase API, che restituisce una rappresentazione HTML memorizzata nella cache della pagina. In questo caso, https://en.wikipedia.org/api/rest_v1/page / html / Albert_Einstein .

A novembre 2015 non è necessario impostare il proprio user-agent, ma è fortemente incoraggiato . Inoltre, quasi tutti i wiki di Wikimedia richiedono HTTPS , quindi evita un reindirizzamento 301 ed effettua richieste s .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top