搜尋抓取

首抓 HTML 與渲染队列:JS 頁面在蜘蛛那里要過几道關

JS 渲染頁面在蜘蛛眼里通常要過两道關:先抓 HTML,再排队渲染。本文說明两轮抓取各自能拿到什么、渲染队列常见的卡点,以及如何让關键 URL 少排队、少依赖渲染。

搜尋抓取

首抓 HTML 與渲染队列:JS 頁面在蜘蛛那里要過几道關

很多站点把内容交给前端框架渲染,HTML 源碼里只有一层骨架。蜘蛛第一次拿到這個响應时,看到的並不是用戶最终看到的頁面。理解這中間的流程,能解释不少「URL 明明在 Sitemap 里,却迟迟没有抓取反馈」的情况。

一次抓取,通常分成两步

處理 JS 頁面时,搜尋引擎一般會先做一次普通的 HTML 抓取,把响應体存下来;如果頁面里存在需要执行的脚本,且這些脚本可能影响内容或連結,這個 URL 會被放進渲染队列,等有空闲资源时再执行一次。两步不一定连續,也不一定在同一個時間点完成。

對站点来说,這意味着同一個 URL 可能在日誌里留下两次訪問记錄,而且两次請求的响應大小、耗时都不一样。看到這種情况不必紧張,它只是流程的一部分。

第一轮:HTML 里能拿到什么

第一轮决定了很多基础判断:狀態碼、canonical、meta robots、hreflang,以及 HTML 中本来就存在的 a 标簽連結。如果這些信息要等脚本执行後才寫入 DOM,第一轮就可能讀不到。

  • 連結直接寫在 HTML 里,URL 發現的路径最短;
  • 連結靠脚本拼接或点击後才插入,發現時間會被推迟;
  • canonical 由脚本寫入,容易出現两轮判断不一致。

第二轮:渲染队列的排队與超时

渲染要消耗比普通抓取多得多的资源,所以队列是有限的。队列里的等待時間取决于站点整体情况、頁面數量、渲染失敗率等因素,並没有一個可以查询的固定秒數。

常见的卡点

  • 脚本报错或依赖接口超时,頁面渲染不出内容;
  • 首屏内容在用戶交互後才出現,渲染时拿到的仍是空壳;
  • 渲染需要登入態或地理位置,抓取环境拿不到;
  • 同一模板下大量 URL 都要渲染,队列被低價值頁面占满。
渲染不是「一定發生」的兜底机制,它更像给必要頁面的一次补抓机會。越少依赖它,抓取路径越稳定。

让關键 URL 少排队的做法

  1. 把正文、标题、主要連結放進服務端返回的 HTML,至少保證首屏可见;
  2. 重要的栏目頁、詳情頁用静態 a 标簽串联,不依赖脚本跳轉;
  3. 把不必要的脚本延後或按需加载,减少渲染时的失敗点;
  4. Sitemap 只放真正需要被抓取的 URL,別把篩選组合頁全塞進去;
  5. 關注服務端渲染或预渲染方案,但不要為了渲染而堆叠多层代理。

怎么確認自己有没有卡在渲染上

  • 用抓取工具關閉脚本請求一次頁面,看核心内容是否還在;
  • 對比服務器日誌中同一 URL 的两次訪問,看第二次是否請求了脚本资源;
  • 在站長平台的抓取統計里,观察已抓取與已渲染两個口径的差异;
  • 抽查几個重点 URL,看抓取快照里的内容和用戶看到的是否一致。

如果發現大量 URL 只有第一轮记錄,重点先排查脚本错誤和接口超时,而不是急着改 Sitemap。渲染队列的優先級很难被外部手段直接提升,能做的通常是把「必须渲染才能看懂」的頁面,變成「不渲染也能看懂」的頁面。