搜尋抓取

JS 渲染出来的連結:蜘蛛什么时候才走得到這些入口

頁面在浏览器里連結齐全,源碼里却可能只有几個 a 标簽,差別就在 JavaScript 渲染。本文說明蜘蛛先抓原始 HTML、後排队渲染的两步流程,列出 onclick 跳轉、接口拼装、懒加载等容易让連結“晚到”的寫法,並给出把關键入口放回 HTML 的實操思路。

搜尋抓取

JS 渲染出来的連結:蜘蛛什么时候才走得到這些入口

很多站点在浏览器里看结构完整,導航、列表、相關推荐都能点,連結一大堆;但把頁面源碼打開,可能只有寥寥几個連結。中間的差距,就是 JavaScript 渲染。對搜尋蜘蛛来说,這两份内容並不是同一件事:源碼里的連結可以顺着走,渲染後才出現的連結需要額外一步,能不能走到、什么时候走到,取决于站点怎么實現,也取决于蜘蛛愿不愿意為這個頁面再花一次资源。

源碼里的連結和渲染後的連結,是两批入口

蜘蛛第一次拿到頁面时,看到的是服務器直接吐出的 HTML。這一步通常很快,也基本不执行脚本。HTML 里有什么 a 标簽,就有什么入口。渲染一般發生在後面的某個阶段:先抓原始 HTML,把需要渲染的 URL 排進队列,等有空闲资源时再执行一次 JS,拿到渲染後的 DOM,再從中提取連結。

這中間存在時間差。源碼里就有連結的頁面,可能很快被繼續往下走;只能靠渲染才出現的連結,就要等下一次調度。對于层級深、數量大的站点,這個差值會被放大,新頁面被發現的時間也更难预估。

常见的几種“連結晚到”寫法

  • 用 onclick 或 JS 跳轉代替 a href:代碼里没有真實的 href,抓取阶段看不到目标地址。渲染後如果补上了 a 标簽,還有机會;如果只是绑定事件,通常就断在這里。
  • 列表内容由接口返回後再拼装:首屏 HTML 里只有骨架,文章或商品連結全靠請求接口後插入 DOM,能不能被發現取决于渲染是否被触發。
  • 懒加载與“加载更多”:需要滚動或点击才出現的連結,一次渲染未必能拿全。
  • 折叠菜單、Tab 切換里的入口:預設收起的内容,有时並不在初始 DOM 中。
  • 依赖用戶狀態:連結只在登入、選擇地区後出現,蜘蛛以匿名狀態訪問时看到的是另一套内容。

把關键入口放回 HTML 更稳妥

不必把所有東西都改成服務端渲染,但導航、面包屑、分類列表、詳情頁的核心出口這類结构性入口,最好在原始 HTML 里就有真實可点的 a href。

  1. 優先保證一級、二級導航和列表分頁是静態連結。
  2. 用渐進增强的思路:先輸出連結,再用 JS 增强交互,而不是反過来。
  3. 必须靠接口拼装的模块,考虑服務端先渲染一次,或者提供一個静態的“全部”頁作為兜底入口。
  4. Sitemap 可以作為补充的發現路径,但它替代不了内鏈结构,层級關系和權重传递仍然靠連結维持。

怎么確認蜘蛛确實走到了

最直接的办法是對照服務器日誌:看渲染型頁面被抓之後,紧接着有没有出現它内部連結目标的請求。按 UA 過滤日誌,观察某個新入口第一次被請求的時間,也能看出發現路径是否通畅。如果長期只有頁面本身被抓,下游連結一條都没被請求,基本可以判断這些入口没被走通。

另一個常见誤区是把渲染当成必然步骤。渲染有成本,站点頁面越多、越重,能進入渲染队列的比例可能越低。把入口寫在源碼里,等于主動把這份不确定性降下来。

一句话總结:能被蜘蛛顺着走的連結,通常是 HTML 里那種寫死的 a href;渲染出来的連結只是“可能被發現”,而不是“一定被發現”。结构性的入口,尽量別只留给 JS。