调用Finnhub接口抓取AMZN历史新闻仅返回数天数据的问题咨询
问题解答
1. Finnhub接口单次拉取新闻的数量上限
- 免费套餐下,
company_news接口单次返回的新闻条目硬上限为100条,返回结果默认按发布时间倒序排列(最新内容在前)。如果指定时间范围内的新闻总量超过100条,接口会直接截断返回最新的100条,不会返回更早的内容,这就是你指定2022年1-5月范围、却只能拿到最近数天数据的核心原因。 - 付费套餐会对应提升单次返回的条目上限,但依然存在阈值,大时间跨度拉取仍需要做分片处理。
- 额外提醒:你贴出的代码里明文暴露了API Key,建议立刻到Finnhub控制台重置该Key,避免被他人盗用消耗额度。
2. 原有代码的问题判断
- 代码本身的语法、参数传参格式没有错误,
_from和to参数使用的YYYY-MM-DD格式完全符合接口要求。 - 核心缺陷是没有做时间分片拉取、结果去重的逻辑,无法突破接口单次返回的数量限制,自然拿不到全时间范围的全量数据。
可直接使用的修正代码
逻辑为把需要拉取的大时间范围拆成按周的小窗口循环请求,每次拉取一周的新闻(单周单公司新闻量基本不会超过免费版100条的上限),拉取过程中自动去重,最后统一导出。
import finnhub import pandas as pd from datetime import datetime, timedelta # 替换为你重置后的新API Key finnhub_client = finnhub.Client(api_key="替换为你的新API_KEY") symbol = 'AMZN' start_date = datetime(2022, 1, 1) end_date = datetime(2022, 5, 31) all_news = [] current_start = start_date # 按7天为一个时间窗口分片拉取 while current_start < end_date: current_end = min(current_start + timedelta(days=7), end_date) # 格式化日期为接口要求的字符串 _from = current_start.strftime("%Y-%m-%d") _to = current_end.strftime("%Y-%m-%d") print(f"正在拉取 {_from} 到 {_to} 的新闻数据") # 调用接口 chunk_news = finnhub_client.company_news(symbol, _from=_from, to=_to) all_news.extend(chunk_news) # 窗口向后滑动 current_start = current_end + timedelta(days=1) # 转成DataFrame,按新闻ID去重,避免分片边界出现重复数据 df = pd.DataFrame(all_news).drop_duplicates(subset='id') # 时间戳转日期格式 df['datetime'] = df['datetime'].apply(lambda x: datetime.fromtimestamp(x)) # 按发布时间正序排序 df = df.sort_values(by='datetime', ascending=True).reset_index(drop=True) # 导出到CSV df.to_csv('/Users/rangapriyas/Desktop/News/AMZN.csv', index=False) print(f"拉取完成,共获取有效新闻{len(df)}条")
如果拉取某段时间发现返回结果刚好为100条,说明该窗口内新闻量超限,可以把分片窗口从7天改成3天或者1天,重新拉取对应时间段即可,避免漏数。
内容的提问来源于stack exchange,提问作者Priya Saivasan
相关产品推荐
相关产品推荐

