有时候会遇到这样的情况:你在浏览器里明明看到页面上有内容,搜索结果里却是空白,或者只有一段导航文字。多数时候不是页面没被收录,而是爬虫拿到的 HTML 和你看到的页面不是同一个东西。前端渲染越多,这个差距越明显。
抓取、渲染与索引:三步走,节奏不一样
搜索引擎处理一个页面,大致分三步。第一步是抓取原始 HTML,也就是服务器直接返回的那份代码;第二步是把页面放进渲染队列,执行脚本、请求接口、构建 DOM;第三步才是基于渲染后的结果做索引判断。第一步很快,第二步往往要排队,第三步依赖前两步的结果。
落差就出现在这里:如果正文、内链、canonical、meta 标签全部由脚本在浏览器端生成,那么爬虫第一次拿到的那份 HTML 里什么都没有。它得等,等到渲染队列轮到它,而且渲染不一定每次都成功。
哪些内容最容易漏掉
- 首屏之后才注入的正文:接口返回慢或失败时,DOM 里就是空的。
- 点击或滚动才加载的内容:标签页切换、折叠面板、无限滚动、图片懒加载。
- 完全由脚本拼出来的导航和列表页链接。
- 由脚本写入 head 的标签:title、description、canonical、noindex 都在这里。
- 依赖登录状态或用户偏好才显示的区域,对爬虫等于不存在。
三个容易踩的坑
脚本注入的 noindex
如果 noindex 是前端脚本加上去的,抓取阶段可能看不到,页面照常进入索引;反过来,撤掉 noindex 时也要确认源码里真的没有了,而不是只在浏览器里没有了。
脚本生成的 canonical
canonical 由前端根据条件动态写入,容易出现指向自己、指向错误版本,或者多个版本互相指的情况。放在服务端返回的 HTML 里更稳。
链接靠脚本跳转
用事件监听加地址跳转实现的导航,爬虫不一定能顺着走。URL 的发现会因此变慢,新页面尤其明显。用标准的超链接标签是最省事的做法。
怎么判断自己的站点属于哪种情况
- 查看网页源代码,对比源码和渲染后的 DOM 差多少。
- 用带渲染能力的抓取工具或检索平台的 URL 检查功能,看它实际拿到的内容。
- 翻服务器日志,看脚本和接口请求有没有被爬虫触发;如果没有,渲染环节很可能没走到。
- 把被索引的标题、摘要和页面实际内容对一遍,差异大往往就是渲染没跟上。
要不要改成服务端渲染
不必一刀切。内容为主、需要被检索到的页面,优先保证关键内容出现在初始 HTML 里;交互密集、不指望被搜到的模块,保持客户端渲染也可以。常见做法是首屏或正文用服务端渲染、静态生成输出,次要模块再交给脚本。若短期改造成本高,至少把标题、正文主体、主要内链和 meta 标签这几项挪到服务端。
渲染决定的是爬虫能看到什么,不决定它愿意收录什么。内容本身没有价值,渲染做得再好也不会改变结果。
排查顺序建议是:先看源码里有没有内容,再看渲染有没有被触发,最后才去怀疑索引和展现层面的问题。顺序反了,很容易在错误的方向上折腾很久。