调用Yahoo Finance API遇Elasticsearch结果窗口超限问题求助及替代方案
解决Yahoo Finance Lookup API结果超限的问题
先理清你碰到的核心问题
你调用Yahoo的finance lookup API查询A*时,收到的Elasticsearch错误提示本质是:Yahoo那边的ES集群设置了index.max_result_window=10000,限制了单次查询能返回的最大结果数。而且咱们作为API调用方,完全没有权限修改对方服务器的ES配置,所以想通过设置这个参数来绕过限制的思路从一开始就行不通。
你摸索的拆分查询方法是最优解
你提到把A*拆成更小的前缀查询,这个思路完全正确!既然没法改对方的配置,那就从查询本身下手,把大查询拆成多个小查询,每个小查询的结果都控制在10000条以内,最后再合并去重。
用Python实现拆分查询的示例代码
我给你写了一段可以直接用的代码,基于requests库,帮你自动完成拆分查询、合并结果、去重并保存成JSON的流程:
import requests import json import time from itertools import product def fetch_stock_data(prefix): # 构造API请求参数 api_url = "https://query1.finance.yahoo.com/v1/finance/lookup" request_params = { "formatted": "true", "lang": "en-US", "region": "US", "query": prefix, "type": "equity", "count": 10000, # 用Yahoo允许的最大单次返回数 "start": 0, "scroll": "true" } try: # 加延迟避免触发API限流,可根据实际情况调整 time.sleep(1) response = requests.get(api_url, params=request_params) response.raise_for_status() response_data = response.json() # 提取有效结果列表 return response_data.get("finance", {}).get("result", []) except Exception as e: print(f"查询前缀 {prefix} 时出错:{str(e)}") return [] # 第一步:生成拆分的前缀列表 # 先拆成A+单个字母的形式,比如AA*、AB*...AZ* target_prefixes = [f"A{chr(c)}*" for c in range(ord('A'), ord('Z')+1)] # 如果某些二级前缀返回结果还是超10000条,可换成三级前缀(比如AAA*、AAB*) # target_prefixes = [f"A{c1}{c2}*" for c1, c2 in product(range(ord('A'), ord('Z')+1), repeat=2)] # 第二步:批量查询所有前缀 all_stock_records = [] for prefix in target_prefixes: print(f"正在查询前缀:{prefix}") stock_results = fetch_stock_data(prefix) if stock_results: print(f"成功获取 {len(stock_results)} 条数据") all_stock_records.extend(stock_results) # 第三步:去重,避免同一股票被多个前缀匹配到 unique_stocks = [] seen_symbols = set() for stock in all_stock_records: symbol = stock.get("symbol") if symbol not in seen_symbols: seen_symbols.add(symbol) unique_stocks.append(stock) # 第四步:保存为JSON文件 with open("all_A_prefix_stocks.json", "w", encoding="utf-8") as json_file: json.dump(unique_stocks, json_file, indent=2, ensure_ascii=False) print(f"全部完成!共保存 {len(unique_stocks)} 条唯一股票数据")
代码细节说明
- 加了
time.sleep(1)是为了避免频繁请求触发Yahoo的API限流,要是碰到限流提示,可以把延迟调大到2-3秒 - 预留了三级前缀的生成逻辑,如果某个二级前缀(比如
AA*)返回的结果还是超过10000条,直接替换前缀生成代码即可 - 最后做了去重处理,防止同一股票被多个前缀重复命中(比如
AAPL会被AA*匹配到)
内容的提问来源于stack exchange,提问作者Lord-Goku
相关产品推荐
相关产品推荐

