You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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条。

解决办法

  1. 升级订阅层级:如果需要更多结果,升级到Bing Search API的高级订阅,高级层级最多支持单查询获取1000条结果。
  2. 拆分查询词:把原查询拆分成多个细分查询,比如按地区、Web3细分领域(NFT/DeFi等)拆分,分别调用API后合并结果,绕过单查询的限制。
  3. 优化循环终止条件:修改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
  1. 验证配额权限:在Azure门户查看订阅密钥对应的配额详情,确认当前订阅的结果获取上限,避免因权限不足导致的结果限制。

内容的提问来源于stack exchange,提问作者Haytorade

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 20:35:13