无法浏览所有Bing API结果

3
我目前正在使用 Bing Web Search API v7 查询必应的搜索结果。根据API文档,参数 countoffset 用于通过结果进行分页,结果的总数由 totalEstimatedMatches 的值定义在结果本身中。
如下所示从文档中得知:

totalEstimatedMatches:与查询相关的网页的估计数量。将此数字与 count 和 offset 查询参数一起使用以分页结果。

这似乎可以一直使用,但在某个点之后,API只会不断返回完全相同的结果,而不管 countoffset 的值如何。
在我具体的案例中,totalEstimatedMatches 设置为 330,000。使用 count50 (即每个请求50个结果),结果在约 offset 700 即 330,000 估计结果的第 3,500 个循环重复。
在尝试 Bing 前端时,一旦页面数足够高,我注意到了类似的行为,例如: 我是在错误地使用API还是这只是一种限制或bug,其中 totalEstimatedMatches 仅仅偏差太大?

今天遇到了这个 bug,请参见 https://stackoverflow.com/questions/76097614/how-to-get-more-than-100-results-with-the-bing-search-api-v7/76097615。有人知道 Google 搜索 API 是否更好吗? - Martin Monperrus
2个回答

3
totalEstimatedMatches 提供了关于该查询在网络中的所有匹配结果总数 - 包括重复结果和相似内容。为了优化索引,所有搜索引擎都会将结果限制在前N个网页内。这就是你看到的情况。这种行为在所有搜索引擎中都是一致的,因为通常几乎所有用户都会在2-3个搜索页面内更改查询/选择网页/放弃。简而言之,这不是错误/实现不正确,而是对索引进行优化,限制了您获取更多结果的能力。如果您真的需要获取更多结果,可以使用相关搜索并附加唯一的网页。

我本以为API即使网站不允许,也可以完全访问索引? - user783836
API实际上是一个具有TPS、过滤器和排序方便性的站点表现形式。因此,不幸的是,API无法提供所有结果。事实上,这在所有搜索引擎和API中都是如此。 - Ronak

0

从技术上讲,这并不是对所提问问题的直接回答。但希望提供一种有效地通过Bing API进行分页的方法,而无需使用“totalEstimatedMatches”返回值。正如其他答案所解释的那样,该返回值的行为可能非常不可预测。

以下是一些Python代码:

class ApiWorker(object):
    def __init__(self, q):
        self.q = q
        self.offset = 0
        self.result_hashes = set()
        self.finished = False

    def calc_next_offset(self, resp_urls):
       before_adding = len(self.result_hashes)
       self.result_hashes.update((hash(i) for i in resp_urls)) #<==abuse of set operations.
       after_adding = len(self.result_hashes)
       if after_adding == before_adding: #<==then we either got a bunch of duplicates or we're getting very few results back.
           self.finished = True
       else:
           self.offset += len(new_results)

    def page_through_results(self, *args, **kwargs):
        while not self.finished:
            new_resp_urls = ...<call_logic>...
            self.calc_next_offset(new_resp_urls) 
            ...<save logic>...
        print(f'All unique results for q={self.q} have been obtained.')

只要获得了完整的重复响应,这^将停止分页。


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