本文目录导读:

- 方案一:操作系统的自带任务计划(最简单,无需装软件)
- 方案二:使用 Python 的
schedule库(代码内控制,适合常驻进程) - 方案三:专业的分布式调度框架(最可靠,适合生产环境)
- 新手常见坑(避坑指南)
- 总结建议
爬虫定时运行通常有三种主流方式,具体选择取决于你的环境(本地电脑 vs. 服务器)和爬虫脚本的类型(Python、Node.js 等)。
以下是几种最常用的方案,从简单到专业:
操作系统的自带任务计划(最简单,无需装软件)
适合本地电脑或个人服务器,脚本写好后,让系统定时调用。
Windows:使用“任务计划程序”
- 打开“任务计划程序”(搜索即可找到)。
- 右侧点击“创建基本任务”。
- 触发器:设置每天/每小时/每周的具体时间。
- 操作:
- 程序或脚本:选择你的 Python 解释器路径(
C:\Python39\python.exe)。 - 添加参数:填写你的爬虫脚本路径(
D:\spiders\my_spider.py)。
- 程序或脚本:选择你的 Python 解释器路径(
- 完成,电脑需要保持开机(可以设置“睡眠”时运行)。
Linux / Mac:使用 Crontab(最经典、最稳定)
这是服务器端最常用的方式,只需编辑一个配置文件。
# 1. 打开 crontab 编辑界面 crontab -e # 2. 写入定时规则(每 5 分钟执行一次爬虫,并将日志输出到 log.txt) */5 * * * * /usr/bin/python3 /home/user/spider.py >> /home/user/spider.log 2>&1 # 3. 保存退出即可生效
Crontab 时间格式说明(5 个星号):
* * * * * 命令
┬ ┬ ┬ ┬ ┬
│ │ │ │ │
│ │ │ │ └── 星期几 (0-7, 0或7是周日)
│ │ │ └──── 月份 (1-12)
│ │ └────── 日期 (1-31)
│ └──────── 小时 (0-23)
└───────── 分钟 (0-59)
常用示例:
- 每天凌晨 2 点:
0 2 * * * 命令 - 每小时整点:
0 * * * * 命令 - 每 30 分钟:
*/30 * * * * 命令
使用 Python 的 schedule 库(代码内控制,适合常驻进程)
如果你希望爬虫持续运行,在脚本内部就控制间隔,可以使用这个库,但注意:它不能跨天(每天10点”),且进程不能中断。
import schedule
import time
def my_spider():
print("爬虫正在运行...")
# 这里放你的爬虫代码
# 设置定时任务
schedule.every(10).minutes.do(my_spider) # 每 10 分钟
schedule.every().hour.do(my_spider) # 每小时
schedule.every().day.at("10:30").do(my_spider) # 每天 10:30
print("爬虫调度器已启动,按 Ctrl+C 停止...")
while True:
schedule.run_pending() # 运行所有到期的任务
time.sleep(1) # 等待 1 秒,避免 CPU 空转
缺点: 一旦脚本被关闭,调度就停了,通常配合 nohup(Linux)或 pm2(Node.js)在后台跑。
专业的分布式调度框架(最可靠,适合生产环境)
如果你有很多爬虫,或者需要管理几千个任务,推荐使用下面的框架。
Apache Airflow(推荐,企业级)
- 原理: 通过 DAG(有向无环图)定义爬虫任务。
- 优点: 失败自动重试、日志管理、依赖管理、可视化 UI。
- 适合: 大型、复杂的爬虫管道(如:每隔1小时爬A网站 -> 清洗数据 -> 存入数据库 -> 发邮件)。
Celery + Flower(Python 生态)
- 原理: 把爬虫任务做成 Celery 任务,用定时器(Celery Beat)发送到队列中执行。
- 优点: 解耦、任务队列、可分布式执行(多台机器同时跑)。
- 适合: 高并发、需要横向扩展的爬虫。
Scrapyd + Crontab(Scrapy 专用)
- 如果你用 Scrapy 框架,可以部署到 Scrapyd 服务,然后用一个简单的脚本调用 Scrapyd API,再通过 Crontab 定时调用这个脚本。
新手常见坑(避坑指南)
-
路径问题:
- 定时任务运行时的“当前工作目录”往往不是你脚本所在的目录。
- 解决: 在脚本开头写上
import os; os.chdir("你的爬虫目录")。
-
环境变量问题:
- Crontab 或任务计划程序启动时,无法读取你
.bashrc或系统PATH。 - 解决: 在 Crontab 中写绝对路径(如
/usr/bin/python3),或者在脚本前加上source ~/.bashrc。
- Crontab 或任务计划程序启动时,无法读取你
-
日志丢失:
- 爬虫跑失败了,没有输出任何信息。
- 解决: 将标准输出和错误输出都重定向到一个文件,如
>> spider.log 2>&1。
-
重复执行:
- 如果爬虫跑得慢(比如需要 10 分钟),而定时任务设置的是 5 分钟一次,下一次启动时上一次还没跑完。
- 解决: 使用文件锁(
flock)或数据库锁,防止重复运行。
# Linux 下使用 flock 防止重复运行(独占锁) * * * * * flock -n /tmp/spider.lock /usr/bin/python3 /path/spider.py >> log.txt
总结建议
| 场景 | 推荐方案 |
|---|---|
| 个人电脑测试 | Windows 任务计划 / Mac Linux 的 crontab |
| 一台云服务器,一个爬虫 | crontab(最简单)+ flock(防冲突) |
| 爬虫需要持续运行,间隔固定 | Python schedule 库 + nohup / supervisor |
| 多任务、需管理、需监控 | Apache Airflow 或 Celery |
对于绝大多数个人爬虫项目,先试试 Crontab(Linux/Mac)或 Windows 任务计划程序,足够用了。