18

考虑以下 Python 代码:

30 url = "http://www.google.com/search?hl=en&safe=off&q=Monkey"
 31 url_object = urllib.request.urlopen(url);
 32 打印(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

4 回答 4

26

这应该可以解决问题

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
于 2009-05-12T20:46:05.080 回答
25

如果您想通过编程接口“正确”地进行 Google 搜索,请查看Google API。这些不仅是搜索谷歌的官方方式,如果谷歌改变他们的结果页面布局,它们也不太可能改变。

于 2009-03-01T21:22:09.043 回答
2

正如lacqui 所建议的,Google API是他们希望您从代码中发出请求的方式。不幸的是,我发现他们的文档针对的是编写 AJAX 网页的人,而不是发出原始 HTTP 请求。我使用LiveHTTP Headers来跟踪示例发出的 HTTP 请求,我发现ddipaolo 的博客文章很有帮助。

还有一件事让我感到困惑:它们将您限制为查询的前 64 个结果。如果您只是为网络用户提供搜索框,这通常不是问题,但如果您尝试使用 Google 进行数据挖掘,则无济于事。我猜他们不希望您使用他们的 API 进行数据挖掘。64 这个数字随着时间的推移而变化,并且在搜索产品之间有所不同。

更新:看来他们绝对不希望您进行数据挖掘。最终,您会收到一个 403 错误,其中包含指向此API 访问通知的链接。

请查看您正在使用的 API 的使用条款(链接在右侧栏中)并确保合规。我们可能会因以下违反使用条款之一而阻止您:我们收到了自动请求,例如抓取和预取。禁止自动请求;所有请求都必须是最终用户操作的结果。

他们还列出了其他违规行为,但我认为那是触发我的违规行为。我可能不得不调查雅虎的 BOSS 服务。好像没有那么多限制。

于 2010-11-04T06:22:55.503 回答
0

你这样做太频繁了。谷歌有一些限制,以防止被搜索机器人淹没。您还可以尝试将用户代理设置为更类似于普通浏览器的内容。

于 2009-03-01T21:20:45.893 回答