网站收录

爬虫看到的和你看到的不一样:JS 渲染内容如何影响收录

页面在浏览器里显示正常,收录结果却是空的或只剩导航文字,通常不是被屏蔽,而是爬虫拿到的 HTML 里没有这些内容。本文解释抓取、渲染、索引三步之间的关系,列出容易漏掉的内容类型和几个常见坑,并给出自查顺序与改造取舍。

网站收录

爬虫看到的和你看到的不一样:JS 渲染内容如何影响收录

有时候会遇到这样的情况:你在浏览器里明明看到页面上有内容,搜索结果里却是空白,或者只有一段导航文字。多数时候不是页面没被收录,而是爬虫拿到的 HTML 和你看到的页面不是同一个东西。前端渲染越多,这个差距越明显。

抓取、渲染与索引:三步走,节奏不一样

搜索引擎处理一个页面,大致分三步。第一步是抓取原始 HTML,也就是服务器直接返回的那份代码;第二步是把页面放进渲染队列,执行脚本、请求接口、构建 DOM;第三步才是基于渲染后的结果做索引判断。第一步很快,第二步往往要排队,第三步依赖前两步的结果。

落差就出现在这里:如果正文、内链、canonical、meta 标签全部由脚本在浏览器端生成,那么爬虫第一次拿到的那份 HTML 里什么都没有。它得等,等到渲染队列轮到它,而且渲染不一定每次都成功。

哪些内容最容易漏掉

  • 首屏之后才注入的正文:接口返回慢或失败时,DOM 里就是空的。
  • 点击或滚动才加载的内容:标签页切换、折叠面板、无限滚动、图片懒加载。
  • 完全由脚本拼出来的导航和列表页链接。
  • 由脚本写入 head 的标签:title、description、canonical、noindex 都在这里。
  • 依赖登录状态或用户偏好才显示的区域,对爬虫等于不存在。

三个容易踩的坑

脚本注入的 noindex

如果 noindex 是前端脚本加上去的,抓取阶段可能看不到,页面照常进入索引;反过来,撤掉 noindex 时也要确认源码里真的没有了,而不是只在浏览器里没有了。

脚本生成的 canonical

canonical 由前端根据条件动态写入,容易出现指向自己、指向错误版本,或者多个版本互相指的情况。放在服务端返回的 HTML 里更稳。

链接靠脚本跳转

用事件监听加地址跳转实现的导航,爬虫不一定能顺着走。URL 的发现会因此变慢,新页面尤其明显。用标准的超链接标签是最省事的做法。

怎么判断自己的站点属于哪种情况

  1. 查看网页源代码,对比源码和渲染后的 DOM 差多少。
  2. 用带渲染能力的抓取工具或检索平台的 URL 检查功能,看它实际拿到的内容。
  3. 翻服务器日志,看脚本和接口请求有没有被爬虫触发;如果没有,渲染环节很可能没走到。
  4. 把被索引的标题、摘要和页面实际内容对一遍,差异大往往就是渲染没跟上。

要不要改成服务端渲染

不必一刀切。内容为主、需要被检索到的页面,优先保证关键内容出现在初始 HTML 里;交互密集、不指望被搜到的模块,保持客户端渲染也可以。常见做法是首屏或正文用服务端渲染、静态生成输出,次要模块再交给脚本。若短期改造成本高,至少把标题、正文主体、主要内链和 meta 标签这几项挪到服务端。

渲染决定的是爬虫能看到什么,不决定它愿意收录什么。内容本身没有价值,渲染做得再好也不会改变结果。

排查顺序建议是:先看源码里有没有内容,再看渲染有没有被触发,最后才去怀疑索引和展现层面的问题。顺序反了,很容易在错误的方向上折腾很久。