很多人排查收錄时會遇到一種情况:自己在浏览器里明明看到頁面上有完整内容,但在搜尋结果里,這段内容却像是從来不存在。排查时先別急着怀疑爬虫,先看看這段内容是怎么出現在頁面上的——如果它依赖 JavaScript 渲染或者用戶交互才出現,爬虫第一次拿到的 HTML 里可能根本没有它。
抓取和渲染不是同一件事
搜尋引擎處理一個 URL 通常分两步:先從服務器取回 HTML,再决定是否执行頁面里的脚本、等待内容渲染出来。第二步在资源上更贵,所以會排队、會有取舍,不是每個頁面都能立刻完成渲染。這意味着“能抓取”和“能讀到内容”之間還隔着一段距离。
這也是為什么同一個站点里,静態輸出的頁面和纯前端渲染的頁面,收錄表現常常不一样。前者内容在第一次响應里就到位,後者要等引擎愿意再跑一遍脚本。
哪些寫法容易让内容“迟一步”出現
- 图片和视频的文字信息放在懒加载的容器里,初始 HTML 只有占位符;
- 列表只加载第一頁,“下一頁”由滚動或点击触發,接口返回的資料不在 HTML 中;
- 選項卡、折叠面板里的内容只在点击後才請求;
- 價格、库存、评论等由前端接口填充,HTML 里是空模板;
- 整站使用客戶端路由,路由切換不产生新的服務端响應。
這些寫法的共同点不是“技術上不行”,而是把内容放到了需要額外動作才能到達的位置。渲染资源充足时可能没事;渲染来不及或脚本报错时,内容就缺席了。
折叠内容與懒加载不完全一样
需要区分两種“看不见”。
- 折叠但仍存在于 HTML:比如用 CSS 隐藏、用 details/summary 實現的面板。内容已经在文档里,只是預設不展示,通常仍會被解析。
- 初始 HTML 里没有:内容要等脚本执行、接口返回後才插入 DOM。這類情况風險更高,因為它依赖渲染是否發生。
同样是“需要点開才能看到”,两者對收錄的影响並不相同。排查时看頁面源代碼(不是開發者工具里渲染後的 DOM)就能分辨:能搜到那段文字,属于前者;搜不到,属于後者。
一段可操作的自查流程
- 用浏览器“查看網頁源代碼”,搜尋頁面核心文案或關键資料,確認是否在原始响應里;
- 用 URL 检查工具查看渲染後的 HTML 與截图,對比是否與用戶所见一致;
- 临时關閉 JavaScript 刷新頁面,看還剩下多少實质内容;
- 检查站点是否對爬虫返回了與用戶不同的内容,避免無意中造成内容不一致;
- 在服務器日誌里確認這些 URL 是否被請求過,以及請求时返回的狀態碼。
處理思路:让重要内容先到位
不需要把整站都改成服務端渲染,優先處理那些真正需要被搜尋到的頁面就够了。
- 正文、标题、主要參數放在服務端輸出的 HTML 中;
- 列表分頁提供可抓取的連結,而不是只有無限滚動;
- 交互後才加载的内容,给它一個可直接訪問的 URL;
- 图片承载的信息用文字补全,別只放在图里;
- 上线後用渲染後的 HTML 做一次比對,確認内容真的出現。
需要說明的是,渲染出内容只是让頁面具备被索引的條件,不等于一定被收錄,也不代表能获得好的排名。它解决的是“内容有没有被讀到”的問题,而不是“内容好不好”的問题。
小结
首屏之外的内容能不能進索引,關键不在位置,而在它是否出現在爬虫能够讀到的那份文档里。把核心内容放回 HTML、给交互内容一個獨立 URL、定期用渲染结果和源代碼做對照,多數“内容在頁面上却不在索引里”的問题都能定位到具体环节。