GitHub Actions 部署爬蟲並定時發送郵件


本文將介紹如何在 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 Actions 中文文檔:GitHub Actions Documentation

GitHub Actions 官方市場:Actions Marketplace

熟悉了基本用法之后,本文將通過一個簡單的爬蟲例子,演示如何在 GitHub Actions 上部署爬蟲,並定時發送郵件

完整代碼可以從 GitHub 倉庫 shink/actions-bot 獲取,里面包含了幾個基於 GitHub Actions 的小機器人(有福利哦 😏)

  1. 步驟
    爬蟲內容就不細說了,這里以一個特別簡單的例子為例——爬取 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
1
2
👇 最后,發送郵件

- 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 到倉庫里,每次工作運行時再從倉庫獲取文件,再執行后面的邏輯即可


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM