考虑以下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?
有什么想法吗?
答案 0 :(得分: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
答案 1 :(得分:25)
如果您想通过编程界面“正确”进行Google搜索,请查看Google APIs。这些不仅是搜索Google的官方方式,如果Google更改其结果页面布局,它们也不太可能改变。
答案 2 :(得分:2)
作为lacqui suggested,Google API's是他们希望您通过代码提出请求的方式。不幸的是,我发现他们的文档针对的是编写AJAX网页的人,而不是原始的HTTP请求。我使用LiveHTTP Headers来跟踪示例所做的HTTP请求,我发现ddipaolo's blog post很有帮助。
还有一件事搞砸了我们:他们限制你从查询中获得前64个结果。如果您只是为网络用户提供搜索框,通常不会有问题,但如果您尝试使用Google进行数据挖掘则无济于事。我猜他们不希望你使用他们的API进行数据挖掘。 64号码随着时间的推移而发生变化,因搜索产品而异。
更新:看来他们绝对不希望您进行数据挖掘。最终,您收到403错误,其中包含指向此API access notice的链接。
请查看您正在使用的API的使用条款(链接在右侧边栏中)并确保合规性。我们可能会阻止您使用以下违反条款之一:我们收到了自动请求,例如抓取和预取。禁止自动请求;所有请求必须是最终用户操作的结果。
他们还列出了其他违规行为,但我认为这是触发我的行为。我可能要调查雅虎的BOSS服务。它似乎没有那么多限制。
答案 3 :(得分:0)
你经常这样做。谷歌有限制,以防止被搜索机器人淹没。您还可以尝试将用户代理设置为更接近普通浏览器的内容。