先给结论:不要急着判定哪一边“正确”,而要先判断差异属于三种情况中的哪一种——静态响应里根本没有目标内容、静态响应里有内容但被脚本替换、静态响应和脚本渲染各自只覆盖了一部分内容。定位动作是:对同一批 URL 分别保存原始 HTML 与渲染后 DOM,逐项比对标题、正文主体、内链和 canonical 四个位置,再按差异类型决定是改渲染方式,还是只调整批量查询的取样口径。
这两种做法都成立,但适用条件不同。
如果目标内容在服务器返回的 HTML 里已经完整存在,脚本只是做交互增强,那么批量查询应以静态响应为准。代价是你会漏掉少数依赖脚本才出现的内容,但换来的是可重复、可缓存、成本低的批量比对,适合 URL 数量大、需要周期性复查的场景。
如果目标内容必须由脚本请求接口后才出现,静态响应里只有骨架,那么批量查询应以渲染结果为准。代价是每次查询都要执行脚本、等待网络请求,速度慢、失败点更多,而且渲染超时或接口限流会制造假差异,需要给渲染留出稳定等待条件。
判断依据不是“哪种更先进”,而是:关掉脚本后,目标内容是否还在。在的话选静态;不在的话选渲染,并接受它的不稳定成本。
整体对比容易得出“两边不一样”这种无用结论。把差异拆到具体位置,才能指向原因。
<a> 无 href,渲染后才有真实地址,说明链接由脚本生成,批量查询若只看静态会误判为无内链。实际操作:对同一批 URL 抓两次,一次禁用脚本,一次启用渲染,把四个位置的结果并排存下来。这个动作的结果会直接决定下一步——如果差异只集中在标题和内链,问题在渲染层;如果正文主体两边都缺,问题在内容输出本身,跟渲染无关。
差异出现后,用下面这组证据缩小范围,而不是靠猜。
假设一个例子:某列表页静态 HTML 里有 20 条标题,渲染后只剩 8 条。先禁用脚本抓取,若仍是 20 条,说明渲染过程丢内容,应查脚本是否在加载后重置了列表容器;若禁用后也只剩 8 条,说明服务端输出本身就只有 8 条,差异与渲染无关。这个判断只用于说明比较方法,不代表任何真实站点结果。
定位清楚后,批量查询的取样方式也要相应改变。
当差异属于“静态缺失、渲染补充”,批量查询应固定使用渲染结果,并把渲染失败单独标记为待复查,而不是直接算作未收录。当差异属于“静态完整、渲染改写”,批量查询用静态响应即可,渲染结果只作为抽查样本,用于发现脚本异常。
例外情况:如果页面同时存在服务端输出和客户端替换,且两者内容都合理,那么不要强行统一口径,而应在批量结果里保留两个字段,分别记录静态值与渲染值,让后续判断有据可查。此时任何单一字段的归零,都不能单独证明页面处理正确——它也可能是渲染超时、接口限流或脚本被拦截造成的。
最后提醒两点与本题相关的边界:robots.txt 的抓取限制不等于可靠的索引移除,站点地图也不保证收录。差异定位解决的是“看到的内容为何不同”,不是“是否会被收录”,两者不要混为一谈。定位完成后,再决定下一步是修渲染、修输出,还是只调整查询口径。