很多人把“蜘蛛来过了”当成“内容被看到了”,其实这两件事中间还隔着一步。蜘蛛把 HTML 抓回去,只是拿到了原材料;页面上靠 JavaScript 拼出来的文字、图片和链接,往往要再经过一次渲染处理,才会进入后续的判断流程。
抓取和渲染是两个独立环节
抓取是网络层面的动作:发请求、收响应、把字节存下来,快慢取决于服务器、网络和页面体积。渲染是计算层面的动作,需要解析 HTML、执行脚本、等数据返回、把 DOM 拼完整。它有独立的排队机制,资源比抓取更紧张,所以不是每一个被抓到的页面都会立刻渲染。
这就解释了一个常见现象:日志里蜘蛛明明来过,页面也返回 200,但内容迟迟没有进入索引——它可能卡在渲染那一环。
哪些页面更容易被排进渲染队列
- 正文、标题、价格等关键信息由前端接口返回后再插入 DOM;
- 列表内容靠“加载更多”或滚动触发,首屏 HTML 里只有骨架;
- 链接由脚本拼接,原始 HTML 中没有可解析的 a 标签;
- 单页应用路由跳转,切换页面不产生新的 HTML 请求。
这些写法对用户没问题,对蜘蛛来说却多了一道工序:先抓到空壳,再等待渲染。工序越多,出错的概率越高。
渲染环节常见的三种损耗
内容没错,但出现得晚
渲染是有队列的,重要页面通常排在前面,长尾页面可能要等更久。如果你更新了内容却迟迟没有反馈,先确认它是不是必须渲染才能被看到。
链接不在原始 HTML 里
URL 发现主要依赖原始响应。如果内链全靠脚本生成,新页面的发现速度就会明显落后于内容更新速度,Sitemap 只能补位,无法完全替代。
渲染失败,页面变成空壳
脚本报错、接口被拦、依赖的第三方资源加载超时,都可能让渲染结果和用户看到的不一致。蜘蛛拿到的是一张白纸,页面就等于不存在。
怎么判断页面是否依赖渲染
- 用 curl 或关闭 JavaScript 的浏览器访问,看首屏有没有正文和链接;
- 在搜索资源平台的 URL 检查里对比原始 HTML 和渲染后的 HTML;
- 翻服务器日志,看数据接口的请求是否来自搜索引擎的渲染节点;
- 抽查几篇没被索引的页面,确认它们在原始 HTML 里是不是空的。
把渲染依赖降下来的做法
- 关键内容直出:标题、正文、核心链接由服务端渲染,脚本只做增强;
- 链接用 a 标签:导航、分页、相关推荐尽量输出可解析的静态链接;
- 预渲染兜底:对确实无法服务端渲染的页面,提前生成一份静态快照;
- Sitemap 补齐:把重要 URL 写进 Sitemap,减少对脚本发现链接的依赖;
- 保持接口稳定:渲染节点请求的数据接口不要做 UA 或频率拦截。
抓取解决的是“有没有拿到”,渲染解决的是“能看懂多少”。两步都顺畅,URL 才有机会往后走。
回头检查站点时,可以先问自己一句:把 JavaScript 关掉,这个页面还剩什么?剩下的部分越多,蜘蛛理解你的成本就越低。