- Published on
用 GitHub Actions 实现定时爬虫
- Authors
- Name
- 青雲
背景:AI 资讯网站的定时数据拉取需求
我最近开发了一个 AI 资讯聚合网站,需要每天定时从各大数据源拉取最新内容。最初的想法很简单:写个 Node.js 爬虫脚本,配合定时任务,自动拉数据,存到数据库。结果一上手,发现“定时”这事儿,远比想象中复杂。
三种定时方案的踩坑记录
方案一:传统服务器 + Docker + PM2
思路:
- 用 Docker 跑 Node.js 爬虫脚本
- PM2 守护进程,crontab 定时拉数据
踩坑总结:
- 还得单独搞台服务器,维护 Docker、pm2、定时任务,太重了
- 服务器安全、备份、监控都要自己操心
- 和 Vercel 主站完全割裂,环境变量同步麻烦
失败案例:
我一开始用这套方案,结果发现自己网站是部署在 Vercel 上,根本没服务器环境,白忙活一场。副业根本不想再搞一台云主机,直接 Pass。
方案二:Vercel Serverless Cron
思路:
- 用 Vercel 的 Serverless Cron Job,定时触发 API 路由,拉数据
避坑指南:
- Vercel 免费版定时函数最多只能跑 10 秒,爬虫一多直接超时
- 免费额度下定时任务经常丢,生产不靠谱
- 环境变量管理混乱,日志排查不便
- 复杂爬虫逻辑根本跑不起来,只能做极简采集
失败案例:
我把爬虫逻辑精简到极致,每次只拉一条数据,还是经常超时。Vercel 的 serverless 环境不适合重型定时任务,适合轻量 API。
方案三:GitHub Actions 定时任务(最终选型)
思路:
- 用 GitHub Actions 的定时 workflow,直接跑 Node.js 爬虫脚本,数据写入 Supabase
为什么选它?
- 免费额度充足,每天几十次任务完全够用
- 支持定时触发(cron),配置灵活
- 天然支持 Node.js、pnpm、TypeScript,CI/CD 环境一应俱全
- Secrets 管理方便,安全性高
- 日志可查,失败自动通知
代码落地:.github/workflows/collect-data.yml
name: Collect Data
on:
schedule:
- cron: '0 0,12 * * *' # 每天 0 点和 12 点(UTC)
workflow_dispatch:
jobs:
collect:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: pnpm/action-setup@v2
with:
version: 8
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Run crawler
run: pnpm tsx scripts/collectDataToSupabase.ts
env:
SUPABASE_URL: ${{ secrets.SUPABASE_URL }}
SUPABASE_KEY: ${{ secrets.SUPABASE_KEY }}
开发工具包:
- 推荐用 act 本地调试 GitHub Actions,省时省力
- 常用 shell 脚本:一键清理 node_modules、重置依赖、日志归档
避坑指南:
- secrets 配置别忘了,敏感信息千万别写死在代码里
- workflow_dispatch 可以手动触发,调试超方便
- 千万别在 for 循环里直接 await 数据库插入,血亏 3 小时调试,性能直接拉胯!
最终效果:
GitHub Actions 局限与注意事项
不过,GitHub Actions 定时任务虽然好用,但也有一些实际限制需要注意:
- 最小间隔:定时任务最短只能设置为每 5 分钟一次,无法做到更高频率。
- 时区问题:cron 字段只能使用 UTC 时间,不能直接指定为其他时区。如果需要本地时间触发,需要自行换算。
- 延迟和不准时:由于 GitHub Actions 负载、排队等原因,定时任务可能存在延迟,实际运行时间与设定时间有偏差,甚至可能被跳过。
- 配额限制:免费额度下每月有运行时间限制(如 2,000 分钟),超出后需付费。
- 仓库活跃度:如果仓库 60 天内无活动,定时任务会自动被禁用。
避坑建议:
如果你对定时精度要求极高(比如金融、抢票等场景),建议考虑专用定时任务平台(如阿里云函数计算、腾讯云定时触发器)或自建服务。
方案对比总结
方案 | 优点 | 缺点/坑点 | 适用场景 |
---|---|---|---|
Docker+PM2 | 灵活、可控、无时间限制 | 需自有服务器,维护成本高 | 企业/重型任务 |
Vercel Cron | 零运维、集成简单 | 执行时间极短、无持久化、易超时 | 轻量API/小型任务 |
GitHub Actions | 免费、长时间运行、易集成 | 定时精度有限、配额/活跃度限制 | 个人/开源/副业项目 |
结语
踩了这么多坑,最终我选择了 GitHub Actions 方案,既省心又免费,适合大多数个人/副业/开源项目。如果你也在做定时爬虫、数据同步,强烈建议先试试 GitHub Actions,遇到极端需求再考虑自建服务。
欢迎留言交流你的踩坑经历,或直接 fork 我的项目拿来用!