2010-07-26 9 views
42

J'ai un bug étrange en essayant de urlopen une certaine page de Wikipedia. Ceci est la page:`urllib2` de Python: Pourquoi ai-je l'erreur 403 quand j'optionne une page Wikipedia?

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

Ceci est 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 <module> 
    # 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 

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

+0

Vous pouvez encode ces parenthèses. Pas que cela aide contre le 403, cependant. – Thomas

+0

Vous pouvez également utiliser les liens de l'API de wikimedia https://www.mediawiki.org/wiki/API:Main_page – chackerian

Répondre

101

Wikipedias stance is:

Data retrieval: Bots may not be used to retrieve bulk content for any use not directly related to an approved bot task. This includes dynamically loading pages from another website, which may result in the website being blacklisted and permanently denied access. If you would like to download bulk content or mirror a project, please do so by downloading or hosting your own copy of our database.

C'est pourquoi Python est bloqué. Vous êtes censé download data dumps.

Quoi qu'il en soit, vous pouvez lire des pages comme celui-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

"C'est pourquoi Python est bloqué." I ne comprends pas ce que signifie cette phrase? Cependant, même si j'ai fait une liste de 'User-Agent' et en ai choisi aléatoirement une pour créer une URL, le site Web m'envoie "urllib2.URLError: " ou bloque simplement mon ip de visiter leur site Web. Pouvez-vous me donner plus d'idées? Un grand merci. – MaiTiano

+0

Il est totalement ridicule qu'ils bloquent également la requête HEAD, qui sont utiles par exemple. valider tous les liens publiés par un utilisateur. – ThiefMaster

+0

Cette approche fonctionne également pour moi pour une page HTTPS qui me renvoie un 403. Pourquoi ça marche, alors que 'urllib2.urlopen()' aboutit à un 403? – Pyderman

1

Certains sites Web bloquent l'accès à partir des scripts pour éviter l'utilisation «inutile» de leurs serveurs en lisant les en-têtes urllib envoyés. Je ne sais pas et je ne peux pas m'imaginer pourquoi Wikipédia fait/ferait cela, mais avez-vous essayé de spoofing vos en-têtes?

+2

http://meta.wikimedia.org/wiki/Bot_policy –

5

Souvent, les sites Web filtrent l'accès en vérifiant s'ils sont accessibles par un agent utilisateur reconnu. Wikipedia traite simplement votre script comme un bot et le rejette. Essayez l'usurpation en tant que navigateur. Le lien suivant vous amène un article pour vous montrer comment.

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

9

Pour déboguer cela, vous aurez besoin de 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 comprend le

suivant

"English

Our servers are currently experiencing a technical problem. This is probably temporary and should be fixed soon. Please try again in a few minutes. "

0

J'ai fait une solution de contournement pour cela en utilisant php qui n'est pas bloqué par le site dont je avais besoin.

il peut être consulté comme ceci:

path='http://phillippowers.com/redirects/get.php? 
file=http://website_you_need_to_load.com' 
req = urllib2.Request(path) 
response = urllib2.urlopen(req) 
vdata = response.read() 

Cela renverra le code html pour vous