博客 / 詳情

返回

零成本 API 服務搭建,用 GitHub Actions 自動爬取文章?

前言

本着將成本降到最低,我目前做的應用或小程序都是單機的,也就是不用請求接口,只要一上架就沒有任何支出。但是寫死的數據畢竟有限,應用的內容單一無法緊跟時事熱點,每次打開一個樣,自然就沒有留存。遇到有錯字啥還要更新版本,那有沒有方法既能豐富應用內容,又不用增加成本呢?

既要又要,當然也有,找網上提供的免費 API 接上去。但是這種有請求數限制,而且還和自己應用的業務不相關,那就只能自己弄接口了。

既然可以在 GitHub 上搭靜態博客,那整一個靜態 API (json 文件),時不時地更新或提交新的 json 文件上去,在 C 端應用上不也看起來像是動態的了。所以下面就實踐一下如何在 GitHub 上搭建 API 服務,以及如何自動化更新數據(部署爬蟲)?

圖片

API 服務搭建

方法和之前在 GitHub 上搭建 Hexo 類似,就是給倉庫開啓 GitHub Pages,可以自行綁定域名,也可以用之前主倉設置的域名後面帶當前倉庫名訪問。當前域名要備案過了,然後用訪問資源的方式能訪問到 json 文件 (xml、csv 等) 就可以了。
圖片

定時爬蟲部署

要實現自動化更新數據,那就要定時手動上傳和直接爬蟲爬取,可以通過 GitHub Actions 工作流的方式實現,下面第一次使用的方式演示如何創建並運行 workflow。

創建推送 TOKEN

因為生成了 json 文件需要自動推送到倉庫,為了不用輸入賬號密碼並使用 PAT,這個和之前 Hexo 搭建時獲取的一樣。settings->developer settings->github apps->personal access tokens->tokens (classic),然後選擇 “Generate new token (classic)”。

TOKEN 權限設置

設置名稱,有效時間,勾選權限,主要的把 repo、workflow、user、write:discussion 以及 admin 開頭的全勾上,如果不想選都選上也可以。最後創建後就會顯示 token 值,記得把那個 ghp 開頭的字符串複製下來,不然後面就看不到了。這裏再説一下 PAT 下的 Fine-grained tokens 和 Tokens (classic) 的區別,上面比 Tokens (classic) 權限控制更精細,安全性更高,而且無法設置不能失效的 Token。
圖片

測試 TOKEN

是否可用用 git 命令運行,換成自己的 token 和倉庫報錯了則説明該 TOKEN 無效

git push https://x-access-token:換成你的TOKEN@github.com/z11r00/你的倉庫.git HEAD

創建工作流

打開倉庫後,點擊 Actions,然後點擊 New workflow,set up a workflow yourself 後提交。git 拉取後會在項目中生成一個.github 文件夾,依次點進去是剛才創建的工作流 yml 文件。
圖片

圖片

Yml 配置説明

name:工作流名稱,展示在用於表示工作流。
on:觸發事件,schedule 定時 | push 推送 | pull_request pr 請求,定時任務下有一個 cron 的五個 * 分別是分 時 日 月 星期(, 分割字段多值 - 定義範圍 / 指定間隔頻率)。
workflow_dispatch: 是否允許在 github actions 操作選項卡中手動操作,默認是可以。
jobs:任務執行的定義。
runs-on: 用於任務執行的運行器,可以説是操作系統,其他的還有 windows 等,具體參考文檔,下面會貼出。
steps: 步驟,工作流依次執行的步驟,每個都有一個名字和具體的運行指令,可以使用 actions 包 (github 提供的集成程序,比如用於檢出倉庫代碼的,python 環境的等等)。

圖片

爬蟲工作流

以下定義一個每天八點十分(不一定準時),先是用 TOKEN 檢出倉庫中的所有代碼,然後設置 python 環境後安裝指定依賴,運行 script 目錄下的 ArticleSpider.py 腳本,最後將腳本里生成的 json 文件提交併推送到倉庫。

# 工作流名稱
name: article_spider
# 事件:schedule 定時 | push 推送 | pull_request pr請求
on:
  schedule:
    # 分 時 日 月 星期 (*每次都 ,分割字段多值 -定義範圍 /指定間隔頻率)
    - cron: '10 0 * * *' # 每日8:10,時間點執行任務,注意時區(UTC, 0+8)

  # 是否可在github操作選項卡手動運行
  workflow_dispatch:

# 定義任務
jobs:
  build:
    # 任務運行器(切換可參考文檔)
    runs-on: ubuntu-latest

    # 步驟
    steps:
      # 使用到的actions包(用於克隆當前倉庫的所有代碼)
      - name: Checkout repository
        uses: actions/checkout@v3
        with:
          ref: main
          token: ${{ secrets.PUSH_TOKEN }}  # 自定義的個人推送TOKEN
      - name: Set up Python
        uses: actions/setup-python@v2
        with:
          python-version: '3.x'
      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install requests
          pip install lxml
      - name: execute py script
        env:
          FM_USERNAME: ${{ secrets.USERNAME }}
        run: |
          python script/ArticleSpider.py
      - name: 列出所有文件
        run: |
          ls -l
      - name: Commit changes
        run: |
          git config --local user.email "2652364582@qq.com"
          git config --local user.name "bqs"
          git add .
          git commit -m "Add changes" || echo "No changes to commit"
          git push origin main

ArticleSpider.py

腳本因為對方站點是一個前後端分離的項目,頁面的列表和詳情都是用異步請求的方式。所以這種抓取就比較好辦,寫一個 while 循環,頁碼不斷累加的請求接口,判斷有超過某時間點的文章則跳出循環。在循環中將數據保存到指定的目錄下的 json 文件中,當然也可以自己調整數據,如果要分頁就按固定條數分文件。
圖片
 
圖片

圖片

運行效果

雖然是定時的,但也可以去 GitHub 控制枱手動運行。打開 Actions,選擇工作流名字進去,最後 Run workflow 就等待執行了。詳細也可以看到腳本里打印出的日誌,執行完畢再回到倉庫查看是否有 json 文件生成。
圖片
圖片

寫在後面

以上只是演示,如果真要弄自己的 API 還是得對爬取的數據做一下處理,拓展一下是不是還可以用這種方式,實現一個帶後台管理的資源 “動態網站”。但是應用也不光只有展示,還有提交部分,所以要想零成本實現將用户數據存儲下來就要用到另一些方法了,最後 GitHub Actions 用法也遠不止於此……

安利

QQ小程序:實用工具箱

user avatar yilezhiming 頭像 frontoldman 頭像 dashnowords 頭像 yihan123 頭像 xiaojt 頭像 niaonao 頭像 zhuomoxiansheng_5f1901de6fd23 頭像 ni_5e1946a1c2171 頭像 zuckjet 頭像 lllllxt 頭像 shumin_5bd11c2a4b889 頭像 yubaolee 頭像
24 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.