Heroku平台Python脚本调用yfinance报错本地运行正常 求排查方案
问题原因
你遇到的报错本质是雅虎财经接口屏蔽了Heroku的出口IP段。本地运行时你的公网IP未被雅虎的反爬策略拦截,所以可以正常获取JSON格式的返回数据;而Heroku平台的服务器IP段早已被雅虎财经标记为爬虫高发地址,请求被拦截后返回空内容或者非JSON的错误页面,yfinance尝试解析空内容为JSON时就会抛出JSONDecodeError: Expecting value: line 1 column 1 (char 0)错误。
你可以通过Heroku CLI执行heroku run bash进入容器终端,手动执行curl -v "https://query1.finance.yahoo.com/v8/finance/chart/AAPL"确认返回内容,如果返回403状态码或者空响应,即可确认是IP被屏蔽的问题。
可行解决方案
- 优先升级yfinance到最新版本:老版本yfinance使用的请求规则和接口适配逻辑存在缺陷,更容易触发反爬拦截。你可以修改requirements.txt中yfinance的版本要求为
yfinance>=0.2.31,重新部署后测试。 - 禁用多线程下载:yfinance默认开启的多线程下载策略会提升雅虎的反爬触发概率,调用下载接口时添加
threads=1参数强制单线程请求:
hist_price_stock = yf.download(stock,start=startDay,end=tday, threads=1)
- 配置代理转发请求:如果升级版本和禁用多线程仍然无效,说明你使用的Heroku出口IP已经被雅虎永久屏蔽,需要在调用yfinance时配置代理参数,用未被屏蔽的IP转发请求:
hist_price_stock = yf.download(stock,start=startDay,end=tday, proxy="http://你的代理地址:端口")
- 添加重试逻辑:部分情况下拦截是临时的,你可以对yfinance的调用逻辑添加3-5次的重试机制,每次重试间隔2-3秒,规避临时限流。
内容的提问来源于stack exchange,提问作者Rapid1898
相关产品推荐
相关产品推荐

