You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在无限运行的爬虫代码中每分钟输出csv文件?

无限运行爬虫的定时CSV导出实现方案

核心思路

直接把CSV导出操作从“脚本收尾流程”里拆出来,改成独立的周期性触发任务,完全不用等脚本停止才写文件。

落地实现步骤

  • 先重构数据存储逻辑
    别把抓到的聊天内容存在临时变量里等流程结束,每解析到一条新消息,就直接追加到全局可访问的内存列表/字典里,保证这个内存对象从脚本启动开始就持续累积所有抓到的有效数据。
  • 选适配你现有代码结构的定时触发方式:
    1. 主循环内嵌计时(适合不想加额外线程的简单脚本)
      设一个全局变量存“上次导出CSV的时间戳”,初始值就是脚本启动的时间。在爬虫无限主循环的每一轮末尾,算一下当前时间和这个时间戳的差,够60秒就触发一次CSV写入,写完立刻把时间戳更新成当前值,重新开始计时。
      注意:如果你的抓取逻辑经常卡几十秒等页面元素,可以把这个时间判断逻辑放在每次页面请求成功的节点跑,别因为主流程阻塞打乱导出节奏。
    2. 独立定时线程触发(适合抓取逻辑有长阻塞的生产环境)
      直接用Python标准库的threading.Timer做循环定时:
      • 脚本刚启动的时候创建第一个Timer实例,设60秒后跑一次CSV写入的回调函数
      • 回调执行完写入操作,立刻新建下一个Timer实例,再等60秒跑一次,循环往复
        注意:因为这个定时线程和主抓取线程是并行的,读写同一份内存缓存的时候一定要加线程锁,不然容易出现数据错乱、文件写了一半被改的问题。
  • 写入逻辑做长期运行适配
    每次定时导出的时候直接全量覆盖写CSV,别做增量追加:把内存里存的全量数据(带表头)写到文件里就行。为了防止写到一半程序中断把文件搞坏,可以先把内容写到同目录的临时文件,写完直接重命名覆盖正式CSV,这个重命名操作是操作系统级别的原子操作,不会出损坏问题。文件操作就用with open()的上下文管理器,写完自动关句柄,不会跑久了出句柄泄漏的问题。

避坑提醒

  • 完全没必要把写CSV的逻辑绑在脚本的退出分支上,就算之后要加Ctrl+C优雅退出的逻辑,只需要在退出的回调函数里额外补一次最终写入就行,平时的定时导出根本不依赖脚本停不停。
  • 每次全量覆盖写的时候别忘了带头,别第一次写了后面就不写,不然打开文件的时候表头缺失,数据对不上列。

内容的提问来源于stack exchange,提问作者dav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.26 14:15:01