当你用抓取工具取回页面时,看到的是不含正文的静态 HTML,而浏览器里脚本执行后正文完整可见——这两个结果不同,通常说明内容依赖客户端渲染。定位差异的最小动作是:取一份禁用脚本后的原始响应,再取一份脚本执行后的 DOM,逐段对照正文、链接和关键文本出现在哪一侧。如果正文只在执行后出现,问题落在渲染环节;如果两侧都缺,问题在更早的响应或抓取阶段。这个对照能告诉你下一步该查渲染还是查响应,但它不能证明页面一定会被收录,也不能说明某个搜索引擎一定执行脚本。
选一个具体 URL,而不是整站。把它分别放进两类取数方式:一类是只发请求、不执行脚本的原始响应;另一类是等脚本跑完再取最终 DOM。假设某文章页的标题和正文在原始响应里为空,在最终 DOM 里完整,那么差异就锁定在渲染依赖上。反过来,如果原始响应里正文存在、最终 DOM 里反而被脚本替换掉一部分,那要怀疑脚本对已有内容的覆盖或改写,而不是“没渲染”。
这一步的产出是一份两列清单:左侧写原始响应里实际存在的元素,右侧写执行后新增或变化的元素。清单本身就是后续判断的依据,不需要额外权限或后台数据。
同样是“两侧不同”,成因可能完全不同,处理方向也不一样:
判断方法很直接:看原始响应里有没有可读的标题标签和一段可辨认的正文。有,偏结构改写;没有但最终 DOM 有,偏内容注入;两者都异常,先查抓取受阻。
在无法拿到完整日志或后台权限时,仍可做这一步:对同一 URL 连续取两份结果,一份禁用脚本,一份允许脚本,然后只比较三个位置——页面标题、首段正文、正文内的站内链接。如果禁用脚本时这三处都缺失,允许脚本后全部出现,就足以把问题归到渲染依赖,而不必先怀疑服务器屏蔽。
这个结论的边界要清楚:它说明“内容需要脚本才出现”,但不等于“搜索引擎不会处理脚本”。不同搜索引擎对脚本执行的支持程度不同,需要分别核查,不能拿一个引擎的表现推断另一个。同样,禁用脚本后正文缺失,也不能单独证明页面不会被收录——抓取限制、索引状态、站点地图提交与否都是独立环节,robots.txt 的抓取限制不等于可靠的索引移除,站点地图也不保证收录。
确认属于内容注入型后,动作顺序建议如下:
如果是结构改写型,优先查脚本是否在加载后移除了原本可读的内容;这类改动往往只需要调整执行时机或保留静态兜底。如果是抓取受阻型,先解决响应本身,再谈渲染,否则后面所有对照都建立在错误前提上。
假设一个页面改成了服务端输出正文,重新取原始响应后发现标题和首段已存在,那么渲染依赖这一项就算解除。但此时仍不能推出“已经收录”:还需要单独确认抓取是否放行、页面是否被处理。把“内容可见”和“已被收录”当成两件事,是这类排查里最容易出错的地方。
每次对照都留下三样东西:对照的 URL、取数时间、以及两份结果里关键元素的有无。时间很重要,因为脚本、接口或模板可能在此期间变化,没有时间戳的对照无法复现。若某次取数显示正文两侧都为空,先别下结论,检查这次取数是否本身失败——空结果既可能是页面问题,也可能是取数动作没成功,这两种解释在证据不足时无法区分。
把这些记录按 URL 归档,下次再遇到“静态响应与脚本渲染不同”时,可以直接比对历史状态,判断是新增的渲染依赖,还是长期存在的结构问题,从而决定是修模板还是修取数方式。