現象
heyzo 來源搜尋一律「無結果」。8 源金絲雀 test_heyzo_canary FAIL:0 healthy, 5 returned bad/empty content。
根因(已實證,非推理)
站是活的:5 個金絲雀番號(0783/1000/1500/2000/2300)在 www.heyzo.com 與 en.heyzo.com 都回 200 + 真內容。
core/scrapers/heyzo.py 的 search() 走英文頁 → _extract_json_ld() 取 <script type="application/ld+json">。heyzo 已改成由 JS 在瀏覽器端動態建立該 script tag:
var script = document.createElement("script");
script.setAttribute("type", "application/ld+json");
var movie_obj = { "@context": "http://schema.org", "@type": "Movie",
"name": "...", "actor": person, "duration": "...", ... };
伺服器回的 HTML 裡沒有可解析的靜態 ld+json 區塊 → _extract_json_ld 回 None → search() return None。零 log、零例外(同 0.11.12 javdb 那種靜默失敗指紋)。
重現:
python -c "from core.scrapers.heyzo import HEYZOScraper; print(HEYZOScraper().search('HEYZO-0783'))" # None
curl -s https://en.heyzo.com/moviepages/0783/index.html | grep -c 'ld+json' # 1(但在 JS 裡)
修法方向
資料還在 HTML 裡,只是換了載體 — regex 撈 var movie_obj = {...} / person 兩個 JS 物件字面即可,不需要 headless 瀏覽器。
依 [feedback_scraper_real_fixtures] 慣例:補 parse 的 RED 測試要餵 tests/fixtures/scrapers/*.html 真 fixture 跑 .search(),別手搭合成 HTML(會抹平空佔位/null/merge 漏欄位)。
建議一併比照 0.11.12 javdb 補診斷 log(JSON-LD 抓不到時 log 一次 warning)— 排查本 bug 最貴的成本就是零 log。
範圍
- 與 feature/99(focal 手動編輯)無關,是外部 rot,不擋 0.12.1 出貨(pre-merge §3.6「金絲雀不擋 PR」)。
- 影響面:heyzo 單源。其餘 7 源金絲雀 PASS。
現象
heyzo 來源搜尋一律「無結果」。8 源金絲雀
test_heyzo_canaryFAIL:0 healthy, 5 returned bad/empty content。根因(已實證,非推理)
站是活的:5 個金絲雀番號(0783/1000/1500/2000/2300)在
www.heyzo.com與en.heyzo.com都回 200 + 真內容。core/scrapers/heyzo.py的search()走英文頁 →_extract_json_ld()取<script type="application/ld+json">。heyzo 已改成由 JS 在瀏覽器端動態建立該 script tag:伺服器回的 HTML 裡沒有可解析的靜態 ld+json 區塊 →
_extract_json_ld回 None →search()return None。零 log、零例外(同 0.11.12 javdb 那種靜默失敗指紋)。重現:
修法方向
資料還在 HTML 裡,只是換了載體 — regex 撈
var movie_obj = {...}/person兩個 JS 物件字面即可,不需要 headless 瀏覽器。依 [
feedback_scraper_real_fixtures] 慣例:補 parse 的 RED 測試要餵tests/fixtures/scrapers/*.html真 fixture 跑.search(),別手搭合成 HTML(會抹平空佔位/null/merge 漏欄位)。建議一併比照 0.11.12 javdb 補診斷 log(JSON-LD 抓不到時 log 一次 warning)— 排查本 bug 最貴的成本就是零 log。
範圍