页面在浏览器里打开一切正常,正文、图片、内链都在,但抓取工具拿到的却像一份空壳 HTML——标题有了,内容区是空的,导航链接也点不开。这类问题多半不是“收录慢”,而是内容压根没出现在搜索引擎能读到的那份文档里。下面按五步核对,找到卡住的环节。
先接受一个前提:你看到的页面和抓取到的页面可能不是同一份
现代搜索引擎会执行 JavaScript,但执行是有代价的:需要排队、需要下载脚本、需要调用接口,还有超时限制。这意味着“能渲染出来”和“稳定渲染出来”是两回事。有些页面在测试工具里渲染正常,在真实抓取时因为接口超时或资源被拦,渲染结果就是残缺的。所以第一步不是改代码,而是先确认差异到底有多大。
第一步:把原始 HTML 和渲染后结果分开看
大多数站长工具和 URL 检查功能都会给出两个视图:一个是服务器直接返回的原始 HTML,一个是执行脚本后的渲染结果。重点看三样东西:
- 正文主体:原始 HTML 里有没有完整的文字内容,还是只有一个空的容器标签。
- 站内链接:导航、面包屑、文章底部的相关阅读,是否是 JS 注入的。
- canonical、hreflang、meta robots:这些信号如果只在渲染后才出现,容易与页面实际状态对不上。
如果这三样在原始 HTML 里都缺失,问题就不在收录环节,而在渲染链路。
第二步:分清页面的渲染方式,处理路径完全不同
服务端渲染(SSR)
HTML 由服务器生成后再返回。这是最稳的方式,抓取时不需要执行脚本就能拿到完整内容。如果这类页面仍然没被收录,方向应该转向 URL 规范、内容质量或抓取配额,而不是怀疑渲染。
动态渲染
对普通用户返回 JS 版本,对爬虫返回预渲染版本。要注意预渲染内容与用户看到的是否一致,以及预渲染服务是否稳定。一旦维护中断,爬虫拿到的可能就是空壳。
纯客户端渲染(CSR)
HTML 几乎是空的,靠脚本拉数据拼页面。风险最高:脚本执行失败、接口超时、渲染队列拥挤,任何一环出问题都会导致内容不可见。关键页面建议逐步改成 SSR,而不是长期依赖渲染碰运气。
第三步:核对渲染所需资源有没有被挡住
这是一处很容易被忽略的坑。robots.txt 里为了减少抓取,常有人顺手屏蔽脚本目录或接口路径,比如 /static/js/、/assets/、/api/。对普通用户没有影响,对渲染却是致命的:脚本拉不下来,接口调不通,页面自然渲染不出内容。
核对方法很简单:把 robots.txt 里的 Disallow 规则逐条对照渲染实际依赖的资源,看有没有误伤。同时确认这些资源没有返回 403 或 5xx。
第四步:判断内容是否藏在交互之后
折叠面板、选项卡、点击“展开全文”、无限滚动加载,这些交互在用户体验上是加分项,但内容可能不在初始渲染结果里。如果核心正文需要点击才能出现,收录结果里就可能只有标题和一小段引导语。
判断标准很直接:不点击、不滚动,页面里能读到多少有效信息?如果核心结论、关键数据、主要内链都需要操作才能看到,就值得把一部分内容挪回初始 HTML。
第五步:URL 的发现路径是否也依赖 JavaScript
抓取和收录是两个阶段,先要发现 URL。如果新页面的入口只存在于 JS 生成的列表里,爬虫未必能顺着找到。可以用禁用脚本的方式打开页面,看链接是否还留在 HTML 中。常见补法是在服务端输出的 HTML 里保留一层基础链接,比如分类页第一页、最新文章列表。
一份可以照着走的核对清单
- 对比原始 HTML 与渲染后结果,列出差异项。
- 确认页面属于 SSR、动态渲染还是 CSR。
- 逐条检查 robots.txt 是否屏蔽了脚本或接口资源。
- 关闭脚本后浏览页面,看核心内容与链接还剩多少。
- 检查折叠、选项卡、懒加载里的内容是否属于关键信息。
- 确认 canonical、meta robots 出现在原始 HTML 中。
- 用无 JS 环境验证站内链接是否可被发现。
把关键内容放进初始 HTML,通常是成本最低、收益最确定的一步。渲染方式可以慢慢重构,但正文、内链和收录类标签不该长期依赖脚本生成。
做完这五步,你大概率能定位到是资源被拦、渲染超时,还是内容本来就藏在交互里。剩下的工作就是把该回到 HTML 的部分挪回去,然后按正常节奏观察抓取和索引状态的变化。