Question

J'essaie de récupérer un article 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, la réponse suivante s'affiche: 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-il comment contourner ce problème?

Était-ce utile?

La solution

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

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

Autres conseils

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 tellement plus facile. D'autant plus que vous obtiendrez directement le contenu de l'article, ce qui vous évitera d'analyser 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 . / p>

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' afin d'obtenir le wikitext, comme dans:

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

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

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

Vous pouvez également définir une section pour obtenir uniquement 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). Toutefois, si vous avez besoin d’informations sur la page elle-même (telles que les révisions), vous ferez mieux d’utiliser le mwclient comme 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, à l'aide d'une extension telle que Firebug, à enregistrer tous les détails de la demande HTTP, y compris les cookies.

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

La demandes est géniale!

Voici comment vous pouvez obtenir le contenu HTML avec requêtes :

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

Fait!

Essayez de modifier l’en-tête de l’agent utilisateur que vous envoyez dans votre demande, par exemple: Agent utilisateur: Mozilla / 5.0 (X11; U; Linux i686; en-US; version: 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; n'importe quel utilisateur-agent fonctionnera, mais pas vierge.

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 le " action = raw " ça ne marche pas pour moi.

Demander la page avec ? printable = yes vous donne un document HTML relativement propre. ? action = render ne vous donne que le corps HTML . Demande d'analyser la page via l'API d'action MediaWiki avec action = parse vous donne également le corps HTML, mais serait bien si vous voulez un contrôle plus précis, voir l’aide de Parse API .

Si vous voulez seulement que la page soit HTML afin de pouvoir la restituer, il est plus rapide et mieux d’utiliser le nouveau RESTBase , qui renvoie une représentation HTML en cache de la page. Dans ce cas, https://en.wikipedia.org/api/rest_v1/page / html / Albert_Einstein .

Depuis novembre 2015, vous n'avez pas besoin de définir votre agent utilisateur, mais c'est fortement encouragé . De plus, presque tous les wikis Wikimedia requièrent le protocole HTTPS . Par conséquent, évitez les redirections 301 et envoyez des s requêtes http.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top