搜尋抓取

JavaScript 渲染與 URL 發現:蜘蛛到底能看到哪些連結

很多站点的導航和分頁由 JavaScript 生成,蜘蛛可能拿不到連結入口。本文說明原始 HTML、渲染队列和前端路由對 URL 發現的影响,並给出服務端渲染、预渲染、内鏈和 Sitemap 配合的實用做法。

搜尋抓取

JavaScript 渲染與 URL 發現:蜘蛛到底能看到哪些連結

很多站点的導航、分頁和商品列表都由 JavaScript 在浏览器里生成。對用戶来说没問题,但對搜尋蜘蛛来说,這些連結可能压根不在初始 HTML 里。URL 發現的第一步不是“让蜘蛛执行脚本”,而是“让它不用执行脚本也能看到入口”。

蜘蛛處理 JS 的两種路径

以 Google 為例,抓取通常分两步:先請求原始 HTML,把 URL 放進抓取队列;如果頁面需要渲染,再進入渲染队列执行 JS。渲染队列有延迟,也有资源限制。其他搜尋引擎對 JS 的执行能力、等待時間和渲染覆盖率差异更大。因此,把關键連結完全交给 JS 輸出,等于把發現时机往後推,甚至可能永遠等不到。

哪些寫法會让 URL 變“隐形”

  • onclick 跳轉:用 div 或 button 绑定点击事件,而不是 a href。蜘蛛不會去点,連結地址讀不到。
  • 前端路由:單頁應用里用 history.pushState 切換 URL,初始 HTML 往往只有一個空容器。
  • 無限滚動:内容随滚動异步加载,後續頁面的 URL 没有被任何静態連結指向。
  • 分頁按钮:“下一頁”由 JS 計算生成,且没有可抓取的 href。
  • 异步菜單:分類或篩選連結在接口返回後才插入 DOM,原始 HTML 里没有。

這些寫法共同的問题是把“URL 清單”藏在执行结果里。蜘蛛如果跳過渲染,或者渲染失敗,就只剩下少量入口可走。

让關键 URL 在初始 HTML 里可见

優先保證核心路径不依赖 JS。常见做法包括:

  1. 服務端渲染或静態生成,让導航、列表、分頁在 HTML 源碼里就有 a 标簽。
  2. 對必须客戶端渲染的頁面,使用预渲染或動態渲染,向蜘蛛返回可讀的 HTML 版本。
  3. 分頁保留真實 href,例如 /list?page=2,而不是只用按钮和事件。
  4. 分類、标簽、詳情頁之間建立普通内鏈,不要全部依赖篩選组件。
  5. Sitemap 作為补充清單,但不要把它当作内鏈的替代品。
蜘蛛發現 URL 的主要路径仍然是連結。Sitemap 能提交地址,但連結位置和上下文會帮助它判断哪些頁面更值得抓取。

怎样检查 JS 里的連結是否被看到

最直接的方法是查看頁面源代碼,而不是看開發者工具里的 Elements 面板。源碼里没有的連結,就要警惕。也可以临时禁用浏览器 JS,看看頁面還能不能走出主要路径。抓取日誌里,如果渲染請求反复出現、原始 HTML 抓取後没有後續,通常說明入口不够明顯。搜尋资源平台的 URL 检查工具可以作為參考,但不同引擎表現不一致,不能只依赖單一工具。

動態渲染的取舍

動態渲染能解决“蜘蛛看不到”的問题,但也增加维護成本:需要判断哪些 User-Agent 返回渲染版,需要保持两套輸出内容一致。如果站点本身可以服務端渲染,優先選擇服務端渲染。如果只是少量营销頁或活動頁,预渲染更轻。無论哪種方案,核心目标都是让 URL 在第一次請求时就出現在 HTML 中。

小结

JS 渲染不是不能用于 URL 發現,而是不要把發現入口全部押在渲染上。把導航、分頁、詳情連結放回 HTML,让蜘蛛先用最低成本拿到地址清單,再谈抓取和更新。對站点运营来说,這比事後补 Sitemap 更稳。