
想買打折的球鞋,得把十幾個運動品牌官網一個個打開來看,翻完常常還是空手而回。這個網站每天自動去各家官網把折扣商品抓回來,頁面也設計成讓搜尋引擎找得到。
養一支每天自動逛街的程式,不用一家一家找
想像請一個助理,每天固定時間逛十幾家店,把打折的東西抄一份清單給你,不用自己跑十幾趟。
DealScout 就是這樣的網站,程式每天自動到 Nike、Adidas、On 等品牌官網抓折扣商品,算好折扣與省下金額存進資料庫,使用者打開網站就能看到整理好的清單。
flowchart LR A[十多個品牌官網] --> B[每天自動抓取折扣商品] B --> C[計算折扣與省下金額] C --> D[存進資料庫] D --> E[網站頁面呈現給使用者]
技術細節:整體架構
前端 Next.js 14(App Router)走 SSR/ISR,後端 FastAPI + SQLAlchemy + asyncpg 提供 API 與排程。 爬蟲用 Scrapy + BeautifulSoup,遇到 JS 渲染頁面改用 Playwright。 排程用 APScheduler,資料庫遷移用 Alembic,資料庫是 Supabase(PostgreSQL)。 前端部署在 Vercel,後端跑在容器平台上。 資料表:products / brands / scrape_logs。
頁面要讓搜尋引擎讀得懂,折扣資訊才找得到人
如果東西擺在後院、路口沒掛招牌,逛街的人再多也不會進來。要讓 Google 收錄頁面,內容得先準備好給搜尋引擎讀。
前端用能先算好頁面內容的技術,讓折扣頁面容易被收錄,帶來不花錢買廣告的自然搜尋流量,這是先想清楚流量從哪裡來,才決定技術怎麼做。
技術細節:SSR/ISR 選型
用 Next.js 14 App Router 的 SSR/ISR 產生品牌折扣頁,取代純前端 SPA,目標是讓內容被搜尋引擎索引,帶自然流量。
先砍掉貴功能,確認有沒有人想用這份尋寶清單
開店前先擺小攤子試水溫,比租大店面、辦會員系統划算。
這個網站第一版不做帳號登入和付費功能,收藏商品先用瀏覽器暫存小籃子。目的是驗證有沒有人想要這種尋寶清單,成本壓到最低,等證實有人要用再補帳號系統。
技術細節:MVP 範圍
收藏功能用 localStorage 當暫存桶,不做認證與金流。導購分潤(affiliate)與付費會員(Premium)都放在後面,尚未進到這個階段。
官網常變臉,爬蟲要當成天天要顧的活物養
抓資料的程式像哨兵,官網隨時改版,寫一次不會一勞永逸。
品牌官網的頁面結構常改,有些網站會擋掉像機器人的抓取行為,有些商品清單靠動態載入,簡單抓取只看到空白。解法是讓程式假裝成瀏覽器跑一遍,遵守規矩、放慢速度。遇過抓錯商品名稱、圖片因跨網域限制載不出來,得手動核對修正。
技術細節:爬蟲踩過的坑
靜態抓取對 JS 渲染頁無效,改用 Playwright 真實渲染。 遵守 robots.txt、隨機 2-5 秒延遲、隨機 User-Agent。 選擇器誤殺商品名、URL 解析錯誤 → 擴充標籤集合、加長度保護、逐站驗收。 商品圖跨域限制 → 統一走代理或快取。
核心體驗驗證完,我判斷長期成本撐不起,收手
品牌全部覆蓋,抓取流程驗收過沒有大問題,尋寶清單這個核心體驗算驗證完成。接下來要替各自獨立、不定期改版的品牌官網長期維護抓取程式,對抗反制機制,維護成本撐不起判斷,沒有進到正式上線、串會員與導購分潤,專案停在這裡。
留下來的是兩件事:抓資料型產品貴的地方在長期跟改版打游擊,寫第一版程式反而是最便宜的部分;早期該想清楚流量從哪裡來,SSR 加 SEO 是成本較低的解。
相關筆記:專案複盤-MOC。同期另有一條爬蟲重度專案線,尚未整理成獨立筆記。