如何在Python的Flask Web服务器上自动运行一个数据采集脚本

想做一个工业数据监控的 B/S 系统,服务器定时采集底下硬件的数据,用户可以通过浏览器访问服务器看到实时数据。现在 flask 服务器架好了,底下数据采集的 py 脚本也写好了,但我不知道如何能让服务器一启动就一直运行那个定时采集数据的脚本,然后这个采集上来的数据应该怎么传递?
如何在Python的Flask Web服务器上自动运行一个数据采集脚本

4 回复

方法 1 :定时执行数据采集脚本
方法 2 :采集脚本常驻运行


在Flask服务器上自动运行数据采集脚本,一个常见且推荐的做法是使用APScheduler库。它可以在Flask应用上下文中创建和管理后台调度任务,与你的Web服务无缝集成。

下面是一个完整的示例。我们创建一个Flask应用,并在其启动时,设置一个每10分钟运行一次的数据采集任务。

首先,确保安装了必要的库:

pip install flask apscheduler

然后,创建你的应用文件(例如 app.py):

from flask import Flask
from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.triggers.interval import IntervalTrigger
import atexit
import logging

# 配置日志,方便查看任务执行情况
logging.basicConfig()
logging.getLogger('apscheduler').setLevel(logging.DEBUG)

app = Flask(__name__)

# 这是你的数据采集函数
def data_collection_job():
    print("数据采集任务开始执行...")
    # 在这里编写你的实际数据采集逻辑
    # 例如:调用API、爬取网页、查询数据库等
    # try:
    #     # your collection code here
    #     print("数据采集完成")
    # except Exception as e:
    #     print(f"数据采集出错: {e}")
    print("模拟数据采集完成")

# 创建调度器
scheduler = BackgroundScheduler(daemon=True)
# 添加一个间隔触发器任务,每10分钟执行一次
scheduler.add_job(
    func=data_collection_job,
    trigger=IntervalTrigger(minutes=10),
    id='data_collection_job',
    name='每10分钟执行数据采集',
    replace_existing=True
)

# 在Flask应用启动后启动调度器
if not scheduler.running:
    scheduler.start()
    # 应用退出时关闭调度器
    atexit.register(lambda: scheduler.shutdown())

@app.route('/')
def index():
    return 'Flask服务器正在运行,数据采集任务已在后台调度。'

if __name__ == '__main__':
    # 注意:在生产环境中不要使用debug=True
    app.run(debug=True)

核心要点:

  1. 使用BackgroundScheduler:它会在后台线程中运行,不会阻塞Flask的主线程。
  2. 任务定义:将你的数据采集逻辑封装成一个函数(如data_collection_job)。
  3. 添加作业:使用scheduler.add_job()来定义任务的执行规则(这里用了IntervalTrigger)。
  4. 生命周期管理:在Flask应用启动时启动调度器(scheduler.start()),并使用atexit确保应用退出时优雅关闭调度器。

运行与验证: 直接运行 python app.py。启动后,除了Flask服务,你会在控制台看到每10分钟输出一次“数据采集任务开始执行…”。你的实际采集代码应替换data_collection_job函数中的print语句。

一句话总结:用APScheduler在Flask后台挂个定时任务最省事。

数据可以保存到数据库,也可以存储到本地文件,在网站里面读数据

1.把脚本写入服务器的自启动服务项里
2.采集的数据存数据库

回到顶部