如何有效获取关键词搜索的总结果数?

3 投票
2 回答
551 浏览
提问于 2025-04-16 13:25

我是个新手程序员,平时喜欢潜水,希望能得到一些靠谱的建议。 :)

我用Python、BeautifulSoup和Bing API组合,写了以下代码,成功找到了我想要的内容:

import urllib2
from BeautifulSoup import BeautifulStoneSoup

Appid = #My Appid
query = #My query

soup = BeautifulStoneSoup(urllib2.urlopen("http://api.search.live.net/xml.aspx?Appid=" + Appid + "&query=" + query + "&sources=web"))
totalResults = soup.find('web:total').text

现在我想对几千个搜索词做同样的事情,想问一下:

  1. 如果我请求一千次,会不会被认为是在疯狂攻击服务器?
  2. 我应该采取什么措施来避免这种情况(有什么最佳实践吗?)?
  3. 有没有更便宜的方法(数据方面)来使用主要搜索引擎的API?

我觉得为了每个关键词获取一个数字而花费那么多钱,实在是太不划算了,我在想我是不是漏掉了什么。

顺便说一下,我做了一些功课,试过Google搜索API(已经不再支持)和Yahoo的BOSS API(也快不再支持了,将被收费服务取代),最后才选择了Bing API。我知道直接抓取网页被认为是不太好的做法,所以我决定不直接抓取搜索引擎。

2 个回答

1

我想到三种方法,以前在处理大规模网址解析时,这些方法对我很有帮助。

  1. HTTP流水线(还有一个相关的片段在这里
  2. 对每个IP的服务器请求进行速率限制(也就是说,每个IP每秒只能发出3个请求)。一些建议可以在这里找到:如何限制Python中对网络服务的请求速率?
  3. 通过内部代理服务发出请求,使用http_proxy将所有请求重定向到该服务。这个代理服务会遍历一组网络接口,并发出速率限制的请求。你可以使用Twisted来实现这一点。
0

关于你提到的第一个问题,Bing 有一个 API 基础 PDF 文件,里面用通俗易懂的语言总结了相关的条款和条件。在“你必须做的事情”这一部分,有这样一段话:

每个 IP 地址的查询限制为每秒少于 7 次(QPS)。在某些情况下,你可能可以超过这个限制,但需要通过与 api_tou@microsoft.com 的讨论获得批准。

如果你只是写一个一次性的脚本,你只需要在发送请求之间加一个 sleep,这样每秒只发送几次请求就可以了。如果情况更复杂,比如这些请求是作为一个网络服务的一部分发出的,那么可以参考 Mahmoud Abdelkader 的回答,里面的建议会对你有帮助。

撰写回答