在已知可用URL上使用urllib.request.urlopen()时出现HTTPError

时间:2014-06-13 23:21:57

标签: http python-3.x

我有一些非常简单的python代码,试图获取网页的HTML。

import urllib

url = 'https://www.____.com'     # A URL that works in my browser
u = urllib.request.urlopen(url)

然后我使用u在网页上找到链接并下载文件。

我已经使用此代码几天没有问题,但现在我尝试打开URL时收到HTTPError 503: Service Temporarily Unavailable。我对这类东西并不是很了解,但我认为该网站发现机器人一再试图获取访问权并以某种方式阻止它。

我该如何解决这个问题?是否有更加网站友好的方式来检索数据?

1 个答案:

答案 0 :(得分:0)

根据pictuga's answer to a similar question,问题可能是网站禁止urllib.request.urlopen指定的默认user agent,以防止网页抓取工具访问该网站。您可以通过在打开请求时设置自定义用户代理来解决此限制,如urllib.request.Request的Python 3.3文档中所示:

  

标题应该是字典,并且将被视为add_header()   用每个键和值作为参数调用。这通常用于   “欺骗”用户代理标头,浏览器使用该标头来识别   本身 - 一些HTTP服务器只允许来自公共的请求   浏览器而不是脚本。例如,Mozilla Firefox可能会   将自己标识为“Mozilla / 5.0(X11; U; Linux i686)Gecko / 20071127   Firefox / 2.0.0.11“,而urllib的默认用户代理字符串是   “Python-urllib / 2.6”(在Python 2.6上)。

换句话说,您应该通过将自定义用户代理作为Request字典(带有密钥urllib.request.Request)的一部分传递给headers来创建"User-Agent"对象。然后,您可以在该请求上调用urllib.request.urlopen以获得(希望成功的)响应。有关显示此方法的代码,请查看Oleh Prypin's answer here