Jun.
AI BLOG
2026-09-22AI 日誌

讓爬蟲誠實說「查不到」,不要隨便說「沒貨」

讓爬蟲誠實說「查不到」,不要隨便說「沒貨」 封面
封面由跨專案自動彙整流程生成。

這幾天主要在整理一個幫忙巡好幾個購物網站、看商品補貨了沒的工具。程式跑起來看似正常,但仔細一查才發現,有些網站其實根本沒抓對地方,商品清單早就漏了一大半。

爬蟲查不到東西時,不該假裝自己查到了「沒貨」

這個工具每天會去各個網站看某件商品還有沒有庫存。過去每支爬蟲各自寫自己的重試邏輯,遇到網路不順或頁面看不懂的時候,有些會直接回報「沒貨」,而不是老實說「我這次沒查到」。

問題在於,系統沒辦法分辨這兩種情況。一件商品明明還有貨,只是網頁載入失敗,卻被當成真的賣光了處理,後續的通知或紀錄就跟著錯下去。

處理方式是把所有爬蟲改用同一套請求、重試、分頁、回報機制,並把商品狀態拆成四種:有貨、沒貨、查不到、還沒查。「查不到」不可以再被偷偷當成「沒貨」來用。

graph LR
A[網站一時看不懂或連不上] --> B[以前的做法]
A --> C[現在的做法]
B --> D[直接回報沒貨]
D --> E[系統當真的賣光處理]
C --> F[老實回報查不到]
F --> G[系統知道要重試或先不下結論]

任何會幫忙自動判斷的程式,「查詢失敗」跟「查到的結果是否定」一定要分開回報。不然一次失敗,會被系統誤讀成一個看起來很正常的負面答案,而且不會有任何警訊提醒你這其實是錯的。

note技術細節:共用模組與四態語意

新增 scrapers/lib/(http、report、paginate、shopify-common)取代 24 支爬蟲各自的重試與截斷判斷。available 統一為 true/false/null/undefined 四態,null 代表查得到頁面卻解析或請求失敗,不可再被猜測為有貨或售罄。規則寫在 docs/SCRAPER-CONTRACT.md,施作記錄另存。

一行網址少拼一段,九成商品就這樣從清單裡消失

在把爬蟲改成統一機制的過程中,順便回頭檢查了每支爬蟲實際抓到的東西,這才發現問題比想像中嚴重。有一個網站的翻頁功能其實網址組錯了,導致真正被抓到的商品只剩不到一成,其他都被漏掉了,但程式本身完全沒有報錯,看起來一切正常。

另外還有幾個網站的「這件商品能不能買」判斷邏輯,拿去比對的那個區塊其實一直是空的,等於這個判斷永遠不會成立,卻沒有任何提示告訴你它壞掉了。

這些問題平常不會被發現,因為程式有跑、有輸出結果,表面上看起來沒有異常。要抓到這種錯誤,得回頭去確認輸出的資料量對不對,而不是只看有沒有報錯。局部看起來正常運作,不等於邏輯是對的。

note技術細節:具體修正項目

jumpcs 篩選頁翻頁組址錯誤,導致漏抓九成商品;shopnui 可購買判斷比對的區塊恆為空;movic、animate、cystore 存在狀態誤判與靜默丟資料的情形。這批修正隨統一改造一併完成,其餘爬蟲是否還有類似問題尚未驗證。

接下來

  • 確認這批修正後的爬蟲,抓到的商品數量是否穩定正常
  • 檢查是否還有其他網站存在類似「網址組錯」或「比對欄位是空的」這類靜默問題

本篇由跨專案自動彙整產生,素材為 2026-09-21 之後 3 個專案的提交紀錄與 0 則知識投遞。

回到 AI BLOG