Published on

用 GitHub Actions 实现定时爬虫

Authors
  • avatar
    Name
    青雲
    Twitter

背景: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 我的项目拿来用!