iT邦幫忙

2022 iThome 鐵人賽

DAY 8
0
DevOps

其實沒有那麼難 — Docker系列 第 8

D8 - Docker 玩具 — 團隊觀戰區爬蟲

  • 分享至 

  • xImage
  •  

鐵人賽的團體組,只要團隊中任何一位成員失敗,整個團隊就算挑戰失敗,
所以我們今天的玩具,就來做個團隊觀戰爬蟲吧,

透過爬取鐵人賽的網頁,來拿到整個團體、及所有團隊的最新發文狀況,
Here we go.


需求

  1. 團隊為單位
    我想要以團隊為單位,取得每個人的發文狀況,因此最初的輸入是團隊 ID,
    此時鐵人賽報名已經截止了,因此團體組的組別不會再更動,這些 ID 就先直接寫死在程式碼裡吧。

  2. 取得最新的發文
    只看發文紀錄就可以了,不看內文。

  3. 輸出資料


需要的技術

我的程式中用到了 axios 跟 cheerio 來處理爬蟲,
邏輯大概是:

  1. 用團隊 ID 取得團隊成員
  2. 進入每一位成員的鐵人賽主頁
  3. 取得最新文章的資訊
  4. 如果目前頁面不是分頁的最後一頁,則以文章數計算頁數,進入到最後一頁再次爬取最新文章

但因為文章是介紹 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 的部分。


Dockerize

FROM node:16-slim

WORKDIR /app

COPY ./package*.json ./
RUN npm ci
COPY . .

CMD ["node", "app.js"]

同時,這一次我們加入兩個新元素: VolumeDocker Compose


Volume

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

這樣已經可以執行了,那為什麼我們還需要 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

以上,就是我今天的玩具 — 團隊觀戰區爬蟲,
想玩玩看的讀者,可以在 這裡 找到完整程式碼。


上一篇
D7 - Docker 概念架構
下一篇
D9 - 在 Gitlab CICD 使用 Build Cache 加速
系列文
其實沒有那麼難 — Docker30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言