如何在无限运行的爬虫代码中每分钟输出csv文件?
无限运行爬虫的定时CSV导出实现方案
核心思路
直接把CSV导出操作从“脚本收尾流程”里拆出来,改成独立的周期性触发任务,完全不用等脚本停止才写文件。
落地实现步骤
- 先重构数据存储逻辑
别把抓到的聊天内容存在临时变量里等流程结束,每解析到一条新消息,就直接追加到全局可访问的内存列表/字典里,保证这个内存对象从脚本启动开始就持续累积所有抓到的有效数据。 - 选适配你现有代码结构的定时触发方式:
- 主循环内嵌计时(适合不想加额外线程的简单脚本)
设一个全局变量存“上次导出CSV的时间戳”,初始值就是脚本启动的时间。在爬虫无限主循环的每一轮末尾,算一下当前时间和这个时间戳的差,够60秒就触发一次CSV写入,写完立刻把时间戳更新成当前值,重新开始计时。
注意:如果你的抓取逻辑经常卡几十秒等页面元素,可以把这个时间判断逻辑放在每次页面请求成功的节点跑,别因为主流程阻塞打乱导出节奏。 - 独立定时线程触发(适合抓取逻辑有长阻塞的生产环境)
直接用Python标准库的threading.Timer做循环定时:- 脚本刚启动的时候创建第一个Timer实例,设60秒后跑一次CSV写入的回调函数
- 回调执行完写入操作,立刻新建下一个Timer实例,再等60秒跑一次,循环往复
注意:因为这个定时线程和主抓取线程是并行的,读写同一份内存缓存的时候一定要加线程锁,不然容易出现数据错乱、文件写了一半被改的问题。
- 主循环内嵌计时(适合不想加额外线程的简单脚本)
- 写入逻辑做长期运行适配
每次定时导出的时候直接全量覆盖写CSV,别做增量追加:把内存里存的全量数据(带表头)写到文件里就行。为了防止写到一半程序中断把文件搞坏,可以先把内容写到同目录的临时文件,写完直接重命名覆盖正式CSV,这个重命名操作是操作系统级别的原子操作,不会出损坏问题。文件操作就用with open()的上下文管理器,写完自动关句柄,不会跑久了出句柄泄漏的问题。
避坑提醒
- 完全没必要把写CSV的逻辑绑在脚本的退出分支上,就算之后要加Ctrl+C优雅退出的逻辑,只需要在退出的回调函数里额外补一次最终写入就行,平时的定时导出根本不依赖脚本停不停。
- 每次全量覆盖写的时候别忘了带头,别第一次写了后面就不写,不然打开文件的时候表头缺失,数据对不上列。
内容的提问来源于stack exchange,提问作者dav
相关产品推荐
相关产品推荐

