直接用 schedule 库做股票行情定时抓取大概率失败,因其无异常处理、并发管理、重试机制及非交易日跳过能力;需配合 try...except、time.sleep、日志记录、交易日校验、请求头与超时设置、并发控制及数据校验等防护措施才能稳定运行。

直接用 schedule 库做股票行情定时抓取,不加防护机制的话,大概率会失败——它本身不处理异常、不管理并发、也不重试,更不会自动跳过非交易日。
为什么 schedule.run_pending() 在后台常驻容易“静默失效”
schedule 是纯内存调度器,没有守护进程能力,一旦主程序退出或抛出未捕获异常,任务就彻底停止;且它默认不记录日志,出错时你看不到任何提示。
- 必须包在
while True循环里,并套上try...except捕获所有异常(尤其是网络超时、JSON解析失败) - 每次执行后建议加
time.sleep(1),避免空转耗尽 CPU - 不要在任务函数里写
print()就算完事,至少写入文件或用logging记录时间、状态、错误信息
如何让任务只在 A 股交易日运行(避开周末和节假日)
硬写周一到周五是不够的——国庆、春节休市期间照样跑,可能拿到旧数据或触发接口限流。
- 推荐用
akshare的trade_date_hist_sina()或baostock的日历接口获取当年真实交易日列表 - 把日期判断逻辑放在任务函数开头:
if pd.to_datetime("today").strftime("%Y-%m-%d") not in trade_dates: return - 交易日列表建议每天首次运行时缓存到本地
trade_dates.json,避免重复请求
requests 请求股票接口时必须设置的关键参数
多数免费行情接口(如新浪、腾讯、AKShare 后端)对 User-Agent 和请求频率敏感,缺一不可。
-
headers至少包含{"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)..."},否则返回 403 或空数据 - 务必加
timeout=(3, 7):第一个数字是连接超时,第二个是读取超时,防止卡死 - 如果抓多个股票,别用循环直接发十几次请求,改用
concurrent.futures.ThreadPoolExecutor控制并发数 ≤3,避免被封 IP
数据落地前记得做基础校验,否则脏数据会越积越多
行情接口偶尔返回空列表、NaN 字段、时间戳错位,直接入库会导致后续分析崩溃。
- 检查关键字段是否存在:
if not data or "open" not in data[0]: return - 用
pandas.to_datetime()强转时间字段,失败则丢弃整条记录 - 保存前用
df.drop_duplicates(subset=["symbol", "date"], keep="last")去重,防止同一分钟重复写入
真正难的不是每 5 分钟跑一次,而是确保它在服务器重启、网络抖动、接口变更、节假日调休之后,还能继续安静、准确、可追溯地跑下去——这些细节没补全,schedule 只是个漂亮的倒计时器。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











