Python的`urllib2`:为什么我在`urlopen`一个维基百科页面时得到403错误?
我在尝试用 urlopen
打开维基百科的某个页面时遇到了一个奇怪的错误。这个页面是:
http://en.wikipedia.org/wiki/OpenCola_(drink)
这是我在命令行中的操作记录:
>>> 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
这个问题在我不同大陆的两台电脑上都出现过。有没有人知道为什么会这样?
6 个回答
5
很多时候,网站会通过检查访问者的身份来限制访问,看看是不是一个被认可的用户代理。维基百科把你的脚本当成了机器人,所以拒绝了它。你可以尝试伪装成一个浏览器。下面这个链接有一篇文章,可以教你怎么做。
11
要解决这个问题,你需要捕捉到那个异常。
try:
f = urllib2.urlopen('http://en.wikipedia.org/wiki/OpenCola_(drink)')
except urllib2.HTTPError, e:
print e.fp.read()
当我打印出结果信息时,它包含了以下内容:
"英文
我们的服务器目前遇到了技术问题。这可能是暂时的,应该很快就会修复。请过几分钟再试一次。"
139
数据获取:机器人(也就是自动程序)不能用来获取大量内容,除非这个内容是为了经过批准的机器人任务。这包括从其他网站动态加载页面,这样可能会导致该网站被列入黑名单,永久禁止访问。如果你想下载大量内容或者镜像一个项目,请通过下载或托管你自己的数据库副本来实现。
这就是为什么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())