先分清“抓到了”和“看懂了”
蜘蛛请求一个 URL 时,服务器先返回一份 HTML。这份初始 HTML 里有什么,决定了蜘蛛第一眼能看到什么。如果标题、正文、列表、站内链接都是由 JavaScript 在浏览器里执行后才生成,那么蜘蛛拿到的初始响应可能只是一个空壳。
用户打开页面看到完整内容,是因为浏览器执行了脚本、调用了接口、把数据插进了 DOM。这个过程发生在用户的浏览器里,不一定会发生在蜘蛛那一边。
渲染是排队做的,不是即时的
现在主流搜索引擎确实会做渲染:把页面放进无头浏览器里执行脚本,再读取渲染后的结果。但这件事是异步排队进行的,有资源额度限制,也并不保证每一个页面都会被完整渲染一遍。所以“我的页面用户能看到”不能直接推导出“蜘蛛一定能看到”,更不能推导出“一定会被收录”。
哪些写法最容易出问题
- 正文、卡片、商品信息由前端接口拉取后插入,初始 HTML 里只有加载中的占位文字
- 导航、面包屑、相关推荐由 JS 生成,源码里的 a 标签为空或干脆不存在
- 翻页、加载更多只改变前端状态,没有对应的可访问 URL
- 需要点击、滚动、悬停之后才出现的内容
- 关键信息放在图片、画布,或必须登录后才会返回数据的接口里
这些写法在开发视角下很常见,但在抓取视角下,等于把内容藏在了第一层响应之外。
自查:用最原始的方式看页面
- 关闭 JavaScript,或直接查看网页源代码,确认初始 HTML 里有没有标题、正文和站内链接
- 用搜索平台的 URL 检查类工具,对比渲染前后两个版本的差异
- 对照服务器日志,看蜘蛛有没有抓到你的接口请求。多数情况下它不会主动去调你的异步接口
- 抽查几个最重要的页面,而不是只看首页
四步做下来,通常就能判断出问题是出在抓取阶段,还是出在内容本身。
处理思路与优先级
不必一上来就把整站改成服务端渲染,先把“必须被理解的内容”放回初始响应里就够了。
- 首屏正文、核心链接、标题与描述,尽量在 HTML 直出
- 列表页保证第一页内容在源码里,后续翻页使用可被抓取的独立 URL
- 站点地图里填的是最终能直接访问的地址,不要填只有脚本才能跳转到的状态
- 确实只能靠脚本渲染的部分,至少留一段静态兜底文本
预渲染适合什么场景
页面数量不大、更新频率不高、模板相对固定的站点,可以用预渲染把 HTML 提前生成好;内容量大且更新频繁的站点,更常见的做法是服务端渲染,或者把关键区块直出。两者目标一致:让初始响应里就有可读内容。
抓取与收录的区别在这里怎么体现
渲染不完整,通常先表现为抓取阶段就缺内容,蜘蛛手里没有可判断的素材,收录自然无从谈起。另一种情况是页面被抓到了,但初始 HTML 内容稀薄,被当成低质量页面处理。前者要查日志、查渲染链路,后者要回到内容本身,排查方向并不一样。
把“用户能看到”当作验收标准是不够的。蜘蛛看到的那一版,才是收录判断的输入。
别把所有收录问题都归到 JS 上
有些页面渲染完全正常,收录依然不理想,原因可能在重复内容、URL 写法不统一、站点层级过深,或者页面本身没有独立价值。渲染只是其中一环,排查时把它和其他因素分开看,才能找到真正的原因。