为什么谷歌搜索会返回HTTP错误403?

21

考虑以下Python代码:

 30    url = "http://www.google.com/search?hl=en&safe=off&q=Monkey"
 31    url_object = urllib.request.urlopen(url);
 32    print(url_object.read());

运行此代码时会抛出异常:

File "/usr/local/lib/python3.0/urllib/request.py", line 485, in http_error_default
   raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 403: Forbidden

然而,当在浏览器中运行此代码时,搜索结果与预期相符。这是怎么回事?我该如何解决这个问题,以便我可以通过编程的方式搜索Google?

有任何想法吗?

4个回答

28

这应该能解决问题

user_agent = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7'

url = "http://www.google.com/search?hl=en&safe=off&q=Monkey"
headers={'User-Agent':user_agent,} 

request=urllib2.Request(url,None,headers) //The assembled request
response = urllib2.urlopen(request)
data = response.read() // The data u need

1
你能否把你的代码格式化一下吗?(只需选择它,然后按Ctrl-K。) - Stephan202
+1 这个完美地运作了。然而,如果你过于频繁地向谷歌 API 请求,它会阻止你的请求(即抛出错误)。我将我的速率限制为每 3 秒一次,现在似乎不再被阻止了。 - Spike

26
如果您想通过编程接口“正确地”进行Google搜索,请查看Google API。这不仅是官方搜索Google的方式,而且在Google更改其结果页面布局时也不太可能发生变化。

1
你知道底层的情况吗?我很好奇...为什么url.read()看起来不像标准浏览器读取? - AgentLiquid
2
这些API直接访问搜索XML,而不是通过Web界面进行。它们连接到Google的另一个页面,以不同的格式提供数据。基本上,你之前获取403是因为你没有被允许以你之前的方式访问数据,而Google知道这一点... - Kevin Lacquement
4
由于您的应用程序没有发送User-Agent字符串,或者发送了一个默认的User-Agent字符串并被Google识别为机器人(请参见http://google.com/robots.txt),因此出现了这种情况。 - Kevin Lacquement
2
他们的API存在问题,就是它们返回的结果与google.com不同。请参见http://code.google.com/p/google-ajax-apis/issues/detail?id=43。 - Anders Rune Jensen
有一件事我不喜欢:他们限制你只能得到64个结果。 - Don Kirkby

2
lacqui建议的那样,Google API是他们希望你从代码中发出请求的方式。不幸的是,我发现他们的文档面向的是编写AJAX网页的人,而不是制作原始HTTP请求的人。我使用LiveHTTP Headers跟踪了示例所做的HTTP请求,我发现ddipaolo的博客文章很有帮助。
还有一件使我困惑的事情:他们限制你从查询中只得到前64个结果。如果你只是为网页用户提供一个搜索框,这通常不是问题,但如果你试图使用Google进行数据挖掘,这就不太有用了。我猜他们不希望你使用他们的API进行数据挖掘。这个数字随着时间的推移而改变,并在不同的搜索产品之间有所变化。
更新:看起来他们绝对不希望你进行数据挖掘。最终,你会收到一个403错误,并附有API访问通知的链接。
请查阅您正在使用的API的使用条款(链接在右侧边栏中),并确保遵守规定。我们可能会因以下使用条款违规而阻止您的访问:我们收到了自动请求,例如抓取和预取。自动请求是被禁止的;所有请求必须是由最终用户操作引起的结果。
他们还列出了其他违规行为,但我认为这是我触发的违规行为。我可能需要调查一下Yahoo的BOSS服务。它似乎没有那么多限制。

0

您的操作频率太高了。谷歌有限制措施来防止被搜索机器人淹没。您可以尝试设置用户代理,使其更接近于普通浏览器。


1
答案错误。它在第一次尝试时被阻止了。 - nosklo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接