本文將介紹如何在 GitHub Actions 上部署爬蟲並定時發送郵件,無需額外購買服務器
- 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 的小機器人(有福利哦 😏)
- 步驟
爬蟲內容就不細說了,這里以一個特別簡單的例子為例——爬取 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 到倉庫里,每次工作運行時再從倉庫獲取文件,再執行后面的邏輯即可
