Python调用yfinance下载股票数据触发SSLCertVerificationError求助
问题本质
你遇到的表层无数据报错是yfinance的异常捕获逻辑吞了底层SSL错误导致的误导性提示,核心原因是机构内网部署了HTTPS流量审计/解密网关,会替换出站请求的SSL证书做中间人检测,而requests+certifi默认的信任根证书库没有收录你所在机构的内部根证书,所以校验不通过。雅虎站点本身的公网证书是合法的,问题出在你所在网络的链路证书替换上,升级依赖自然解决不了问题。
合规解决方案(符合机构信息安全管控要求)
优先用下面两种方案,不会违反安全规定:
- 方案1:将机构根证书加入certifi全局信任库
- 联系机构IT运维获取内网SSL解密用的根证书文件(通常为
.pem/.crt格式) - 执行以下代码获取当前Python环境的certifi证书存储路径:
import certifi print(certifi.where())- 打开上述路径输出的
cacert.pem文件,把你拿到的机构根证书的完整文本内容追加到文件末尾,保存后直接运行原有yfinance代码即可,不需要修改业务代码。
- 联系机构IT运维获取内网SSL解密用的根证书文件(通常为
- 方案2:自定义请求会话指定证书路径(不修改全局配置)
如果不想改动全局依赖的证书配置,可以给yfinance传入自定义的requests会话,单独指定证书路径:import yfinance as yf import requests # 替换为本地存储的机构根证书文件实际路径 ORG_ROOT_CERT = "/local/path/to/your_org_root_ca.pem" req_session = requests.Session() req_session.verify = ORG_ROOT_CERT df = yf.download('AAPL', period='5d', session=req_session)
临时调试方案(严禁在生产/合规管控环境使用)
仅做本地临时调试时可以关闭证书校验,该操作违反信息安全管控要求,不建议长期使用:
import yfinance as yf import requests from requests.packages.urllib3.exceptions import InsecureRequestWarning # 关闭证书校验的警告提示 requests.packages.urllib3.disable_warnings(InsecureRequestWarning) req_session = requests.Session() req_session.verify = False df = yf.download('AAPL', period='5d', session=req_session)
验证方法
如果要确认确实是SSL问题,可以跳过yfinance直接用requests发起请求,会抛出明确的SSL校验错误,不会被yfinance的异常逻辑吞掉:
import requests test_url = "https://query2.finance.yahoo.com/v8/finance/chart/AAPL" response = requests.get(test_url) print(response.status_code)
内容的提问来源于stack exchange,提问作者amit_python
相关产品推荐
相关产品推荐

