58 votes

Python's `urllib2`: Pourquoi est-ce que je reçois une erreur 403 lorsque j'ouvre une page Wikipédia avec `urlopen`?

J'ai un bug étrange en essayant d'utiliser urlopen sur une certaine page de Wikipédia. Voici la page :

http://en.wikipedia.org/wiki/OpenCola_(drink)

Voici la session shell :

>>> f = urllib2.urlopen('http://en.wikipedia.org/wiki/OpenCola_(drink)')
Traceback (most recent call last):
  File "C:\Program Files\Wing IDE 4.0\src\debug\tserver\_sandbox.py", line 1, in 
    # Used internally for debug sandbox under external interpreter
  File "c:\Python26\Lib\urllib2.py", line 126, in urlopen
    return _opener.open(url, data, timeout)
  File "c:\Python26\Lib\urllib2.py", line 397, in open
    response = meth(req, response)
  File "c:\Python26\Lib\urllib2.py", line 510, in http_response
    'http', request, response, code, msg, hdrs)
  File "c:\Python26\Lib\urllib2.py", line 435, in error
    return self._call_chain(*args)
  File "c:\Python26\Lib\urllib2.py", line 369, in _call_chain
    result = func(*args)
  File "c:\Python26\Lib\urllib2.py", line 518, in http_error_default
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 403: Forbidden

Cela m'est arrivé sur deux systèmes différents dans différents continents. Est-ce que quelqu'un a une idée de pourquoi cela se produit?

0 votes

Vous voudrez peut-être encoder ces parenthèses. Même si cela ne protège pas contre le code 403.

0 votes

Vous pouvez également utiliser des liens à partir de l'api wikimedia mediawiki.org/wiki/API:Main_page

139voto

Jochen Ritzel Points 42916

La position de Wikipédia est la suivante:

Récupération de données : Les robots ne peuvent pas être utilisés pour récupérer du contenu en vrac pour tout usage non directement lié à une tâche de robot approuvée. Cela inclus chargement dynamique de pages depuis un autre site web, ce qui peut entraîner le site web d'être mis sur liste noire et accès refusé de façon permanente. Si vous souhaitez télécharger du contenu en masse ou miroir un projet, veuillez le faire en téléchargeant ou hébergeant votre propre copie de notre base de données.

C'est pourquoi Python est bloqué. Vous êtes censé télécharger les sauvegardes de données.

Quoi qu'il en soit, vous pouvez lire des pages comme celle-ci en Python 2:

req = urllib2.Request(url, headers={'User-Agent' : "Magic Browser"}) 
con = urllib2.urlopen( req )
print con.read()

Ou en Python 3:

import urllib
req = urllib.request.Request(url, headers={'User-Agent' : "Magic Browser"}) 
con = urllib.request.urlopen( req )
print(con.read())

0 votes

"C'est pourquoi Python est bloqué. Je ne comprends pas ce que cela signifie? Cependant, même si j'ai fait une liste de 'User-Agent' et choisi au hasard l'un d'entre eux pour construire une URL, le site web m'enverra "urllib2.URLError: " ou bloquera simplement mon adresse IP de visiter leur site web. Pouvez-vous me donner plus d'idées? Merci beaucoup."

0 votes

Il est totalement ridicule qu'ils bloquent également la requête HEAD qui est utile par exemple pour valider tous les liens postés par un utilisateur.

0 votes

Cette approche fonctionne également pour moi pour une page HTTPS qui me renvoie une 403. Pourquoi cela fonctionne-t-il, alors que urllib2.urlopen() renvoie une 403?

11voto

S.Lott Points 207588

Pour déboguer cela, vous devrez piéger cette exception.

try:
    f = urllib2.urlopen('http://en.wikipedia.org/wiki/OpenCola_(drink)')
except urllib2.HTTPError, e:
    print e.fp.read()

Lorsque j'imprime le message résultant, il inclut le suivant

"Anglais

Nos serveurs rencontrent actuellement un problème technique. Cela est probablement temporaire et devrait être résolu bientôt. Veuillez réessayer dans quelques minutes. "

0 votes

Fichier "", ligne 3 sauf urllib2.HTTPError, e: ^ SyntaxError: syntaxe invalide

0 votes

@KHANirfan C'est la syntaxe de python2. La syntaxe d'exception Python3 est "except Exception as e: print(e)".

5voto

Eli Points 633

Souvent, les sites Web filtreront l'accès en vérifiant s'ils sont consultés par un agent utilisateur reconnu. Wikipedia considère simplement votre script comme un bot et le rejette. Essayez de vous faire passer pour un navigateur. Le lien suivant vous emmène vers un article pour vous montrer comment faire.

http://wolfprojects.altervista.org/changeua.php

1voto

Chris Foster Points 366

Certains sites bloquent l'accès aux scripts pour éviter une utilisation "inutile" de leurs serveurs en lisant les en-têtes envoyés par urllib. Je ne sais pas et ne peux pas imaginer pourquoi Wikipedia le fait/ferait, mais avez-vous essayé de falsifier vos en-têtes ?

1voto

Hello World Points 178

Comme l'a mentionné Jochen Ritzel, Wikipedia bloque les bots.

Cependant, les bots ne seront pas bloqués s'ils utilisent l'API PHP. Pour obtenir la page Wikipedia intitulée "love":

http://en.wikipedia.org/w/api.php?format=json&action=query&titles=love&prop=revisions&rvprop=content

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X