鐵人賽的團體組,只要團隊中任何一位成員失敗,整個團隊就算挑戰失敗,
所以我們今天的玩具,就來做個團隊觀戰爬蟲吧,
透過爬取鐵人賽的網頁,來拿到整個團體、及所有團隊的最新發文狀況,
Here we go.
團隊為單位
我想要以團隊為單位,取得每個人的發文狀況,因此最初的輸入是團隊 ID,
此時鐵人賽報名已經截止了,因此團體組的組別不會再更動,這些 ID 就先直接寫死在程式碼裡吧。
取得最新的發文
只看發文紀錄就可以了,不看內文。
輸出資料
我的程式中用到了 axios 跟 cheerio 來處理爬蟲,
邏輯大概是:
但因為文章是介紹 Docker,因此就不講解爬蟲的技術細節了,等等直接快轉到開發完成。
直接看看我們的結果吧,開發的過程中,是先把東西印到終端機上:
...
[
...
{
member: {
seriesTitle: '其實沒有那麼難 — Docker',
authorName: 'Louis',
ironmanPageLink: 'https://ithelp.ithome.com.tw/users/20120541/ironman/5683'
},
latestPostData: {
title: 'D7 - Docker 概念架構',
url: 'https://ithelp.ithome.com.tw/articles/10296446',
postedAt: '2022-09-22 21:59:11'
}
},
{
member: {
seriesTitle: '新手向Android&Kotlin學習紀錄30天',
authorName: 'Yimin',
ironmanPageLink: 'https://ithelp.ithome.com.tw/users/20152479/ironman/5685'
},
latestPostData: {
title: '第8天 ConstraintLayout 詳細介紹(一)',
url: 'https://ithelp.ithome.com.tw/articles/10296812',
postedAt: '2022-09-23 12:04:56'
}
},
{
member: {
seriesTitle: '這才是真正的共同工作空間',
authorName: 'Howard',
ironmanPageLink: 'https://ithelp.ithome.com.tw/users/20107159/ironman/5711'
},
latestPostData: {
title: '生態的多樣性',
url: 'https://ithelp.ithome.com.tw/articles/10296668',
postedAt: '2022-09-23 01:56:16'
}
},
...
程式碼重構或命名就不管它了,馬上進入到 Docker 的部分。
FROM node:16-slim
WORKDIR /app
COPY ./package*.json ./
RUN npm ci
COPY . .
CMD ["node", "app.js"]
同時,這一次我們加入兩個新元素: Volume
與 Docker Compose
Volume 的用途是把 Docker container 的檔案跟外部的路徑做綁定,
在這裡,我們用來輸出爬蟲爬完的資料,寫入到檔案中,
因此我們可以在 docker run 指令中加入 --volume
參數:
sudo docker run --volume ${PWD}/logs:/app/logs ithelp-team-crawler
Volume 參數會綁定,用冒號 :
分隔開,前者是主機本身的路徑,後者是 container 內的路徑,
因此,在放在 container 內 /app/logs
位置的東西,都可以直接在主機的 ./logs
看到,
其中 PWD 變數是為了取得當前路徑,因為 --volume 參數必須是絕對路徑。
執行完,就可以看到輸出被放在 ./logs/
。
這樣已經可以執行了,那為什麼我們還需要 Docker compose 呢?
這個工具是用來以 YAML 檔定義 docker 執行時的設定,可以透過一支檔案,就把需要的參數都寫清楚,並加入到版控中,
version: "3.8"
services:
crawler:
build: .
volumes:
- ./logs:/app/logs
新版的 Docker Compose 雖然已經不再需要標註版本,但為了向下相容,因此還是加入 version
關鍵字,
於是這樣的設定,就能跟上面指令有相同的行為。
執行的方式改成了:
$ sudo docker compose up
# 若是舊版 docker compose
# $ sudo docker-compose up
以上,就是我今天的玩具 — 團隊觀戰區爬蟲,
想玩玩看的讀者,可以在 這裡 找到完整程式碼。