網站收錄

服務端返回的 HTML 里没有正文:依赖前端渲染时的收錄核對顺序

用浏览器看頁面一切正常,但抓取工具返回的 HTML 里正文却是空的——這類頁面的收錄問题往往出在渲染方式上。本文從“爬虫到底拿到了什么”入手,梳理前端渲染影响内容與連結發現时的核對顺序,並說明可以從哪些頁面先動手調整。

網站收錄

服務端返回的 HTML 里没有正文:依赖前端渲染时的收錄核對顺序

用浏览器打開頁面,正文、图片、评论都正常顯示,但在“查看網頁源代碼”或抓取工具返回的响應里,正文区域却是空的。這種頁面往往不是内容质量問题,而是渲染方式的問题:搜尋引擎第一次拿到的是服務端返回的 HTML,里面没有内容,後面能不能补上,取决于它是否愿意再花资源执行頁面脚本。

先分清你看到的是哪一份頁面

日常在浏览器里看到的,是脚本执行完之後的 DOM;而爬虫首先拿到的是服務器返回的原始 HTML。两者经常不是一回事。核對时可以用几種简單方式對比:

  • 在浏览器里右键“查看網頁源代碼”,搜尋正文中的關鍵詞,看是否出現;
  • 用抓取工具或命令行請求该 URL,看响應内容里有没有正文和連結;
  • 在浏览器設定中關閉 JavaScript 再刷新頁面,观察還剩下什么。

如果關閉脚本後頁面几乎只剩框架和占位符,說明核心内容依赖渲染。這时再讨论收錄,就不是内容差异度的問题,而是内容有没有被拿到的問题。

渲染能力有差別,不要預設所有引擎都會执行脚本

主流搜尋引擎具备一定的渲染能力,但渲染通常要排队,消耗的资源也比直接讀取 HTML 高。對抓取预算有限的站点来说,依赖渲染的頁面在處理顺序上往往更靠後,延迟也更明顯。不同引擎對脚本的支持程度並不一致,把關键内容完全交给前端,等于把不确定性留在了收錄鏈路的第一环。

常见的“内容藏在渲染之後”的情况

  • 正文由接口异步返回,初始 HTML 只有骨架;
  • 内容預設折叠,需要点击“展開更多”才顯示;
  • 列表采用無限滚動,首屏之後的資料靠後續請求加载;
  • 選項卡切換的内容,未選中的部分不在初始 HTML 中;
  • 图片使用 data-src 懒加载,初始 HTML 里没有真實图片地址。

這些做法對用戶体驗未必是坏事,但要判断其中哪些内容是你希望被搜到的,哪些只是辅助展示。希望被搜到的部分,最好在初始响應里就能看到。

連結發現同样受影响

内容之外,入口也常被忽略。如果站内跳轉用的是 onclick 事件、button 元素或前端路由,而不是可点击的 a 标簽,爬虫在初始 HTML 里就找不到目标地址。列表頁、分頁、相關推荐如果全部由前端渲染,深层頁面缺少可跟随的連結,發現速度會明顯變慢。检查时可以在關閉脚本的情况下走一遍站内導航,看還能不能顺着連結到達重点頁面。

可以按這個顺序核對和調整

  1. 先確認初始 HTML 里有什么:正文、标题、内鏈、canonical 是否齐全;
  2. 把最需要被收錄的正文改為服務端輸出,或做预渲染;
  3. 站内跳轉恢复成标准的 a 标簽連結,避免只靠脚本跳轉;
  4. 列表和分頁提供可抓取的連結入口,不依赖首次請求之外的加载;
  5. 首屏之外的内容如果重要,考虑改為服務端分頁或獨立 URL;
  6. 改完後對照服務器日誌,看爬虫拿到的响應是否包含正文,再观察收錄變化。

不必全站推倒重来

全站改成服務端渲染成本不低,也没有必要。可以先按頁面價值排序:承担搜尋流量的詳情頁、栏目頁優先處理,交互性强、本就不指望被搜到的功能頁保持現状即可。判断标准很简單——這個頁面希望被搜到吗?如果希望,就在初始 HTML 里给它一份完整内容。

收錄問题的排查顺序,通常是先看爬虫拿到了什么,再看它是否選擇收錄。渲染方式影响的是前者,而這往往是後面所有环节的前提。

最後提醒一点:渲染方式的調整不會立刻带来收錄變化,索引更新有自身节奏。把响應 HTML 里的内容补齐、把連結入口理顺,剩下的交给時間和持續的日誌观察。