動作
Feature #369
進行中
SC
ARCH-2 採集線啟動批:Booking.com C/B 雙管道 adapter+Geocoding+C-3 過濾+GAP-3 serializer 來源感知修復(536 測試綠)
Feature #369:
ARCH-2 採集線啟動批:Booking.com C/B 雙管道 adapter+Geocoding+C-3 過濾+GAP-3 serializer 來源感知修復(536 測試綠)
狀態:
New
優先權:
Normal
被分派者:
-
開始日期:
2026-07-13
完成日期:
完成比例:
0%
預估工時:
概述
ARCH-2 採集線啟動批:Booking.com C/B 雙管道 adapter+Geocoding+C-3 過濾+GAP-3 serializer 修復¶
背景¶
- 業主於 2026-07-13 透過遠端 AskUserQuestion 拍板本批方向:開始做資料採集(ARCH-2 採集線),並提供既有半成品
D:\Code\booking_helper(Python + Playwright Booking.com 爬蟲,GitHub: sashiba042/booking_helper)作參考起點。 - PM 分解界定本批範圍:Booking.com C 管道(爬蟲)真實 adapter+B 管道(手動輸入)對等 adapter(ADR-003)+Geocoding (New) 片段+C-3 評分過濾最小函式;明確不做 Agoda(Q14 未實測)、POI/天氣/活動/治安 adapter、完整 Maps 遷移、UI 整合。本批無新業主決策、無新研究問題(既有 ADR-002/003/004+OW-6 落地)。
變更內容¶
1. 工程層(真實採集 adapter 首落地)¶
-
adapters/booking_scraper_adapter.py(新):C 管道爬蟲,移植 booking_helper GraphQL 攔截骨架+滾動 DOM fallback,網路層/解析層分離(解析全純函式離線可測)。ADR-004 六決策全落地:三態保留+None 計數 WARN/詳頁候選少量爬(DETAIL_ENRICHMENT_SOFT_CAP=9,移除硬編#hotelTm498改 networkidle)/動態翻頁 id 重複偵測+PAGINATION_HARD_CAP=1000兜底(進 planning_config,【低信心】待校準)/複合鍵去重(id > name+座標 > name+address)/C-1 三欄(source_url/fetched_at/data_source)/C-9/C-10 欄位白名單。OW-6:衛浴過濾鏈整段不搬。 -
adapters/accommodation_types.py(新):AccommodationSearchResult(node, detail_url)NamedTuple——architect 覆核抓到 search→enrich 交接功能斷點(detail_url 只活在內部 dict、呼叫端無管道組配對),以具名結構接通兩階段;detail_url 維持 transient、不進 data-model、不 overload Attribution.source_url。 -
adapters/manual_accommodation_adapter.py(新):B 管道對等 adapter(同一 Protocol、非 fallback),欄位合約add_manual_entry(destination/name 必填、source_url 缺失顯式標記、評分缺失三態 pending 不靜默入推薦);可選注入 Geocoding 補座標(只補未知不覆蓋)。 -
adapters/geocoding_adapter.py(新):Geocoding (New) 片段(stdlib urllib,僅 +python-dotenv 選用依賴);C-5 key 遮罩專測防線、無 key 降級 None+WARN;C-7 對齊(address_source=PLACES 交 serializer 既有規則)。 -
filters/accommodation_score_filter.py(新):C-3 三分支(Booking/Agoda ≥8.6、Google ≥4.1、None→pending 保留),端點==門檻歸 pass 對齊條文原文;門檻不明保守 pending+WARN。 -
protocols.py:新增AccommodationSearchAdapterProtocol+Fixture 對等實作(architect 覆核:維持 in-code docstring 慣例、不進 docs/interfaces/)。 -
models/serializer.py:GAP-3 修復——manual 來源 score/price 改逐欄來源感知 persist(新鮮度改由UncertaintyFlags.must_reconfirm承載);google 轉抄保守維持剔除(C-7 定性未做);爬蟲來源維持 GAP-3 剔除不變;any() 代理判準警示樁兩處(serializer+dedup_key_for_hotel)。
2. 治理層(architect 三裁定+文件同步)¶
-
data-model.md:GAP-3 scope 精修(來源限定:Google/爬蟲→剔除、manual→persist)+§9 (1a) 錨點擴至 score/price——裁定為真設計落差非刻意簡化(B 管道業主手打值重載會消失,弱化 ADR-003 對等性),本批修。無新 ADR、無 constraint 變動、無狀態標籤變動。 -
architecture.md/ADR-004:booking_helper 路徑記載更正(舊機器 C:...→業主本次指定 D:\Code\booking_helper,保留 Q5 歷史脈絡句)。 -
open-questions.md:補 ARCH-2-followup-a~f(C-4 負載實測 P1/E8 消歧接線/B 管道比對規則整合前必解/C+B 合流 any() 條件觸發/google 轉抄 C-7 定性 regulatory/爬蟲 score 持久化評估)。
3. 品質層(devil+qa 全流程)¶
- devil 挑戰報告
docs/research/devil-advocate/2026-07-13_arch2-acquisition-batch-challenge.md(8 項,無致命項):E8 孤兒消歧函式(最尖銳,docstring 警示收口+followup-b)、E2-a destination 裸比對(標註+可觀測化)、E6 兩套 8.6 門檻(改同源常量+8 組交叉測試鎖恆一致)、E2-b/E3 WARN 可觀測性/聚合加固;E4/E5/E7 核心疑慮不成立。 - qa 測試計畫
docs/specs/test-plan-ARCH-2-acquisition.md+簽核通過:11 項檢查清單逐項裁定(重點:search→enrich round-trip 非樁確認+qa 自補 3 筆 shuffle 配對測試;GAP-3 補 save→load 完整 round-trip;零既有斷言翻轉以git status tests/全??佐證)。 - live smoke(嚴格限縮:1 目的地 1 頁 0 詳頁):GraphQL 攔截+解析命中 25 筆真實住宿,欄位名與 booking_helper 快照吻合——單次觀測,僅工程層記錄,不升 specs 標籤。
驗收標準¶
-
python -m pytest tests/ -q→ 536 passed,exit code 0(主協調者親跑覆核;362→417→486→493→518→533→536 每階段均主線複驗) - search→enrich detail_url 交接真跑通(round-trip+3 筆 shuffle 不錯位),修復前此路徑零測試覆蓋
- GAP-3 四象限:manual persist/google 轉抄剔除/爬蟲剔除/混源 [manual, google_geocoding] persist(24+2 條專測)
- ADR-004 六決策各有顯式測試(三態 WARN/複合鍵同名分館不誤刪/硬上限超界 WARN 非靜默/白名單 C+B 雙管道濾個資與照片)
- C-8:無分享/上傳路徑、爬取輸出不入版控;C-5:key 遮罩專測
- 全程零研究結論升 、無新 ADR、無新 constraint,ARCH-2 成熟度維持 (反爬穩定性等【假設】紀律入 code 註解)
關聯¶
- devil 報告:
docs/research/devil-advocate/2026-07-13_arch2-acquisition-batch-challenge.md - qa 測試計畫:
docs/specs/test-plan-ARCH-2-acquisition.md - 前置批:Feature #368(ARCH-1 Stage B D-1(b) 落地批)
- 遺留:ARCH-2-followup-a(C-4 負載實測,P1);Q14 Agoda 反爬實測;Q17 Tiqets key 未申請;S-1a 業主延後中;devil D3/D6 記錄不阻擋
沒有任何資料可供顯示
動作