:::

使用GitHub做定期爬蟲、保存與提供資料 / Building a Scheduled Crawler and Storing as Accessible Data by GitHub Action and Pages

4月 05, 2023 , , 0 Comments Edit Copy Download

2023-0207-213215.png

網路爬蟲的教學很多,但要怎麼定期執行爬蟲、又要把爬完的資料保存後供人取用,則是一個大問題。


API Crawler Example

2023-0207-205107.png

https://github.com/pulipulichen/API-Crawler-Example

我整合了GitHub Action跟GitHub Pages等多個技術,歸納了解決方案。主要技術如下:

  • GitHub Action:可設定排程執行爬蟲任務。
  • 使用Docker封裝任務程式碼:這裡使用的是Node.js環境的PuppeteerjQuery來操作。不得不說jQuery在查找資料上還是有著無與倫比的便利性。
  • NodeCacheSqlite:用SQLite做快取。這是我很久做的小程式了,一直慢慢地改進它,到現在還是覺得很好用。
  • satackey/action-docker-layer-caching保存Docker暫存資料:不用擔心每次都要重建容器。
  • actions/cache來保存暫存檔案:把剛剛NodeCacheSqlite快取的結果保存起來,每次跑workflow的時候都會取出來重用。
  • JamesIves/github-pages-deploy-action把指定路徑的檔案保存到gh-pages分支。
  • GitHub Pages把gh-pages的資料變成可供人以網址取用的靜態資料。

2023-0207-211324.png

https://pulipulichen.github.io/API-Crawler-Example/output.json 

爬完之後的結果,可以看看上面的網址。範例是定期爬「布丁布丁吃什麼?」首頁的文章標題。

自訂爬蟲 / Customize your crawler

如果要以API Crawler Example開發成自己的爬蟲的話,可以調整一下內容:

  1. Fork保存庫
  2. 編輯 app/index.js 檔案:這是執行爬蟲的進入點。裡面內容應該不難理解。
    1. 如果要抓資料,請使用「await GetHTML(url, options)」。預設使用Puppeteer來抓,你也可以改成fetch,會比較快。抓完資料之後會保存快取,預設是0.5天。關於GetHTML的用法,請看GetHTML.js。抓完資料後回傳的是整個網頁的HTML程式碼。
    2. 你可以用「$」jQuery的用法來分析HTML程式碼。jQuery分析HTML程式碼的用法主要都在Traversing類別裡,find()each()text()都很好用。
  3. 修改之後,GitHub Action應該會開始執行crawler。執行後會產生gh-pages分支。
  4. 在保存庫的GitHub Pages設定裡將「gh-pages」設定為公開。
  5. 修改「.github/workflows/crawler.yml」裡面的值調整排程時間。排程的設定是用cron的形式,內容是「分」、「小時」、「日」、「月」、「星期」。可使用每五分鐘(「*/5 * * * *」,表示每五分鐘執行)或同時指定多個時段(「0 2 * * 1,2,3,4,5」,表示週一到週五凌晨2點執行)。

如果你可以製作網路爬蟲的話,你會想要抓什麼資料呢?

下面留言喔!