iT邦幫忙

2026 iThome 鐵人賽

DAY 10
0
自我挑戰組

和AI學習gcp - 建立對話代理系列 第 10

Day10 從網際網路到雲端存儲 — 實作「隱身」爬蟲 Job

  • 分享至 

  • xImage
  •  

本日學習關鍵內容

1. Cloud Run Jobs:無伺服器任務的精髓

  • 區別 Service 與 Job:理解為什麼爬蟲不需要「對外網址」,而是需要「跑完即焚」的執行環境。
  • 成本優勢:掌握如何利用 Job 達成 0 閒置成本 的自動化任務。

2. Python 爬蟲實務:BeautifulSoup 與數據清洗

  • HTML 解析:學習使用 BeautifulSoup 從 OWASP 官網提取非結構化數據。
  • 本地/雲端雙軌存儲:實作一段邏輯,讓程式能自動判斷是在你的 MacBook Air(存入 /data)還是在 GCP(存入 GCS)。

3. Docker 跨平台打包 (Apple Silicon 專題)

  • Dockerfile 撰寫:為 Python 應用程式建立輕量化的容器映像檔。
  • -platform linux/amd64:解決 M-series 晶片與雲端伺服器之間的架構相容性問題。

4. 雲端權限整合:Service Account 實戰

  • 身分代入:讓容器在不使用 API Key 的情況下,透過「身分識別」安全地寫入你的 GCS Bucket。

Cloud run可分為 service與job, 還有function

service可以當作一個持續的服務像是一個網站 像我們的bff就是此類

job則是被一次性觸發的任務 像是爬蟲, 通常會手動或是定期的安排觸發, 而且他的超時限制極長(timeout, 可以到24小時)很適合處理大量數據

function則是被事件驅動的任務, 好比說上傳圖片後會進行標準化, 縮圖, 以及自動下標籤這種因為有圖片新增而驅動的任務

還有需要考量的是gcs的費用 gcs有四種存放的class: standard, nearline, coldline, archive

由前到後是熱到冷 有存放就會收費, 由熱到冷收費也是越便宜, 需考量資料的使用頻率

gcs和其他家服務不同的是 不同class讀取速度並沒有差異, 不過需注意提取費用與早刪費

  • Standard: 每 10,000 次讀取收 $0.004
  • Nearline: 每 10,000 次讀取收 $0.01
  • Coldline: 每 10,000 次讀取收 $0.10 (比 Standard 貴 25 倍)。
  • Archive: 每 10,000 次讀取收 $0.50 (比 Standard 貴 125 倍)。

(幣別為美金)

而早刪費則是說 檔案會收取的存取費用 不同class有不同的最小收費時間

standard是沒有minimum, nearline是30天, coldline是90天 archive是一年

也就是如果我存入一個archive檔案 但我隔天就刪掉, 還是需要支付一年的存放費用

以下列出GCS需要考慮的操作費用

1. 儲存費 (Storage Price) —— 「租金」
這是最主要的費用。只要資料存在裡面,不論你有沒有去讀它,都要付錢。
計算方式:按 GB/月 計費。
你的情況:假設你的 OWASP 爬蟲抓了 100MB 的文字檔存進去。
◦ 標準儲存 (Standard Storage) 在台灣區域大約是 0.023 USD / GB
◦ $0.1 \text{GB} \times 0.023 \approx 0.0023 \text{USD}$(大約 台幣 0.07 元)。
◦ 沒錯,這就是為什麼我說它非常便宜。
2. 操作費 (Operations) —— 「搬運工費」
當你對 GCS 進行「動作」時產生的費用。
Class A 操作:新增、覆寫、列出檔案(例如:爬蟲存入資料)。
Class B 操作:讀取檔案(例如:BFF 讀取資料)。
費用:通常是每 10,000 次操作收幾塊錢台幣。除非你的爬蟲每秒鐘都在存幾萬個小檔案,否則這部分幾乎是免費的。
3. 流量費 (Network Egress) —— 「出關費」
這部分是你最需要注意的 「陷阱」
同一區域內 (Free):如果你的 Cloud Run (BFF) 和 GCS 都在同一個區域(例如 asia-east1 台灣),互相讀取資料是 $0$ 元
跨區域或出公網:如果你從家裡的電腦把 GCS 裡的 10GB 影片抓下來,這就會產生流量費。
4. 檢索與早刪費 (Retrieval & Early Deletion) —— 「違約金」
如果你為了省錢選擇了「冷儲存 (Coldline/Archive)」,但你卻頻繁讀取它,或者存不到 30 天就刪掉,Google 會收額外的費用。
建議:開發階段一律用 Standard Storage,最彈性且沒有隱藏雜費。

爬蟲

我們除了會去owasp爬資料外 還會進行分類處理留下metadata, 方便向量化與分片

  • 識別結構:當爬蟲在爬 A01 頁面時,它就應該知道這筆資料的 categoryA01
  • 獲取版本與時間:紀錄這是 OWASP 2021 版,抓取時間是 2026-03-08。
  • 儲存格式:不要只存 .txt。建議存成 JSONL (JSON Lines)JSON

本日實作

  1. 爬蟲的python檔案
  2. local觸發爬蟲
  3. 上傳爬蟲程式, 在gcp打包成image方便之後在gcp用cloudrun job觸發
  4. 驗證gcs有新增爬蟲回來的檔案

在repo中新增 /crawler 資料夾

裡面會新增爬蟲和打包的腳本 檔案有點多 就參照repo中的資料夾吧

main.py會執行對owasp top10/2025的內容進行內容爬蟲

README中有 在local設定python環境, 在local觸發爬蟲進行測試

以及在local打包爬蟲image上傳到gcr的命令

記得指令都要在cd到crawler後執行

https://ithelp.ithome.com.tw/upload/images/20260810/20154359cJ6K3EjnbS.png

如果設定好 執行打包 gcloud builds submit --tag gcr.io/chat-bot-484615/bank-crawler:latest

(這個指令會打包原始碼成為一個壓縮檔傳給gcp, 會啟動暫時的vm, 使用dockerfile打包成image 存入gcr)

好了之後應該可以在registery看到

https://ithelp.ithome.com.tw/upload/images/20260810/20154359oqnT43PXp8.png

另外在 /terraform 中新增 crawler.tf

# (Bucket 已經在 database.tf 中的 excel_storage 定義了,不需要重複建立)
# 2. 定義 Cloud Run Job
resource "google_cloud_run_v2_job" "crawler_job" {
  name     = "bank-crawler-job"
  location = "asia-east1"

  template {
    template {
      # 連結我們建立的 Service Account (具有存取 GCS 的權限)
      service_account = google_service_account.chatbot_bff_sa.email

      # 重要:加入 VPC Connector,否則爬蟲不會透過 NAT 使用固定 IP 出外網
      vpc_access {
        connector = google_vpc_access_connector.main_connector.id
        egress    = "ALL_TRAFFIC" # 強制對外網路也走 VPC 隧道
      }

      containers {
        image = "gcr.io/chat-bot-484615/bank-crawler:latest" # 使用我們剛打包的 Image

        env {
          name  = "GCS_BUCKET_NAME"
          value = google_storage_bucket.excel_storage.name # 使用 database.tf 中的 bucket
        }

        resources {
          limits = {
            cpu    = "1"
            memory = "512Mi"
          }
        }
      }

      # 設定執行超時 (爬蟲通常很快,5分鐘綽綽有餘)
      timeout = "300s"
    }
  }
}

這邊我們會assign之前的service account與vpc access給爬蟲

並且指定打包後的image, 和用來觸發他的cloud run job

注意這邊有兩層template, 第一層是執行階段 第二層是容器層級與存取設定

執行 terraform plan , terraform apply 應該可以把cloud run job新增上gcp

此時我們就可以在cloud run jobs中看到job

https://ithelp.ithome.com.tw/upload/images/20260810/20154359pq4zVtW3oi.png

點進新增的job 執行 execute

https://ithelp.ithome.com.tw/upload/images/20260810/20154359Q24z95lt3j.png

job會執行一陣子

https://ithelp.ithome.com.tw/upload/images/20260810/20154359mhglISTN4o.png

如果執行失敗 點進去log看看訊息 問問gemini (像我第一次是這個job沒有存取gcs bucket權限)

https://ithelp.ithome.com.tw/upload/images/20260810/20154359Dv4WxV9NkT.png

job完成後去cloud storage > buckets看看

https://ithelp.ithome.com.tw/upload/images/20260810/20154359dvANDYNZz0.png

這裡就可以看到爬回來的資料

應該和local爬到結果一樣, 也可以下載來看 不過下載就是有小量讀取費


上一篇
Day9 Cloud NAT 與 Cloud Router
下一篇
Day11 Data Ingestion Pipeline
系列文
和AI學習gcp - 建立對話代理14
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言