使用GitHub做定期爬蟲、保存與提供資料 / Building a Scheduled Crawler and Storing as Accessible Data by GitHub Action and Pages
網路爬蟲的教學很多,但要怎麼定期執行爬蟲、又要把爬完的資料保存後供人取用,則是一個大問題。
API Crawler Example
https://github.com/pulipulichen/API-Crawler-Example
我整合了GitHub Action跟GitHub Pages等多個技術,歸納了解決方案。主要技術如下:
- GitHub Action:可設定排程執行爬蟲任務。
- 使用Docker封裝任務程式碼:這裡使用的是Node.js環境的Puppeteer跟jQuery來操作。不得不說jQuery在查找資料上還是有著無與倫比的便利性。
- NodeCacheSqlite:用SQLite做快取。這是我很久做的小程式了,一直慢慢地改進它,到現在還是覺得很好用。
- 用satackey/action-docker-layer-caching保存Docker暫存資料:不用擔心每次都要重建容器。
- 用actions/cache來保存暫存檔案:把剛剛NodeCacheSqlite快取的結果保存起來,每次跑workflow的時候都會取出來重用。
- 用JamesIves/github-pages-deploy-action把指定路徑的檔案保存到gh-pages分支。
- 用GitHub Pages把gh-pages的資料變成可供人以網址取用的靜態資料。
https://pulipulichen.github.io/API-Crawler-Example/output.json
爬完之後的結果,可以看看上面的網址。範例是定期爬「布丁布丁吃什麼?」首頁的文章標題。
自訂爬蟲 / Customize your crawler
如果要以API Crawler Example開發成自己的爬蟲的話,可以調整一下內容:
- Fork保存庫
- 編輯 app/index.js 檔案:這是執行爬蟲的進入點。裡面內容應該不難理解。
- 如果要抓資料,請使用「await GetHTML(url, options)」。預設使用Puppeteer來抓,你也可以改成fetch,會比較快。抓完資料之後會保存快取,預設是0.5天。關於GetHTML的用法,請看GetHTML.js。抓完資料後回傳的是整個網頁的HTML程式碼。
- 你可以用「$」jQuery的用法來分析HTML程式碼。jQuery分析HTML程式碼的用法主要都在Traversing類別裡,find()、each()和text()都很好用。
- 修改之後,GitHub Action應該會開始執行crawler。執行後會產生gh-pages分支。
- 在保存庫的GitHub Pages設定裡將「gh-pages」設定為公開。
- 修改「.github/workflows/crawler.yml」裡面的值調整排程時間。排程的設定是用cron的形式,內容是「分」、「小時」、「日」、「月」、「星期」。可使用每五分鐘(「*/5 * * * *」,表示每五分鐘執行)或同時指定多個時段(「0 2 * * 1,2,3,4,5」,表示週一到週五凌晨2點執行)。
如果你可以製作網路爬蟲的話,你會想要抓什麼資料呢?
下面留言喔!