Récupère un article de Wikipedia avec Python

J’essaie de récupérer un article de Wikipedia avec l’urllib de Python:

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

Cependant, au lieu de la page HTML, j’obtiens la réponse suivante: Erreur – 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 semble bloquer les requêtes qui ne proviennent pas d’un navigateur standard.

Quelqu’un sait comment contourner cela?

Vous devez utiliser l’ urllib2 qui suraligne urllib dans la bibliothèque python std afin de modifier l’agent utilisateur.

Directement des exemples

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

Ce n’est pas une solution au problème spécifique. Mais il pourrait être intéressant pour vous d’utiliser la bibliothèque mwclient ( http://botwiki.sno.cc/wiki/Python:Mwclient ) à la place. Ce serait beaucoup plus facile. Surtout que vous obtiendrez directement le contenu de l’article qui vous évite d’avoir à parsingr le code HTML.

Je l’ai utilisé moi-même pour deux projets et cela fonctionne très bien.

Plutôt que d’essayer de tromper Wikipedia, vous devriez envisager d’utiliser leur API de haut niveau .

Si vous essayez d’accéder au contenu de Wikipedia (et n’avez pas besoin d’informations spécifiques sur la page elle-même), au lieu d’utiliser l’api, vous devez simplement appeler index.php avec «action = raw» pour obtenir le wiki, comme dans:

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

Ou, si vous voulez le code HTML, utilisez ‘action = render’ comme dans:

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

Vous pouvez également définir une section pour obtenir une partie du contenu avec quelque chose comme ‘section = 3’.

Vous pouvez alors y accéder en utilisant le module urllib2 (comme indiqué dans la réponse choisie). Cependant, si vous avez besoin d’informations sur la page elle-même (telles que les révisions), vous feriez mieux d’utiliser le mwclient indiqué ci-dessus.

Reportez-vous à la FAQ de MediaWiki si vous avez besoin de plus d’informations.

La solution générale que j’utilise pour n’importe quel site consiste à accéder à la page à l’aide de Firefox et, en utilisant une extension telle que Firebug, à enregistrer tous les détails de la requête HTTP, y compris les cookies.

Dans votre programme (dans ce cas en Python), vous devriez essayer d’envoyer une requête HTTP aussi similaire que nécessaire à celle de Firefox. Cela inclut souvent la définition des champs User-Agent, Referer et Cookie, mais il peut y en avoir d’autres.

requests sont géniales!

Voici comment vous pouvez obtenir le contenu HTML avec les requests :

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

Terminé!

Essayez de modifier l’en-tête de l’agent utilisateur que vous envoyez dans votre requête à: Agent utilisateur: 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)

Vous n’avez pas besoin d’emprunter l’identité d’un agent utilisateur de navigateur; tout agent utilisateur fonctionnera, mais pas vide.

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

Cela semble fonctionner pour moi sans changer l’agent utilisateur. Sans “action = raw”, cela ne fonctionne pas pour moi.

Demander la page avec ?printable=yes vous donne un document HTML relativement propre. ?action=render vous donne que le corps HTML. Demander à parsingr la page à l’aide de l’API d’action MediaWiki avec action=parse vous donne également uniquement le corps HTML, mais ce serait bien si vous souhaitez un contrôle plus précis, voir l’aide de l’API d’parsing .

Si vous voulez simplement que la page HTML vous permet de la rendre, il est plus rapide et mieux d’utiliser la nouvelle API RESTBase , qui renvoie une représentation HTML mise en cache de la page. Dans ce cas, https://en.wikipedia.org/api/rest_v1/page/html/Albert_Einstein .

En novembre 2015, vous n’avez pas besoin de définir votre agent utilisateur, mais cela est fortement recommandé . En outre, presque tous les wikis Wikimedia requièrent HTTPS , évitez donc une redirection 301 et faites des requêtes http s .