GitHub Actions 部署爬虫并定时发送邮件

本文介绍如何在GitHubActions上部署爬虫并定时发送邮件通知,无需额外服务器,利用GitHub提供的CI/CD工具自动执行任务。

本文将介绍如何在 GitHub Actions 上部署爬虫并定时发送邮件,无需额外购买服务器

1. GitHub Actions

GitHub Actions 是在 GitHub Universe 大会上发布的,被 Github 主管 Sam Lambert 称为 “再次改变软件开发” 的一款重磅功能(“we believe we will once again revolutionize software development.”)。于 2018 年 10 月推出,内测了一段时间后,于 2019 年 11 月 13 日正式上线

GitHub 会提供一个以下配置的服务器做为 runner:

  • 2-core CPU
  • 7 GB of RAM memory
  • 14 GB of SSD disk space

(免费额度最多可以同时运行 20 个作业,心动了有木有💘)

GitHub Actions 是一个 CI/CD(持续集成/持续部署)工具,持续集成由很多操作组成,比如 抓取代码运行测试登录远程服务器发布到第三方服务 等等。GitHub 把这些操作统称为 actions

actions 是 GitHub Actions 的核心,简单来说,它其实就是一段可以执行的代码,可以用来做很多事情。比如,你在 python 3.7 环境下写了一个 python 项目放到了 GitHub 上,但是考虑到其他用户的生产环境各异,可能在不同的环境中运行结果都不一样,甚至无法安装,这时你总不能在自己电脑上把所有的 python 环境都测试一遍吧

但是如果有了 GitHub Actions,你可以在 runner 服务器上部署一段 actions 代码来自动完成这项任务。你不仅可以指定它的操作系统(支持 Windows Server 2019、Ubuntu 18.04、Ubuntu 16.04 和 macOS Catalina 10.15),还可以指定触发时机、指定 python 版本、安装其他库等等

此外,它还可以用来做很多有趣的事,比如当有人向仓库里提交 issue 时,给你的微信发一条消息;爬取课程表,每天早上准时发到你的邮箱;当向 master 分支提交代码时,自动构建 Docker 镜像并打上标签发布到 Docker Hub 上 ……

慢慢的,你会发现很多操作在不同项目里面是类似的,完全可以共享。GitHub 也注意到了这一点,于是它允许开发者把每个操作写成独立的脚本文件,存放到代码仓库,使得其他开发者可以引用

总而言之,GitHub Actions 就是为我们提供了一个高效易用的 CI/CD(持续集成/持续部署)工作流,帮助我们自动构建、测试、部署我们的代码

具体的用法可以参考这些资料:

熟悉了基本用法之后,本文将通过一个简单的爬虫例子,演示如何在 GitHub Actions 上部署爬虫,并定时发送邮件

完整代码可以从 GitHub 仓库 shink/actions-bot 获取,里面包含了几个基于 GitHub Actions 的小机器人(有福利哦 😏)

2. 步骤

爬虫内容就不细说了,这里以一个特别简单的例子为例——爬取 CSDN 用户的 profile 信息,即 https://blog.csdn.net/sculpta 这个页面中左边一栏的访问量、排名等信息,并定时发送到邮箱

2.1 准备爬虫

可以先 star 并 fork 本仓库(推荐)或 clone

git clone https://github.com/shink/actions-bot.git

👇 修改 CSDN_ID

#!/bin/bash

set -eux

# 修改为你的CSDN_ID
CSDN_ID="sculpta"

python csdn-emailbot/spider.py $CSDN_ID

2.2 开通邮件免费发送服务

以网易邮箱为例,选择「设置」中的 「POP3/SMTP/IMAP」,打上勾 ✔ 之后保存,然后设置密码

注意:该密码不能跟邮箱密码一致

2.3 配置 GitHub Actions

触发 GitHub Actions 需要在项目仓库新建一个 .github/workflows 子目录,里面存放 YAML 格式配置文件

name: 'GitHub Actions CSDN Email Bot'

on:
  push:
    branches: 
      - master
  schedule:
    - cron: '0 14 * * *'

👆 上面代码中,name 是该配置文件的名字,on 是触发条件,我们指定两种情况下触发,第一种是向 master 分支 push 代码时触发,第二种是定时任务,每天在国际标准时间 14 点(北京时间 22 点)运行

需要注意的是,必须使用 POSIX cron 语法 安排工作流程在特定的 UTC 时间(国际标准时间,等于北京时间减去 8 个小时)运行,并且最短间隔为每 5 分钟一次

计划任务语法有五个字段,中间用空格分隔,每个字段代表一个时间单位

┌───────────── minute (0 - 59)
│ ┌───────────── hour (0 - 23)
│ │ ┌───────────── day of the month (1 - 31)
│ │ │ ┌───────────── month (1 - 12 or JAN-DEC)
│ │ │ │ ┌───────────── day of the week (0 - 6 or SUN-SAT)
│ │ │ │ │
│ │ │ │ │
│ │ │ │ │
*  *  *  *  *

可在这五个字段中使用以下运算符:

运算符描述示例
*任意值* * * * * 在每天的每分钟运行
,值列表分隔符2,10 4,5 * * * 在每天第 4 和第 5 小时的第 2 和第 10 分钟运行
-值的范围0 4-6 * * * 在第 4、5、6 小时的第 0 分钟运行
/步骤值20/15 * * * * 从第 20 分钟到第 59 分钟每隔 15 分钟运行(第 20、35 和 50 分钟)

注:GitHub 操作 不支持非标准语法 @yearly、@monthly、@weekly、@daily、@hourly 和 @reboot

👇 接下来,定义了一个名为 csdn-emailbot 的 job,其中包含许多步骤,它们会按顺序依次执行

jobs:
  csdn-emailbot:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v2

👆 上面代码中,run-on 字段指定当前 job 的运行环境为最新版的 ubuntu 系统。

接下来的 steps 中,第一步是从当前仓库中获取代码,使用的是官方提供的 checkout action 的 2.0.0 版本

- name: 'Set up Python'
  uses: actions/setup-python@v1
  with:
    python-version: 3.7
- name: 'Install lib'
  run: pip install -r ./csdn-emailbot/requirements.txt

👆 上面代码就是 部署爬虫环境 了,首先安装 python 3.7 的环境,然后通过 pip 安装所需要的 beautifulsoup4 和 requests

👇 部署完环境后,就要执行我们写好的爬虫程序了

- name: 'Working'
  run: bash ./csdn-emailbot/main.sh

👇 最后,发送邮件

- name: 'Send mail'
  uses: dawidd6/action-send-mail@master
  with:
    server_address: smtp.163.com
    server_port: 465
    username: ${{ secrets.MAIL_USERNAME }}
    password: ${{ secrets.MAIL_PASSWORD }}
    subject: CSDN Report
    body: file://email.txt
    to: shenkebug@qq.com
    from: GitHub Actions
    content_type: text/plain

👆 上面代码中,使用了一个开发者写好的 发送邮件的 action,其中需要注意的是,SMTP 服务器的用户名和密码使用的是加密变量,需要在仓库的「Settings」中设置「Secrets」,如下图所示:

其中,MAIL_USERNAME 是你开通 SMTP 服务的邮箱,MAIL_PASSWORD 是你设置的 SMTP 服务的密码(不是邮箱的登录密码

最后,将 to 修改为你要接受邮件的邮箱地址

👌 写好配置,推送到仓库以后,就可以每天晚上收到一封 CSDN profile 的邮件了

2.4 完整 yml 文件

name: 'GitHub Actions CSDN Email Bot'

on:
  push:
    branches: 
      - master
  schedule:
    - cron: '0 14 * * *'

jobs:
csdn-emailbot:
  runs-on: ubuntu-latest
  steps:
    - name: Checkout
      uses: actions/checkout@v2
    - name: 'Set up Python'
      uses: actions/setup-python@v1
      with:
        python-version: 3.7
    # - name: 'Install dependencies'
    #   run: python -m pip install --upgrade pip
    - name: 'Install requirements'
      run: pip install -r ./csdn-emailbot/requirements.txt
    - name: 'Working'
      run: bash ./csdn-emailbot/main.sh
    - name: 'Send mail'
      uses: dawidd6/action-send-mail@master
      with:
        server_address: smtp.163.com
        server_port: 465
        username: ${{ secrets.MAIL_USERNAME }}
        password: ${{ secrets.MAIL_PASSWORD }}
        subject: CSDN Report
        body: file://email.txt
        to: ${{ secrets.RECEIVER }}
        from: GitHub Actions
        content_type: text/plain

另外GitHub Actions 貌似仅支持保存在工作流程运行过程中产生的文件,当作业完成时,运行程序会终止并删除虚拟环境的实例,文件也会随之清空

如果想实现永久存储,可以利用仓库进行存储,将要保存的文件 push 到仓库里,每次工作运行时再从仓库获取文件,再执行后面的逻辑即可

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值