Question 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?


38
2017-09-23 09:37


origine


Réponses:


Vous devez utiliser le urllib2 qui sursède urllib dans le bibliothèque python std afin de changer l'agent utilisateur.

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

50
2017-09-23 09:50



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) au lieu. Ce serait beaucoup plus facile. Surtout que vous obtiendrez directement le contenu de l'article qui vous évite d'avoir à analyser le code HTML.

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


36
2017-09-23 09:49



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


15
2018-06-11 11:14



Si vous essayez d'accéder au contenu de Wikipedia (et que vous 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 wikitext, comme dans:

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

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

'http://en.wikipedia.org/w/index.php?action = rendre& 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 comme indiqué ci-dessus.

Faire référence à FAQ de MediaWiki si vous avez besoin de plus d'informations.


3
2017-11-12 19:16



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.


2
2017-09-23 09:51



requests est génial!

Voici comment vous pouvez obtenir le contenu HTML avec requests:

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

Terminé!


2
2017-09-19 05:37



Essayez de modifier l'en-tête de l'agent utilisateur que vous envoyez dans votre demande à quelque chose comme: 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)


1
2017-09-23 09:41