tw-house-ops 專案遷移:Taiwan → Ireland + agent-browser 改 Playwright CLI(含愛爾蘭版首次 E2E 測試)¶
文檔資訊
- 分類: architecture
- 難度: intermediate
- 預估閱讀時間: 10 分鐘
- 標籤:
playwright-cli,house-ops,ireland,real-estate-pipeline,project-migration,591,daft-ie,agent-browser,cloudflare-captcha,dublin-rental
摘要¶
將台灣版房產搜尋 pipeline(tw-house-ops)完整遷移為愛爾蘭版,同時將抓取層從 agent-browser 改為 Playwright CLI。涵蓋市場規則轉換(Central Bank 4x/3.5x LTI、HTB、FHS、RPZ)、8+ 個核心 mode 文件重寫、591 價格系統性落差發現、以及愛爾蘭版首次 E2E 測試結果(Daft.ie Cloudflare 封鎖、€1,300 預算只能租 studio/room share、BER 資料實際可取得但 pipeline 未能擷取的 bug、PDF URL 錯誤、merge-tracker.mjs 手動步驟讓用戶不滿要求自動化)。
關鍵學習¶
-
591.com.tw 搜尋結果顯示的價格與實際刊登頁面租金存在系統性落差(12,000-20,000 vs 23,000-46,000/月),必須透過瀏覽器實際造訪才能取得正確價格
-
agent-browser 方式效率差(每物件需 70-90 次 tool calls,8-12 分鐘/物件),改用 Playwright CLI 可大幅提升批次抓取效率
-
房產評估 pipeline 架構可跨市場移植:scan → pipeline → evaluate → compare → visit 的模式適用於台灣與愛爾蘭
-
愛爾蘭市場關鍵規則:FTB 4x income / Non-FTB 3.5x income(Central Bank LTI)、HTB 最高 EUR 30k、FHS 最高 30% shared equity、RPZ 租金每年漲幅上限 2%
-
建築風險評估需針對市場調整:台灣(921 地震、輻射屋)→ 愛爾蘭(pyrite IS 398、mica IS 465、pre-1970s 石棉、無授權擴建)
-
Daft.ie 部署 Cloudflare Turnstile CAPTCHA,agent-browser 完全無法通過,必須退回 WebSearch(Level 3)抓取快取結果,導致資料不完整
-
都柏林 €1,300/月預算範圍內,整租市場幾乎只剩 studio 或 room share,這是市場現實而非資料問題
-
BER 資料實際已顯示在 Daft.ie 物件頁面(用戶親眼確認),但 pipeline 未能正確擷取,是待修復的 bug 而非資料缺失
-
評估邏輯(分數維度、報告格式、pipeline 流程)是市場無關的,市場知識(法規、稅制、portal URL)是可替換的參數層
-
merge-tracker.mjs 需手動執行的問題讓用戶明確表達不滿,自動化整合是高優先修復項
技術細節¶
專案架構
tw-house-ops 是一個以 Markdown mode 文件驅動的房產評估 pipeline,核心文件包含:
modes/scan.md— 從 portal 抓取物件清單,產生 pipeline.md 條目modes/pipeline.md— 批次處理待評估物件,呼叫 rent/buy modemodes/rent.md/modes/buy.md— 個別物件深度評估modes/afford.md— 購屋負擔能力試算modes/switch.md— 換屋/換市場試算modes/compare.md— 多物件比較modes/visit.md— 看屋清單與談判策略config/profile.yml— 用戶偏好與財務條件portals.yml— 各 portal URL template
愛爾蘭市場轉換重點
# 台灣 → 愛爾蘭 關鍵映射
currency: TWD → EUR
area_unit: 坪 → m²
mortgage_rule:
TW: 貸款成數由銀行自訂,約 8成
IE_FTB: 4x gross income, 10% deposit (Central Bank)
IE_mover: 3.5x gross income, 20% deposit
government_schemes:
TW: 青安貸款(2%優惠利率)
IE: HTB (up to EUR 30k refund) + FHS (up to 30% shared equity)
rent_regulation:
TW: 無強制限制
IE: RPZ (Rent Pressure Zone) 每年漲幅上限 2%
price_reference:
TW: 實價登錄(government registry)
IE: PPR (Property Price Register)
591 價格抓取問題
WebSearch 抓取的 591 搜尋結果顯示價格(12,000-20,000/月)與 agent-browser 實際造訪頁面確認的租金(23,000-46,000/月)存在顯著落差,7 個物件中有 6 個因此被 SKIP。推測原因: 1. 搜尋結果可能顯示社宅補助後價格或已下架物件快取 2. 591 搜尋 API 回傳資料可能有延遲或不完整
Playwright CLI 遷移動機
agent-browser 每次物件評估需要 70-90 次 tool calls,耗時 8-12 分鐘/物件。Playwright CLI 可將抓取層獨立出來,批次執行後輸出結構化資料,再交給 Claude 進行評估邏輯,大幅降低 token 消耗與延遲。
愛爾蘭版 E2E 測試結果(2026-04-13)
Dublin 租屋掃描:預算 €1,300/月、Dublin 1 附近 1 小時通勤範圍
- Daft.ie Cloudflare Turnstile CAPTCHA 封鎖 agent-browser,全數退回 WebSearch(Level 3)
- 找到 24 筆物件,預算內(≤€1,300)只有 4 筆:Rathcoole 獨棟(3.⅗)、Clongriffin room share(3.7/5)、Mark's Lane D2 room share(3.8/5)、Rathmines studio(3.9/5)
- BER 資料在物件頁面實際可見(用戶親眼確認),但 pipeline 未正確擷取(待修復)
- PDF 輸出功能存在物件 URL 錯誤問題
- merge-tracker.mjs 需手動執行,用戶明確表達不滿
What Changed¶
Phase 1:台灣版 pipeline 運作驗證
先在台灣青埔(A18/A19 區)跑了 7 個租屋 + 5 個買屋物件的完整 pipeline,確認架構可運作。發現 591 搜尋顯示價格與實際頁面價格系統性落差,青埔新大樓含車兩房實際行情 23,000-30,000/月,遠超 20,000 預算。唯一完整評估物件(001 青商路)得 3.⅘,買屋唯一評估物件(008 永泰路明日朗朗)得 3.7/5。
Phase 2:agent-browser → Playwright CLI 遷移決策 + 台灣版 → 愛爾蘭版完整重寫
用戶發現 agent-browser 效率差(70-90 tool calls/物件)後,決定遷移至 Playwright CLI。同步進行台灣版 → 愛爾蘭版重寫,共 8+ 個核心文件全部改寫:CLAUDE.md、README.md、modes/_shared.md、config/profile.example.yml、portals.yml、modes/rent.md、modes/buy.md、modes/afford.md、modes/switch.md、modes/scan.md、modes/pipeline.md、modes/compare.md、modes/visit.md、templates/states.yml。
Phase 3:愛爾蘭版首次 E2E 測試(確認與新增發現)
以 Dublin 租屋(€1,300/月預算)進行首次完整測試。確認三個問題:(1) Daft.ie 的 Cloudflare CAPTCHA 封鎖所有 agent-browser 存取;(2) 用戶親眼確認 BER 資料在 Daft.ie 物件頁面可見,但 pipeline 未擷取(pipeline bug 確認);(3) PDF 輸出的物件 URL 有誤。用戶對 merge-tracker.mjs 需手動執行明確表達不滿,要求找出自動化解法。都柏林市場現實是 €1,300/月預算內整租選擇極為有限,3.9/5 的 Rathmines studio 是最佳選項。
So What¶
這個遷移案例展示了一個以 Markdown mode 文件驅動的 AI-assisted pipeline 如何跨市場移植。核心洞見是:評估邏輯(分數維度、報告格式、pipeline 流程)是市場無關的,市場知識(法規、稅制、portal URL)是可替換的參數層。
愛爾蘭版首次 E2E 測試揭露了幾個關鍵問題:Daft.ie Cloudflare 封鎖使 Level 1 抓取完全失效,需要替代方案;BER 資料可取得但未被擷取是需要修復的 bug(已由用戶親眼確認);€1,300 預算在都柏林的市場現實(只有 studio/room share)是真實市場資訊而非爬蟲問題。
591 和 Daft 的爬蟲障礙(價格快取落差 vs Cloudflare CAPTCHA)說明:任何依賴 portal 搜尋頁面的 pipeline 都需要多層備援(agent-browser → WebSearch → 手動),且搜尋結果必須透過實際造訪物件頁面二次驗證。
用戶對 merge-tracker.mjs 手動步驟的強烈反應(「如果還要靠我手動,那我要你幹嘛?」)說明 pipeline 中任何需要手動介入的步驟都是嚴重痛點,自動化整合是高優先項目。
Trade-offs¶
- agent-browser vs Playwright CLI:agent-browser 無需額外設定但 token 消耗大(70-90 tool calls/物件);Playwright CLI 需維護獨立腳本但可批次執行且 token 消耗低
- Markdown mode 文件 vs 程式碼:Markdown 易於人工編輯與理解,但缺乏型別檢查、版本控制困難、容易出現格式不一致
- 單一 repo 多市場 vs 分 repo:單一 repo 共用 pipeline 架構,但需要在文件中清楚區分市場特定內容,避免混淆
- scraping 即時性 vs 快取:直接 scraping portal 取得最新資料,但速率限制和頁面結構變化是持續維護成本。Daft.ie 的 Cloudflare 封鎖使 Level 1 完全失效,WebSearch(Level 3)只能取得快取結果且資料不完整
- Level 1(agent-browser)vs Level 3(WebSearch):Level 1 資料最即時但 CAPTCHA 是硬性障礙;Level 3 無 CAPTCHA 問題但資料可能過時且物件數量偏少
Try It Fast¶
# 快速驗證 Playwright CLI 是否可抓取 Daft.ie 物件
npx playwright install chromium
npx playwright screenshot --browser=chromium \
"https://www.daft.ie/for-rent" \
daft-test.png
# 或用 Playwright CLI codegen 記錄 BER 擷取路徑
npx playwright codegen https://www.daft.ie/for-rent
# portals.yml 愛爾蘭版範例結構
rent:
daft:
url_template: "https://www.daft.ie/{county}/rental/"
search_params:
min_beds: "{min_bedrooms}"
max_rent: "{max_budget_eur}"
buy:
daft:
url_template: "https://www.daft.ie/{county}/residential-property-for-sale/"
myhome:
url_template: "https://www.myhome.ie/residential/search"
reference:
ppr: "https://www.propertypriceregister.ie/"
Recommendation¶
- 優先修復 BER 擷取 bug:用戶親眼確認 BER 資料在 Daft.ie 物件頁面可見,需更新 rent.md/buy.md 的資料擷取邏輯以正確抓取 BER 欄位,這是影響評估準確性的重要 bug
- 自動化 merge-tracker.mjs 整合:用戶明確表達不接受手動步驟(「如果還要靠我手動,那我要你幹嘛?」),需在 pipeline 完成後自動執行 merge-tracker.mjs,解決 Bash 權限問題或改用其他整合方式
- 建立 Daft.ie Cloudflare 備援方案:Level 1 agent-browser 被 Cloudflare CAPTCHA 封鎖是硬性障礙,考慮:(a) 先在一般瀏覽器開啟 Daft.ie 建立 cookies 後給 agent-browser 繼承;(b) 使用 playwright-extra + stealth plugin 規避偵測;© 將 Level 3 WebSearch 提升為主要掃描路徑,補充 MyHome.ie 作為第二 portal
- 修復 PDF 輸出的 URL 問題:PDF 報告中的物件 URL 有誤,需在生成 PDF 前驗證 URL 是否與 pipeline.md 的來源 URL 一致
- 在 scan mode 加入二次驗證步驟:搜尋結果抓取後,對每個物件實際造訪頁面確認價格,避免 591/Daft 搜尋快取問題(台灣版已確認,愛爾蘭版亦存在類似風險)
- 將市場規則集中管理:Central Bank LTI、HTB 上限等規則散落在各 mode 文件中,集中到 config/ 目錄方便法規更新時集中修改
- 建立 BER 評級最低門檻的快篩邏輯:BER 低於 D 或無 BER 證書應在 Phase 1 直接 SKIP(類似台灣版的樓層/屋齡快篩)