同一个 URL,用户在浏览器里看到的是完整页面,搜索引擎抓取程序第一次拿到的却可能只是几行 HTML 骨架。这不是抓取出错,而是抓取和渲染本来就是两个环节:先取回服务器返回的响应,再排队把页面渲染出来看一遍。问题在于,很多页面质量判断在第一环节就已经开始了。
抓取端拿到的东西,取决于服务器返回了什么
请求到达时,服务器返回的 HTML 里有什么,抓取端就先看到什么。如果主体内容、内链、结构化信息都依赖 JavaScript 在浏览器里执行后才插入,第一轮抓取拿到的就接近空白。搜索引擎通常会安排渲染,但渲染要排队、要消耗资源,对站点的抓取安排并不友好。
常见的几类情况
正文由前端脚本生成
列表页、详情页的数据通过接口请求后再插入 DOM。这类页面在浏览器里一切正常,但源码里没有对应文字,抓取端如果只做第一轮解析,就很难判断页面主题。
图片或内容懒加载
滚动到视口才加载的大段文本、评论、图集,滚动前只是空的占位元素。抓取程序一般不会像人那样一路滚到底,看不到的内容等于不存在。
登录、地区或权限限制
未登录时返回登录提示,或按 IP 返回不同版本。抓取端往往拿不到登录态,看到的可能是提示语而不是正文。
弹窗和浮层
Cookie 同意、订阅弹窗、App 下载引导覆盖在正文之上。有些实现方式会把页面主体包进隐藏容器,抓取端读到的就是被折叠的内容。
个性化与 A/B 测试
同一 URL 对不同用户返回不同模块,或长期停留在测试版本。内容不稳定时,抓取端多次拿到的结果可能互相矛盾,页面定位也跟着模糊。
怎么判断自己有没有这个问题
- 用“查看网页源代码”而不是开发者工具的 Elements 面板,看第一次响应里到底有没有正文。
- 在浏览器里禁用 JavaScript 刷新页面,观察还剩多少可读内容。
- 用搜索平台的 URL 检查工具,对比“已抓取的 HTML”和“渲染后的 HTML”。
- 翻服务器日志,看抓取程序请求的 URL 返回了什么状态码、多大字节数。
- 检查内链是否用可抓取的 a 标签,而不是点击事件绑定的 div。
可以落地的调整
- 把标题、正文主体、分类导航等关键内容放到服务端渲染或预渲染输出里,脚本只负责增强。
- 懒加载尽量用真正的 img 和 src,配上合理占位,不要用背景图或纯脚本替换。
- 重要链接保持 a 标签结构,脚本跳转只作为补充。
- 弹窗不要包住正文容器,也不要默认用 display:none 隐藏内容。
- 需要登录才能看的内容,评估是否值得让抓取端访问;确实不该收录的,用合适的方式说明。
这些调整不会直接换来收录,但能让抓取端第一次就把页面看清楚,后面的质量判断才有依据。
抓取端看到的版本,才是它评判页面的起点。用户看到的再漂亮,第一轮 HTML 里没有的东西,就等于没写。