本專案是一個高效能的商品價格追蹤與比較系統,專為台灣電商(MOMO、PChome、Coupang、SOGI)的 Apple 產品設計。
採用現代化的 混合微服務架構 (Go + Python),結合 Go 的高併發 API 處理能力與 Python 強大的網頁爬蟲生態,並透過 Redis 進行非同步任務解耦。
我們採用 Go (API 層) + Python (Worker 層) 的分離式架構,解決傳統爬蟲系統中「抓取卡住 API」的效能瓶頸。
graph TD
User[使用者 (Browser)] -->|HTTP GET/POST| Nginx[前端 (Next.js)]
Nginx -->|API Request| GoAPI[後端 API (Go/Gin)]
subgraph "Core Backend (Go)"
GoAPI -->|Read/Write| DB[(PostgreSQL)]
GoAPI -->|Push Task| Redis[(Redis Queue)]
end
subgraph "Worker Cluster (Python)"
PyWorker[Python Worker] -->|BRPOP Task| Redis
PyWorker -->|Scrape| Web[電商網站 (MOMO/PChome...)]
PyWorker -->|Save Result| DB
end
- Frontend (Next.js): 提供使用者介面,顯示價格比較表與趨勢圖。
- Backend API (Go):
- 極速回應產品列表與價格查詢。
- 負責接收爬蟲請求並派發至 Redis。
- Port:
8080
- Scraper Worker (Python):
- 背景執行,監聽 Redis
scrape_queue。 - 使用 Playwright 驅動瀏覽器進行動態網頁爬取。
- Port: 無 (僅背景執行)
- 背景執行,監聽 Redis
- Database: PostgreSQL 儲存產品與歷史價格。
- Queue: Redis 負責任務佇列與快取。
- 極速查詢: Go API 提供毫秒級的產品列表與最新價格查詢。
- 非同步爬蟲: 觸發爬蟲後立即回應,不會阻塞介面;後台 Python Worker 自動排程執行。
- 多平台支援:
- MOMO (含優惠券偵測)
- PChome
- Coupang (含回饋金偵測)
- SOGI 手機王
- 智能過濾: 自動保留每個平台最新的一筆價格,過濾重複數據。
- Docker Desktop (建議開啟)
- Git
本專案已完全容器化,只需一個指令即可啟動所有服務。
-
Clone 專案
git clone <repository-url> cd PriceCompare
-
設定環境變數
cp scraper-worker/.env.example scraper-worker/.env cp frontend/.env.example frontend/.env # 注意:backend-go 會共用 scraper-worker/.env 的設定 -
啟動系統 (Docker Compose)
docker-compose up -d --build
這會自動下載 Go/Python 映像檔、安裝 Playwright 瀏覽器、並啟動 DB 與 Redis。
-
訪問服務
- 前端頁面: http://localhost:3000
- 後端 API (Go): http://localhost:8080
- API 健康檢查: http://localhost:8080/health
你可以透過 API 手動觸發爬蟲任務:
# 爬取所有商品
curl -X POST http://localhost:8080/api/prices/scrape -d '{"product_ids": []}'
# 指定爬取特定商品 (ID: 1)
curl -X POST http://localhost:8080/api/prices/scrape -d '{"product_ids": [1]}'查看爬蟲進度 (查看 Worker 日誌):
docker logs -f pricecompare_backend_python_worker如果你希望在公司電腦(或讓家人)訪問家中運行的服務,推薦使用 Cloudflare Tunnel。這是一個免費、安全且不需要設定路由器的方案。
前提: 你的 Mac 電腦必須開機,且 Docker 服務正在運行 (docker-compose up -d)。
打開終端機 (Terminal),執行以下指令:
brew install cloudflared當家人需要使用時,在終端機執行:
cloudflared tunnel --url http://localhost:3000執行後,終端機畫面會顯示一個框框,裡面有一個隨機產生的網址,例如:
https://lazy-fox-jumps.trycloudflare.com
將這個網址複製傳給家人,他們就可以直接打開使用了!
注意:每次重新執行指令,網址都會變動。使用完畢後,在終端機按 Ctrl + C 即可關閉分享。
每當電腦重啟或需要重新啟動系統時,請在專案根目錄執行以下指令。我們建議開啟多個 Worker 以大幅提升爬取速度:
# 啟動核心服務,並同時開啟 4 個爬蟲 Worker
docker-compose up -d --build --scale backend-python-worker=4若要讓家人在公司或戶外使用,請在 Docker 啟動狀態下執行:
cloudflared tunnel --url http://localhost:3000執行後請尋找終端機顯示的隨機網址(例如 https://your-unique-id.trycloudflare.com)並分享給家人。家人用畢後,在終端機按 Ctrl + C 即可關閉通道。
若需確認背景抓取是否正常運作,可查看 Worker 的即時日誌:
# 查看 1 號爬蟲的執行狀況
docker logs -f pricecompare-backend-python-worker-1- Go 程式碼: 位於
backend-go/。修改後需docker-compose up -d --build backend-go。 - Python 爬蟲: 位於
scraper-worker/app/scrapers/。修改後需docker-compose up -d --build backend-python-worker。 - 前端: 位於
frontend/。支援熱重載,修改後重新整理瀏覽器即可。
- products: 產品基本資料 (Model, Capacity, Official Price)。
- prices: 歷史價格紀錄 (Price, Retailer, Stock Status)。
- retailers: 電商平台列表。
MIT License