Python的`urllib2`:为什么我在urlopen维基百科页面时出现错误403?

尝试从维基百科浏览某个页面时遇到了一个奇怪的错误。 这是页面:

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

这是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 

这发生在我身上在不同大陆的两个不同的系统。 有没有人有一个想法,为什么会这样呢?

维基百科的立场是 :

数据检索:僵尸工具不能用于检索与批准的僵尸任务不直接相关的任何用途的批量内容。 这包括从另一个网站dynamic加载网页,这可能会导致网站被列入黑名单并永久拒绝访问。 如果您想下载批量内容或镜像项目,请通过下载或托pipe您自己的数据库副本来完成。

这就是为什么Python被阻止。 你应该下载数据转储 。

无论如何,你可以在Python 2中阅读这样的页面:

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

或者在Python 3中:

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

要debugging这个,你需要捕获这个exception。

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

当我打印生成的消息时,它包括以下内容

“英语

我们的服务器目前遇到技术问题。 这可能是暂时的,应该尽快解决。 请在几分钟后再试一次。 “

很多时候,网站会通过检查是否被一个公认的用户代理访问来过滤访问。 维基百科只是把你的脚本当作一个机器人而拒绝它。 尝试作为浏览器欺骗。 下面的链接会给你一篇文章,告诉你如何。

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

有些网站会阻止脚本访问,通过阅读urllib发送的头文件来避免“不必要的”使用服务器。 我不知道,也不能想象为什么维基百科会这样做,但你试图欺骗你的头?

正如Jochen Ritzel所说,维基百科阻止机器人。

但是,如果使用PHP API,机器人将不会被阻止。 要获得维基百科页面标题为“爱”:

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