站点运营

站点运营:JavaScript 渲染自查,別让正文只活在浏览器里

站点改用前端框架後,人工打開頁面一切正常,抓取工具拿到的 HTML 却可能接近空壳。本文给出一套可操作的渲染自查方法:對比源代碼與渲染结果、關閉脚本重新打開、检查标题正文内鏈是否在初始 HTML 中,並针對分頁、無限滚動和降級入口给出處理思路。

站点运营

站点运营:JavaScript 渲染自查,別让正文只活在浏览器里

站点用了前端框架之後,最容易出現的一種情况是:人工在浏览器里点開頁面,内容完整、排版正常;但用抓取工具或直接拉取 HTML 时,返回的却是一個空壳,正文要等脚本跑完才出現。蜘蛛是否执行脚本、执行到什么程度,不同抓取方做法不一样,也随时可能調整,把内容能不能被看到完全押在這一点上並不稳妥。所以這類自查的目的不是追求某個技巧,而是確認一件事:没有脚本时,頁面還剩什么。

先分清「看得到」和「抓得到」

浏览器里的「审查元素」面板顯示的是脚本执行後的 DOM,而「查看網頁源代碼」顯示的是服務器最初返回的 HTML。两者差別越大,說明内容越依赖客戶端渲染。做自查时要以源碼和抓取工具的视角為准,而不是以自己屏幕上的效果為准。

可以照着做的几項检查

1. 對同一批 URL 做两種方式的取回

挑首頁、栏目頁、几篇正文頁、一個列表分頁,分別用「查看源代碼」和渲染後的方式各取一份,對比正文文字量、内鏈數量、标题是否出現。差异明顯的頁面,就是需要優先處理的頁面。

2. 關掉 JavaScript 再打開頁面

在浏览器里禁用脚本後刷新,如果頁面只剩導航和一片空白,說明正文、相關阅讀、评论等内容全部由脚本注入。這不一定是错誤,但要有意识地確認哪些内容属于「希望被抓到」的部分。

3. 核查關键元素是否在初始 HTML 里

  • 頁面标题、H1、面包屑
  • 正文主体段落,尤其是首屏之後的内容
  • 指向其他内容頁的站内連結,而不是点击後才由脚本拼出来的地址
  • 图片的真實地址與 alt 文本
  • canonical、hreflang 等头部信息
  • 结构化資料所在的脚本块

4. 注意分頁與無限滚動

無限滚動在体驗上顺畅,但如果没有可抓取的静態分頁地址,列表深處的條目可能一直缺少入口。比較稳妥的做法是给滚動列表补一份带頁碼的静態連結,或者提供一個「查看全部」的列表頁。

5. 對比响應体大小和首屏内容

同一條 URL,服務器返回的 HTML 只有几百字节、渲染後却是几十 KB,說明内容基本靠脚本。返回体里正文占比越低,越值得考虑服務端渲染或预渲染處理。

几類常见問题

  • 正文放在選項卡、折叠面板、懒加载模块里,用戶不点击就不出現。
  • 内容通過接口异步拉取,接口一旦限流或报错,頁面就是空的。
  • 關键連結用按钮加事件绑定實現,源碼里只有無意义的占位标簽。
  • 不同模板渲染方式不一致,改版只改了其中一部分頁面。

處理思路

  1. 先列出「希望被抓到」的内容清單,不要全站一起動。
  2. 優先級最高的頁面改服務端渲染,让正文直接出現在初始 HTML 中。
  3. 暂时無法改動架构的,可以考虑预渲染方案,並确保渲染结果與用戶看到的一致。
  4. 保留一套不依赖脚本的降級入口,比如静態分頁、站点地图中的正文連結。
  5. 改完之後用同一批 URL 复测,對比修改前後的差异。

记錄與复查节奏

把抽查的日期、URL、源碼中的正文長度简單记下来,下次改版或換模板时就能快速判断有没有退化。建议在每次模板調整、接口改造、上线新栏目之後各抽查一次,而不是等到資料出現異常才回头找原因。

渲染方式属于技術细节,調整後的效果不會立刻反映在資料上。把「關閉脚本後頁面還剩什么」当成一條固定检查項,定期抽查,通常比一次性大改更實际。

最後提醒一句:结论尽量以多種方式對照為准,單一工具的渲染结果只能作為參考。自查的價值在于把不确定的地方變成可確認的事實,而不是找到一套一劳永逸的寫法。