1

我正在尝试使用以下代码打开 URL 以解析内容。但是当我尝试通过 python 而不是通过网络浏览器使用相同的 URL 时收到 403 错误。有什么帮助可以克服这个问题吗?

import urllib2
URL = 'http://www.google.com/search?q=something%20unusual'
response = urllib2.urlopen(URL)

来自 Py 解释器的响应:HTTPError:HTTP 错误 403:禁止

4

2 回答 2

3

谷歌正在使用用户代理过滤来防止机器人与其搜索服务交互。您可以通过将这些结果与curl(1)并可选地使用-A标志来更改用户代理字符串进行比较来观察这一点:

$ curl -I 'http://www.google.com/search?q=something%20unusual'
HTTP/1.1 403 Forbidden
...

$ curl -I 'http://www.google.com/search?q=something%20unusual' -A 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0'
HTTP/1.1 200 OK

您可能应该改用Google 自定义搜索服务来自动执行 Google 搜索。或者,您可以使用库设置您自己的 User-Agent 标头urllib2(而不是默认的类似"Python-urllib/2.6"),但这可能违反 Google 的服务条款。

于 2013-06-17T17:57:27.307 回答
3

User-Agent标题是给你的问题。在我看来,网页通过检查User-Agent标题来禁止从非浏览器发出的任何请求。关键是User-Agent在python中设置一个模拟浏览器的。

这对我有用:

In [1]: import urllib2

In [2]: URL = 'http://www.google.com/search?q=something%20unusual'

In [4]: opener = urllib2.build_opener()

In [5]: opener.addheaders = [('User-agent', 'Mozilla/5.0')]

In [6]: response = opener.open(URL)

In [7]: response
Out[7]: <addinfourl at 47799472 whose fp = <socket._fileobject object at 0x02D7F5B0>>

In [8]: response.read()

希望这可以帮助!

于 2013-06-17T17:58:05.430 回答