站点运营

站点运营:JS 渲染自查,蜘蛛拿到的 HTML 里有多少真内容

很多站点用前端框架渲染,用戶看到的是完整頁面,蜘蛛拿到的却可能只是一层空壳。本文讲清源碼版本與渲染版本的差异,给出查看源代碼、關閉 JS、用官方工具三種自查方法,並列出常见的内容隐藏寫法和按優先級處理的思路。

站点运营

站点运营:JS 渲染自查,蜘蛛拿到的 HTML 里有多少真内容

用前端框架搭站点的人越来越多,用戶端体驗确實顺滑,但蜘蛛来訪时看到的頁面,可能和你屏幕上那一版完全不是同一個東西。這個差异不會报错,也不會有任何提示,只會悄悄体現在抓取和索引的结果里。

同一頁面,為什么會有两個版本

浏览器打開頁面後,會执行 JavaScript,再把接口返回的資料拼進 DOM,于是你看到了完整的正文、列表和推荐位。而抓取程序第一步拿到的是服務器返回的原始 HTML。是否繼續执行 JS、执行到什么程度、给多少超时時間,各家搜尋引擎的策略不同,也受自身资源限制。

结果就是同一個 URL 存在两份内容:源碼版本渲染版本。如果正文、内鏈只存在于渲染版本里,蜘蛛能不能發現它們,就變成了一個概率問题,而不是一個确定的事。

三個自查動作,十分钟能做完

一、直接看網頁源代碼

在頁面上右键選擇「查看網頁源代碼」,注意不是「检查」或「审查元素」。在源碼里搜尋正文中的几個關鍵詞,比如某個小标题、某段獨有的话。如果搜不到,說明這段内容不在初始 HTML 里。

二、關掉 JavaScript 再看一次

浏览器設定里禁用 JavaScript,或者換一個纯文本浏览器請求同一個地址。屏幕上剩下的東西,大致就是最保守情况下蜘蛛能拿到的那部分。如果此时頁面只剩導航和頁脚,正文区一片空白,問题就已经很明确了。

三、用官方工具看渲染结果

搜尋资源平台一般都會提供網址检查類的功能,能看到抓取到的 HTML 以及渲染後的對比。命令行里用 curl 請求一次也可以,注意带上常见的 UA,观察返回的 HTML 体积和内容。這些结果比猜测可靠得多。

常见的「内容藏起来」寫法

  • 正文靠接口异步加载,HTML 里只有一個空的挂载节点
  • 列表頁用無限滚動,新内容由滚動事件触發,没有可点击的分頁連結
  • Tab 切換類栏目的内容寫在前端數组里,初始 HTML 中一條都没有
  • 主導航、面包屑、相關推荐由 JS 動態生成,源碼里看不到連結
  • 图片用 data-src 存放真實地址,src 留空或是占位小图
  • 正文預設折叠,需要点击「展開全文」才發起請求

這些寫法各有各的合理性,問题不在技術本身,而在于没有区分「给用戶看」和「给蜘蛛看」這两條路径。

按優先級處理,別一次全改

  1. 先保正文。正文是頁面的核心,用服務端渲染、静態生成或预渲染把主体内容放進初始 HTML,收益最直接。
  2. 再保連結。導航、分頁、内鏈至少有一部分要寫成真實的 a 标簽,让蜘蛛顺着連結能走到下一层。
  3. 然後是元信息。标题、描述、canonical 這類标簽尽量在服務端輸出,別依赖前端插入。
  4. 最後是图片和媒体。原生 loading 属性可以在保留 src 的前提下延迟加载,比清空 src 更稳妥。

如果整站改造周期長,可以先從栏目頁和内容頁這两類關键頁面動手,其余頁面保持观察。

服務端渲染和预渲染都不是一次性的工程。改版、換接口、調整打包配置之後,源碼版本都可能回退,建议在發布前的检查清單里保留「查看源代碼」這一條。

把這件事變成习惯

内容發布流程里加一步:打開新頁面的源代碼,確認正文、标题、主要内鏈都在里面。同时留意服務器日誌中蜘蛛的訪問情况,看它抓到的地址和抓取频次有没有異常變化。發現問题时,改動往往只是几行渲染配置,但對抓取效率的影响是長期的。