使用requests请求Yahoo Screener数据遇Invalid Crumb错误,能否实现?
解决Yahoo Screener接口请求的Invalid Crumb问题
可以用requests实现,但你遇到的Invalid Crumb问题是因为Yahoo的crumb和会话Cookie强绑定,且二者都有时效性,直接复用旧的Cookie和crumb必然失效。以下是可行的解决方案:
Crumb与Cookie必须同会话获取:Yahoo的crumb是为当前浏览器会话生成的,和会话中的Cookie(核心是
B和YFP这类Cookie)一一对应。你需要在同一个requests会话中,先访问Yahoo Finance主页拿到有效Cookie和crumb,再用它们请求筛选接口。完整的请求步骤:
- 初始化requests会话,请求Yahoo Finance主页(比如
https://finance.yahoo.com/)。 - 从响应页面的源码里解析出crumb——搜索页面中的
CrumbStore关键字,就能找到对应的crumb值。 - 带着会话自动保存的Cookie,加上正确的crumb参数和完整的浏览器请求头,调用筛选接口。
- 初始化requests会话,请求Yahoo Finance主页(比如
请求头不能少:Yahoo会校验请求的
User-Agent、Accept等字段,必须和浏览器发送的保持一致,否则会被判定为非合法请求。示例代码:
import requests import re # 初始化会话,自动维护Cookie session = requests.Session() # 第一步:获取会话Cookie和crumb homepage_resp = session.get("https://finance.yahoo.com/") crumb_match = re.search(r'CrumbStore":{"crumb":"([^"]+)"', homepage_resp.text) if not crumb_match: raise Exception("Failed to extract crumb") crumb = crumb_match.group(1) # 第二步:构造筛选请求 screener_params = { "crumb": crumb, # 替换成你自己的筛选参数,比如从浏览器开发者工具里复制的scrIds、count等 "scrIds": "your_screener_id", "count": 50 } # 复制浏览器的请求头核心字段 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36", "Accept": "application/json, text/plain, */*", "Accept-Language": "en-US,en;q=0.9" } screener_resp = session.get( "https://query2.finance.yahoo.com/v1/finance/screener", params=screener_params, headers=headers ) # 输出结果 print(screener_resp.json())注意事项:Yahoo的反爬规则会不定期更新,如果还是报错,检查是否有遗漏的Cookie字段,或者尝试增加更多浏览器请求头(比如
Referer)。
内容的提问来源于stack exchange,提问作者Alfred Wallace
相关产品推荐
相关产品推荐

