搜尋抓取

連結藏在 JS 里:蜘蛛拿到的首屏 HTML 為什么没有可走的路径

蜘蛛先拿到的是服務器返回的 HTML,渲染是後一步且不一定發生。如果連結只存在于 JS 渲染之後,新 URL 就進不了抓取队列。本文梳理容易造成 URL 發現断档的几種寫法,介绍服務端渲染、预渲染和 HTML 兜底清單的做法,並给出用頁面源碼、無 JS 訪問和服務器日誌自查的具体步骤。

搜尋抓取

連結藏在 JS 里:蜘蛛拿到的首屏 HTML 為什么没有可走的路径

蜘蛛先看到的是 HTML,不是渲染後的頁面

大多數搜尋引擎的抓取分两步走:先請求 URL,拿到服務器返回的 HTML;如果资源允许,再排队执行頁面里的 JS,把渲染後的 DOM 解析一遍。問题在于第二步不是必然發生,也常被延後。如果連結只存在于渲染之後,蜘蛛在第一轮就只能看到一個空壳,新 URL 自然進不了待抓取队列。

哪些寫法容易让 URL 發現断档

  • 列表、卡片用 div 加 onclick 或事件监听跳轉,HTML 里根本没有 href。
  • 分頁用按钮加前端狀態管理,翻頁不改變地址,蜘蛛分不清“下一頁”在哪。
  • 用 hash 路由,例如 /list 後面挂 #page=2,這段通常不會作為獨立 URL 被抓取。
  • 相關内容、推荐位在首屏之後异步加载,且没有任何静態兜底。
  • 整站共用一套前端模板,源碼里只有一個挂载节点和一段打包脚本。

這几類寫法的共同点是:用戶看得见,蜘蛛第一轮看不见。

把路径交出去的几種做法

服務端渲染或静態生成

首屏 HTML 直接带上 a 标簽,是把發現成本降到最低的方案。列表頁、詳情頁、導航区這些“路径节点”尤其值得優先處理,蜘蛛不需要等 JS 就能顺藤摸瓜。

预渲染關键入口

暂时改不動整站架构时,可以對分類頁、文章列表頁、专题頁做预渲染,把連結寫進 HTML。覆盖主要入口即可,不必追求全站都渲染。

用 HTML 兜底清單

在頁面底部或一個专门的“全部内容”頁面里,用真實 a 标簽列出各栏目入口。即使主列表是 JS 渲染的,蜘蛛也有路可走。注意別做成几千條連結的大杂烩,按栏目分组、控制數量,兜底清單是补充,不是堆連結的地方。

Sitemap 與内鏈是兜底,不是替代

Sitemap 能帮助發現 URL,但它不表達頁面之間的關系;内鏈的锚文本和层級,才决定蜘蛛先走哪條路、走多深。两條都做,只是把可發現性补齐,並不意味着蜘蛛一定會来抓。

怎么自查有没有断档

  1. 關掉 JS 打開頁面,看主要連結是否還点得到。
  2. 查看頁面源碼而不是审查元素,搜尋 href 是否真的出現在源碼里。
  3. 用服務器日誌比對:日誌里出現過的 URL 數量,和站点實际 URL 數量差多少,差距大的通常是 JS 渲染的栏目。
  4. 抽几個新發布的頁面,看它們第一次被請求时,入口来自哪里。

渲染鏈路的稳定性也在影响抓取

依赖前端渲染的站点,對外部接口和资源的依赖更多。接口慢、超时、間歇性 5xx 出現时,蜘蛛拿到的 HTML 可能是残缺的,連結自然也残缺。服務器稳定性和渲染鏈路的稳定性,本质上是同一條抓取路径上的两段。

让每個重要頁面在“没有 JS 的世界”里也有一條走得通的路,是 URL 發現里最省事的一道保險。