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

Django后台如何实现每30秒定期运行数据抓取函数?

定期执行爬虫函数方案选型与问题解决

多进程重复启动调度器问题根因

你之前用BackgroundScheduler遇到的重复启动问题,是因为调度器和web服务(比如Django/Flask的多worker部署)共用进程时,每启动一个服务worker进程就会初始化一次调度器,最终导致多个调度器同时触发任务。

三类可选方案对比

  • 原生APScheduler:适合无Django依赖、无其他异步任务需求的轻量场景
    解决多进程重复触发的方案:放弃和web服务共用进程,单独启动一个独立进程运行BlockingScheduler即可,完全避免多实例问题,示例代码如下:

    from apscheduler.schedulers.blocking import BlockingScheduler
    # 导入你自己的爬虫函数
    from your_crawl_module import crawl_func
    
    if __name__ == '__main__':
        scheduler = BlockingScheduler()
        # 配置每30秒执行一次
        scheduler.add_job(crawl_func, 'interval', seconds=30)
        scheduler.start()
    

    把上述代码存为单独的crawl_scheduler.py文件,单独启动该进程即可,不需要额外依赖。

  • django-apscheduler:如果你当前项目基于Django框架开发,这是成本最低的方案
    它默认将调度状态、任务执行记录存储在Django项目的数据库中,天然规避多进程重复触发的问题,不需要额外维护独立调度进程,配置门槛极低,适合对调度逻辑不熟悉的用户。

  • Celery + Celery Beat:适合项目已经接入Celery做异步任务队列的场景
    该方案支持分布式部署、任务失败自动重试、多任务优先级调度等高级能力,但需要额外维护Redis/RabbitMQ中间件、Celery Beat调度进程、Celery Worker执行进程,部署复杂度远高于前两个方案。如果你的项目本身没有用到Celery,不需要为了单个定时任务引入整套技术栈。

更优实现参考

如果你的需求仅为单服务器跑30秒间隔的爬虫任务,不需要分布式能力,还有更轻量的无代码调度方案:
在Linux服务器上写一个简单的托管脚本,用systemd或者nohup后台运行即可:

#!/bin/bash
while true
do
  # 执行你的爬虫脚本
  python3 /path/to/your/crawl_script.py
  # 等待30秒
  sleep 30
done

该方案完全不需要引入调度框架,仅需给脚本加崩溃自动重启的托管规则即可,适合极简场景。

最终选型建议

  1. 无Django、无Celery依赖:选择原生APScheduler单独跑调度进程
  2. 基于Django开发:直接用django-apscheduler
  3. 项目已接入Celery:复用Celery Beat做定时调度

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 20:06:02