为什么使用wallstreet.py循环获取期权数据的相同代码会偶发失败?
问题根因
wallstreet.py 包底层通过调用雅虎金融的公开非官方接口获取期权数据,你遇到的不稳定现象本质是触发了接口的请求频率限制(限流):
- 短时间内连续发送大量请求,服务端会临时限制你的IP访问,限制期内返回的响应数据不完整,包无法解析到你指定日期、行权价的期权,就会自动 fallback 到最近的可用期权,也就出现了你观测到的日期、行权价异常的提示
- 限流有效期过后服务端会自动恢复响应,所以运行一段时间后结果又会回归正常,和你实测的表现完全吻合
对应解决方案
- 增加请求间隔:每次拉取数据后增加短暂等待,避免短时间请求量过高触发限流,可将代码调整为如下形式:
from wallstreet import Put import time for i in range(0,100): print(i, Put('IWM', d=15, m=10, y=2021, strike=200)) # 每次请求后等待0.5秒,可根据实际拉取量调整时长 time.sleep(0.5)
- 增加重试机制:拉取数据后先校验返回的到期日、行权价是否和传入参数一致,若不匹配则等待数秒后重新请求,避免直接使用异常结果
- 增加本地缓存:如果存在重复拉取相同参数期权的场景,可将已拉取过的结果存储在本地字典或缓存中,重复请求时直接读取本地结果,无需重复调用接口
- 替换官方接口:如果有大批量拉取需求,可以申请雅虎金融官方开发者API,官方接口有更高的请求配额,稳定性远高于公开爬虫接口
内容的提问来源于stack exchange,提问作者lstacey
相关产品推荐
相关产品推荐

