📊 數位獵手的精準狙擊:打造 iPhone Price Tracker Pro 企業級比價系統
在電商百家爭鳴的時代,「價格」不再是一個靜態的數字,而是一條受演算法、節慶與庫存波動的動態曲線。對開發者而言,打造一個比價系統並不難,但要打造一個穩定、可擴展且具備工程韌性的企業級監測系統,卻是一場對架構思維的深度考驗。
今天,我想分享 iPhone Price Tracker Pro 的設計全貌——這不只是一個爬蟲工具,這是一套完整的大數據觀察站。
🏗️ 核心架構:為何選擇事件驅動與微服務?
在系統設計初期,我面臨一個經典的權衡(Trade-off):高併發的 API 請求與高延遲的爬蟲任務。
如果將兩者混在一起,爬蟲的網絡等待(I/O Wait)會直接拖垮 API 的響應速度。因此,我採用了 事件驅動架構 (Event-Driven Architecture)。
數據流轉的藝術
透過 Nginx 作為反向代理,將流量精準導向靜態資源與 FastAPI 後端。當系統需要更新價格時,API 不會親自下場抓取,而是發送一個訊號給 Redis Broker,隨後由分散在叢集中的 Celery Worker 領取任務。這種「異步解耦」的設計,確保了使用者在瀏覽圖表時,系統後端仍能同步處理成千上萬筆的電商抓取任務。
🛠️ 技術棧選型:每一項決策都是策略
技術選型不應是追求時髦,而是為了對症下藥:
FastAPI:利用其原生
async/await支援,這在處理大量 I/O bound 爬蟲請求時,能顯著提升資源利用率。PostgreSQL 15:比價系統需要處理結構化的產品資訊(ProductModels)與半結構化的平台特有數據。PostgreSQL 的 JSONB 支援與強大的事務一致性,是存儲價格歷史的最佳選擇。
Celery Beat:它是系統的「心跳」,負責在深夜 00:00 等關鍵降價時段,精準觸發排程任務。
Vue 3 + Chart.js:在前端,我們追求的是流暢的數據感。透過 Chart.js,將冰冷的資料庫記錄轉化為充滿生命力的價格軌跡。
🕸️ 攻克電商之巔:Momo 與 PChome 的實戰攻堅
爬蟲是這套系統的「感知器官」。針對台灣兩大電商,我們實施了不同的戰術:
Momo 的行為模擬:面對其嚴格的 TLS 檢測,我們優先提取 HTML 中的 JSON-LD (結構化數據),這類數據穩定且不易觸發反爬。
PChome 的逆向工程:透過分析其內部 API 接口,直接獲取 JSON 數據。這比解析網頁 DOM 快了將近 10 倍,極大地節省了 Worker 的處理時間。
✨ 工程亮點:穩定性與可觀測性
一個專業的系統,必須在沒人看見的地方也做得精緻:
時區錨定 (Asia/Taipei):在時間序列數據中,1 小時的時差就會導致歷史曲線位移。我們在後端、資料庫到前端完全鎖定台北時區,確保數據對齊。
資料庫 UPSERT 邏輯:透過
ON CONFLICT語法,我們確保了數據寫入的冪等性 (Idempotency)——即使任務重複執行,也不會造成價格歷史的混亂。結構化日誌 (Logging):我們不只記錄錯誤,更記錄「過程」。當某個電商改版時,工程師能透過日誌瞬間鎖定失效的 Selector,實現「秒級定位」。
🚀 運維體驗:Dev-Prod Parity
身為架構師,我始終堅持「環境即代碼 (IaC)」。
透過 Docker Compose,新進開發者無需在本地安裝 Python 或 PostgreSQL。只需簡單兩行指令:
git clone https://github.com/BpsEason/iphone-price-tracker-pro.git
docker-compose up -d --build
系統會自動執行 Alembic Migration 與數據初始化。這意味著,從 Clone 代碼到看到第一個價格圖表,只需要不到 60 秒。
📅 未來:從「觀察」到「預測」
目前的系統已經完成了「記錄」與「展示」。下一階段,我們將引入 Machine Learning (Prophet 模型),根據往年雙 11 與 618 的數據,預測下一個電商節慶的破盤價區間。同時,WebSocket 即時通知功能也已在開發藍圖中,讓用戶能在第一時間收到降價警報。
🎯 結語
iPhone Price Tracker Pro 不僅僅是一個工具,它是我對現代 Web 開發哲學的實踐。它告訴我們:當你把「可觀測性」、「解耦」與「自動化」刻進代碼的 DNA 裡,系統就不再是脆弱的腳本,而是一個能持續演進的生命體。
💡 你也想優化你的資料流嗎?
歡迎到我的
你想進一步了解我是如何優化 PostgreSQL 的索引,讓萬級數據查詢達到毫秒級響應的嗎?