当前有一个需求,需要定时执行一个爬虫脚本,并将爬取到的数据存储到数据库中。正常来说这需要一个服务器来定时执行crontab
命令,
但是还有一种白嫖Github Actions的方法,可以省去自行处理服务器的麻烦。
前置准备
首先,如果没有自己的数据库服务器,可以选择使用一些serverless数据库,如planetscale
或 supabase
。然后在相应平台上新建数据后拿到数据库链接信息。
主要包括:
DB_URL='' // 数据库DB_USER='',DB_HOST='',DB_PORT='',DB_PASSWORD='',
这些信息属于敏感信息,要放到环境变量里。
然后,在Github上新建一个仓库,依次进入 Settings
, Secrets and variables
, Actions
选项中通过New repository secret
添加这些信息供Github Actions中的环境变量使用。
脚本和actions配置
在本地新建目录,进入目录通过pnpm init
(npm或yarn)初始化项目。
node.js脚本
根据自己需要编写node.js脚本,如在根目录下新建 scripts/everyday.js
文件,并编写爬虫和存储代码。为了演示,假设everyday.js
中仅为:
console.log('start crawlering')
然后,根目录下新建.github/workflows
目录,在该目录下新建everyday.yml
的文件,该文件是GitHub Actions的配置文件。该文件的大致内容如下:
name: everday jobon:schedule:- cron: '30 0 * * *' // 每天0点30分执行- cron: '30 12 * * *' // 每天12点30分执行jobs:doodle_crawler_console:runs-on: ubuntu-lateststeps:- name: preparerun: echo "script is starting"- uses: actions/checkout@v3- uses: pnpm/action-setup@v2with:version: latest- name: Setup Node.jsuses: actions/setup-node@v3with:node-version: 18cache: 'pnpm'- name: Install Dependenciesrun: pnpm install- name: Execute Scriptenv:DB_URL: ${{ secrets.DB_URL }} // 环境变量DB_USER: ${{ secrets.DB_USER }}DB_DATABASE: ${{ secrets.DB_DATABASE }}DB_HOST: ${{ secrets.DB_HOST }}DB_PORT: ${{ secrets.DB_PORT }}DB_PASSWORD: ${{ secrets.DB_PASSWORD }}run: node script/everyday.js
其中,定时任务的配置在schedule
下面,命令与crontab
一致。上述配置表示每天的0点30分和12点30分执行everyday.js
脚本。
最后,将代码上传至之前新建的仓库。成功后即能在仓库 Actions
选项查看任务的执行日志了。
注意事项
-
任务是否能按指定时间准时执行?
不一定,Gihub官方解释称因为服务器成本问题,定时任务有可能会排队。如果对时间要求比较高,推荐自建服务器或其他专业的定时服务。