Scarica un articolo di Wikipedia con Python
-
02-07-2019 - |
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?
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
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 .