如何将Yahoo Finance API的R语言修复补丁转换为Python?
Yahoo Finance V7 API Invalid Crumb 错误修复(Python实现)
问题场景
近期Yahoo Finance对其V7 API进行更新,要求所有请求必须携带Cookie。运行以下Python代码时会触发Invalid Crumb未授权错误:
原错误代码
import requests url = 'https://query2.finance.yahoo.com/v7/finance/quote?symbols=TSLA&fields=regularMarketPreviousClose®ion=US&lang=en-US' headers = { 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36' } data = requests.get(url, headers=headers) prepost_data = data.json()
错误返回信息
{"finance":{"result":null,"error":{"code":"Unauthorized","description":"Invalid Crumb"}}}
修复思路(从R方案转换)
核心逻辑是先访问Yahoo Finance的主页,获取会话Cookie和验证用的crumb值,再将这两个参数带入API请求中。
Python修复代码
import requests import re def get_yahoo_finance_data(symbol): # 初始化会话,自动维持Cookie session = requests.Session() headers = { 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36' } session.headers.update(headers) # 访问主页提取crumb值 response = session.get(f'https://finance.yahoo.com/quote/{symbol}') crumb_match = re.search(r'"CrumbStore":{"crumb":"([^"]+)"', response.text) if not crumb_match: raise ValueError("无法获取验证所需的crumb值") crumb = crumb_match.group(1) # 构造带crumb参数的API请求 api_url = ( f'https://query2.finance.yahoo.com/v7/finance/quote?' f'symbols={symbol}&fields=regularMarketPreviousClose®ion=US&lang=en-US&crumb={crumb}' ) data_response = session.get(api_url) return data_response.json() # 调用示例 if __name__ == '__main__': tsla_data = get_yahoo_finance_data('TSLA') print(tsla_data)
代码说明
- 用
requests.Session()维持会话,自动保存并携带服务器返回的Cookie - 通过正则表达式从主页HTML中提取验证必需的
crumb值 - API请求URL末尾追加
crumb参数,配合会话Cookie完成身份验证
内容的提问来源于stack exchange,提问作者Justin
相关产品推荐
相关产品推荐

