我目前正在使用Bing Web Search API v7向Bing查询搜索结果。根据API文档,参数count
和offset
用于对结果进行分页,其总数由结果本身中的totalEstimatedMatches
值定义。
如下文档所述:
totalEstimatedMatches:与查询相关的估计网页数。使用此数字以及计数和偏移查询参数来分页结果。
这似乎达到了一定程度,在此之后,无论count
和offset
的值如何,API都会一遍又一遍地返回完全相同的结果。
在我的具体案例中,totalEstimatedMatches
设置为330,000
。使用count
50
(即每个请求50个结果),结果会在大约offset
700处重复,即3,500
结果会计入估算的330,000
。
在玩bing前端时,一旦页数变得足够高,我就注意到了类似的行为,例如
51,000
结果我是否错误地使用了API,或者这只是某种限制或错误导致totalEstimatedMatches
离开了?
答案 0 :(得分:2)
totalEstimatedMatches 提供网络上该查询的匹配总数 - 包括重复结果和类似内容。
为了优化索引编制,所有搜索引擎都会将结果限制在前N个网页中。这就是你所看到的。这种行为在所有搜索引擎中都是一致的,因为通常所有用户都会在2-3个搜索页面内更改查询/选择网页/放弃。
简而言之,这不是错误/不正确的实现,而是索引的优化限制了您获得更多结果。如果您确实需要获得更多结果,可以使用相关搜索并附加唯一的网页。
答案 1 :(得分:0)
从技术上讲,这不是所问问题的直接答案。希望提供一种无需使用"totalEstimatedMatches"
返回值即可有效地通过Bing API进行分页的方法,正如其他答案所解释的那样,返回值的行为可能确实不可预测:
这是一些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.')
一旦获得完全的重复答复,此^将停止分页。