先给结论:如果静态 HTML 里已有完整正文和链接,而渲染后的 DOM 反而更少或更乱,优先怀疑脚本在客户端改写了内容或阻断加载;如果静态 HTML 是空壳、渲染后才出现正文,则要判断目标引擎是否执行脚本,以及执行后拿到的结果是否与统计口径一致。两种情况的排查顺序不同,选错方向会把时间花在无关日志上。
用抓取工具或浏览器分别保存静态响应和渲染后 DOM,逐项对比三样东西:正文首段、指向详情页的链接、以及分页或筛选控件的 href。若静态版本包含全部链接,渲染版本缺少其中一部分,说明脚本可能替换了节点、清空了容器或依赖某个接口失败后没有回退。此时应把静态版本视为更可靠的索引候选,继续检查脚本对容器的操作。
若静态版本只有模板骨架,正文和链接都在渲染后出现,那么静态版本本身不能作为索引候选。需要确认目标引擎是否执行脚本、执行时是否携带了足够的资源请求,以及渲染超时是否导致内容被截断。不同引擎对脚本执行的支持程度须分别核查,不能把一家引擎的观察直接套到另一家。
打开开发者工具的请求记录,按时间顺序核对:文档请求返回的 HTML 是否完整;关键脚本是否 200;脚本依赖的接口是否返回了正文数据;渲染后容器是否被填充。常见差异点有三类:
每类对应的下一步动作不同。第一类要回查脚本对容器的操作和错误捕获;第二类要检查接口可用性和降级方案;第三类要统一统计口径,明确以哪一版为准。
假设某列表页静态 HTML 含 20 条链接,渲染后只保留 10 条,同时出现一个“加载更多”按钮,但按钮的 href 为空。若统计只数渲染后的链接,会得到 10;若数静态响应,会得到 20。此时不能直接断定收录统计异常,因为两种口径本来就不一致。正确动作是:先确认“加载更多”是否依赖脚本点击,再检查点击后是否生成新的可抓取链接。若点击后仍无 href,则这 10 条差异属于脚本交互导致,而非索引移除。
如果静态响应和渲染结果都完整,但统计显示某批 URL 未被收录,那么差异可能不在渲染层,而在抓取限制、规范化选择或重复内容处理。robots.txt 的抓取限制不等于可靠的索引移除:被 robots 阻止抓取的 URL 仍可能因外部链接出现在索引中,只是摘要可能受限。站点地图也不保证收录,提交后仍需看抓取与索引状态。此时应转向检查 canonical、noindex、参数处理和内部链接,而不是继续对比 DOM。
把静态响应、渲染后 DOM、关键请求记录各存一份,标注抓取时间。然后做一次最小改动:如果确认是脚本清空容器导致,先让脚本在失败时保留静态内容;如果确认是接口为空导致,先补一个静态降级版本。改动后重新抓取同一 URL,对比改动前后静态与渲染结果是否一致。若一致,说明差异已收敛到可解释范围,下一步再统计收录;若仍不一致,说明还有未定位的脚本或缓存层,需要继续沿请求链排查。只有先把差异来源固定下来,收录统计的数字才有比较意义。