Python调用Bing Search API仅返回30条结果(预期2900条)问题排查
问题描述
我想查找Web3领域的创始人,计划从LinkedIn提取个人简介并导出到CSV,通过关键词筛选结果。因为LinkedIn API成本高,所以选择用Bing搜索LinkedIn个人主页再处理。
先定义了Bing搜索相关函数:
import requests import csv subscription_key = 'SOMEKEY' endpoint = 'https://api.bing.microsoft.com' + "/v7.0/search" def _bing_search_once(query, market, count, offset): params = {'q': query, 'mkt': market, 'count': count, 'offset': offset, 'responseFilter': 'Webpages'} headers = {'Ocp-Apim-Subscription-Key': subscription_key} try: response = requests.get(endpoint, headers=headers, params=params) response.raise_for_status() print("Headers:") print(response.headers) print("JSONResponse:") json_response = response.json() if 'webPages' not in json_response: return [], 0 web_pages = json_response['webPages'] web_pages_count = web_pages['totalEstimatedMatches'] page_list = web_pages['value'] return page_list, web_pages_count except Exception as ex: raise ex def bing_search(query, max_count, market='en-us'): web_pages_count = 0 offset = 0 elements = [] page_count = 50 # min(50, max_count - offset) while offset < max_count: page_list, results_count = _bing_search_once(query, market, page_count, offset) web_pages_count = results_count elements += page_list offset += page_count if web_pages_count <= len(elements): break return web_pages_count, elements
随后调用函数,设置查询语句并限制获取500条结果,保存到CSV:
query = 'site:linkedin.com/in intitle:founder "web3" -agent -VC' demanded_result_count = 500 print('Search for linkedin profiles') web_pages_results, results = bing_search(query, demanded_result_count) with open('./search_result.csv', 'w') as file: writer = csv.writer(file) writer.writerow(['name', 'url', 'snippet', 'language']) for result in results: row = [ result['name'], result['url'], result['snippet'], result['language'] ] writer.writerow(row)
但不管用什么查询语句,API只返回30条结果,而手动在bing.com执行相同查询能得到2900+条结果,请问代码哪里有问题?
问题原因与解决方法
- API tier的结果限制:Bing Search API的免费/基础订阅层级对单查询可获取的结果数量有严格限制,通常最多只能返回前30条结果。网页版Bing展示的是全量结果池,但API出于资源管控,会对低级别订阅用户做结果数量限制,这是核心原因。
totalEstimatedMatches的误导性:代码里用这个字段判断循环是否终止,但它只是Bing估算的总匹配数,不是实际能通过API获取到的结果数。哪怕这个数值很大,API也不会返回超过订阅层级限制的结果。- 循环逻辑的缺陷:当前循环里
offset += page_count,但如果API第一次就只返回30条(达到限制),后续请求不会再返回新结果,循环会因为web_pages_count <= len(elements)提前终止,最终结果只有30条。
解决办法
- 升级订阅层级:如果需要更多结果,升级到Bing Search API的高级订阅,高级层级最多支持单查询获取1000条结果。
- 拆分查询词:把原查询拆分成多个细分查询,比如按地区、Web3细分领域(NFT/DeFi等)拆分,分别调用API后合并结果,绕过单查询的限制。
- 优化循环终止条件:修改
bing_search函数,检查每次返回的结果数量,若不足请求的count则直接终止循环,避免无效请求:
def bing_search(query, max_count, market='en-us'): web_pages_count = 0 offset = 0 elements = [] page_count = 50 while offset < max_count: page_list, results_count = _bing_search_once(query, market, page_count, offset) web_pages_count = results_count elements += page_list # 返回结果不足请求数量,说明没有更多结果了 if len(page_list) < page_count: break offset += page_count if len(elements) >= web_pages_count: break return web_pages_count, elements
- 验证配额权限:在Azure门户查看订阅密钥对应的配额详情,确认当前订阅的结果获取上限,避免因权限不足导致的结果限制。
内容的提问来源于stack exchange,提问作者Haytorade
相关产品推荐
相关产品推荐

