很多站点在浏览器里打开一切正常,正文、评论、价格都在,但用工具抓一下原始 HTML,看到的却只有一个空容器标签,剩下的内容全靠 JavaScript 在浏览器里跑出来。这类页面在收录上经常表现得很别扭:有时被抓过,有时又不收录,索引报告里也看不出明显错误。要弄清原因,得先把“抓取”和“渲染”分开看。
抓取拿到的是 HTML,渲染才拿到正文
搜索引擎处理一个 URL 大致分两步。第一步是把地址抓回来,拿到服务器直接返回的 HTML 源码;第二步是在需要的时候,用渲染服务把页面跑一遍,等 JavaScript 执行完再读取最终 DOM。收录判断通常基于第二步的结果,但触发第二步是有条件的,也存在排队延迟。
问题就出在这里:如果正文完全依赖 JS 注入,第一步拿到的就是一份“空壳”。搜索引擎需要额外投入资源来渲染,渲染不是每次都会立刻发生,也不是所有页面都值得渲染。内容越依赖 JS、渲染成本越高,被发现和进入索引的时间就越不稳定。
先确认蜘蛛实际拿到的是什么
- 用命令行 curl 或抓取工具请求 URL,看返回源码里有没有正文关键词。源码里没有,说明内容确实是 JS 注入的。
- 在浏览器里禁用 JavaScript 再打开页面,看还剩多少可读内容。如果几乎空白,风险就比较明确。
- 检查页面有没有服务端渲染或预渲染的输出,比如 HTML 里已经带了标题、正文摘要、结构化数据。
- 对照索引报告里同一批 JS 页面的状态,看是不是集中在“已抓取,当前未收录”或“已发现,尚未抓取”。
三条常见的处理路径
- 服务端渲染(SSR):HTML 返回时就带上完整正文,JS 只负责交互。对内容型页面来说这是最稳的一种,蜘蛛不需要额外渲染就能读到内容。
- 预渲染:构建或请求时把页面渲染成静态 HTML 再返回。适合内容页数量不大、更新不频繁的站点,维护成本相对可控。
- 保留客户端渲染,但补上关键信息:至少在 HTML 里放标题、H1、正文摘要、canonical 和结构化数据,让蜘蛛即使不渲染也能判断页面讲什么、属于哪个主题。这条路不是最优解,但比完全空壳好得多。
几个容易忽略的细节
不要让正文藏在滚动或点击之后。需要交互才加载的内容,渲染时不一定会被触发,等于对蜘蛛不存在。
检查渲染依赖的接口是否对蜘蛛开放。有些站点用 robots.txt 或防火墙拦掉了接口路径,页面能打开但数据请求被拒,渲染出来依旧是空的。
分页、筛选、无限滚动要给出可抓取的 URL。纯 JS 拼接的列表如果没对应真实链接,后续内容就很难被单独发现。
别把首屏关键内容放在异步请求的最后。渲染有时间限制,慢请求可能导致内容没等到就结束了。
一个务实的判断标准
把“关掉 JavaScript 后页面还剩什么”当作底线测试。如果关掉 JS 后仍能读到标题、主要正文、作者和发布时间,收录的不确定性会小很多;如果关掉之后只剩一片空白,那么无论提交多少次 sitemap、发多少外链,都要先解决渲染这一层的问题。
抓取解决的是“有没有拿到这个 URL”,渲染解决的是“拿到了什么内容”。收录看的是后者,两者混为一谈,往往会对着抓取日志白忙一场。
最后提醒一点:渲染做好了也不等于一定收录。它只是把内容摆到可以被判断的位置,剩下还要看内容本身是否有独立价值、是否与其他页面重复、URL 是否规范。渲染是入场券,不是结果。