蜘蛛池知识

蜘蛛池入口頁的 JS 渲染:蜘蛛看到的是原始 HTML 還是渲染後的 DOM

很多蜘蛛池入口頁把連結和正文交给 JavaScript 渲染,结果蜘蛛第一次抓取时只拿到一個空壳。本文讲清抓取的两個阶段、哪些内容容易在渲染前消失、入口頁该怎么做取舍,以及如何用源碼和日誌驗證蜘蛛真實看到的内容。

蜘蛛池知识

蜘蛛池入口頁的 JS 渲染:蜘蛛看到的是原始 HTML 還是渲染後的 DOM

做蜘蛛池的人常把注意力放在入口頁數量、域名和連結结构上,却容易忽略一個更基础的問题:入口頁的正文和連結,到底是寫在 HTML 里,還是靠 JavaScript 渲染出来的。這個差別會直接影响蜘蛛能不能在第一次抓取时就發現連結。

一、蜘蛛抓取的两個阶段

主流搜尋引擎的抓取大体分两步:先抓原始 HTML,再决定是否進入渲染队列。第一步拿到的就是服務器直接返回的那份源碼,速度快、成本低;第二步需要执行頁面上的 JS,资源開销大得多,因此並不是每個頁面都會被渲染,通常只有被判断為重要、且渲染队列有余量时才會排队。

對蜘蛛池入口頁来说,這意味着:如果連結和正文都在 JS 里,蜘蛛第一次抓取时看到的很可能是一個空壳,URL 發現效率會明顯下降。

二、哪些内容最容易在渲染前消失

  • 由前端框架客戶端路由生成的站内連結
  • 通過 fetch 或 XHR 拉取後再插入 DOM 的列表
  • 延迟加载、且原始 HTML 中没有给出 href 的内容
  • 由 JS 動態寫入的 canonical、hreflang 标簽
  • 点击後才渲染的分頁或「下一頁」按钮

這些内容在渲染後的 DOM 里存在,但在原始 HTML 中可能只有一两個容器标簽。蜘蛛若跳過渲染,就相当于没看到。

三、蜘蛛池入口頁的取舍:優先服務端輸出

蜘蛛池的入口頁大多由模板批量生成,本身结构简單,用服務端渲染或静態化輸出的成本並不高。相比之下,把入口頁做成纯前端應用,收益很小、風險很大。

入口頁的职责是發現 URL、传递連結,不是展示复杂交互。能用 HTML 直接輸出的,就不要留给 JS。

四、如果确實必须用 JS

  1. 關键連結用 a 标簽加 href 寫在服務端輸出的 HTML 里,即使後續會被 JS 替換
  2. 提供 noscript 或降級版本,至少保證主連結可訪問
  3. 對渲染成本高的頁面做预渲染或静態快照
  4. 避免用 onclick 加跳轉的方式代替真正的超連結
  5. 分頁和列表首屏尽量内联輸出,不要等接口返回

五、怎么驗證蜘蛛看到了什么

最简單的办法是用 curl 請求入口頁,或者直接查看「網頁源代碼」,看原始响應里是否包含目标連結。也可以對比「查看網頁源代碼」和「审查元素」的结果差异:前者更接近蜘蛛第一步看到的内容,後者是渲染後的 DOM。

再结合服務器訪問日誌,观察入口頁被請求时是否伴随静態资源請求。如果日誌里几乎只有 HTML 請求,而 JS 文件從未被拉取,說明渲染阶段可能根本没有發生。源碼和日誌這两份證據,比凭感觉判断靠谱得多。

六、几個常见誤区

  • 以為浏览器能看到,就等于蜘蛛能看到
  • 以為提交了 sitemap 或做了 URL 推送,就能绕開渲染問题
  • 以為 JS 渲染是更現代的做法,入口頁也照搬
  • 只检查首頁,不检查分頁和深层入口頁

這些誤区的共同点,是把用戶体驗层面的表現直接等同于抓取层面的表現,而两者並不總是一致。

寫在最後

蜘蛛池的效果受很多因素影响,渲染方式只是其中一环,但它属于低成本可優化的一類。把入口頁的關键連結和正文放回服務端輸出的 HTML 里,通常比繼續增加入口頁數量更划算。至于最终能抓到多少、收錄多少,取决于蜘蛛的調度策略和頁面整体质量,没有哪種做法能给出保證。