【问题标题】:Unable to paginate through all bing API results无法对所有 bing API 结果进行分页
【发布时间】:2018-10-31 03:41:26
【问题描述】:

我目前正在使用 Bing Web Search API v7 来查询 Bing 以获取搜索结果。根据 API 文档,参数 countoffset 用于对结果进行分页,结果本身的总数由 totalEstimatedMatches 的值定义。

从文档如下:

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

这似乎在一定程度上起作用,此后 API 只是继续一遍又一遍地返回完全相同的结果,而不管 countoffset 的值如何。

在我的具体情况下,totalEstimatedMatches 设置为330,000。当count50(即每个请求50 个结果)时,结果开始在offset 700 左右重复,即3,500 结果为估计的330,000

在使用 bing 前端时,我注意到一旦页面计数足够高,就会出现类似的行为,例如

我是否错误地使用了 API,或者这只是某种限制或错误,其中 totalEstimatedMatches 就在其中?

【问题讨论】:

    标签: bing bing-api


    【解决方案1】:

    totalEstimatedMatches 提供该查询在网络上的匹配总数 - 包括重复的结果和接近相似的内容。

    为了优化索引,所有搜索引擎都将结果限制为前 N 个网页。这就是你所看到的。这种行为在所有搜索引擎中都是一致的,因为通常几乎所有用户都会在 2-3 个搜索页面内更改查询/选择网页/放弃。

    简而言之,这不是错误/不正确的实现,而是限制您获得更多结果的索引优化。如果您确实需要获得更多结果,可以使用相关搜索并附加唯一网页。

    【讨论】:

    • 我原以为 API 会允许完全访问索引,即使站点不允许?
    • API实际上是站点的一种表现形式,具有TPS、过滤、排序的便利性。因此,不幸的是,API 也不会提供所有结果。事实上,所有搜索引擎和 API 都是如此。
    【解决方案2】:

    从技术上讲,这并不是对所问问题的直接回答。希望提供一种通过 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.')
    

    一旦获得完整的重复响应,此^ 将停止分页。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-13
      • 2018-04-03
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多