先给结论:如果报告页数大于实际对象数量,优先检查查询对象是否被拆成了多个可索引变体;去重时不要直接按 URL 字符串删,而要先定义“什么算同一个对象”,再决定是合并统计还是合并任务。下面用一个假设情境把两种做法的取舍讲清楚。
假设你有一批待查对象,每个对象对应一个页面,但报告显示页数接近对象数量的两倍。常见原因不是工具算错,而是同一对象存在带参数、带尾斜杠、大小写不同或移动版与桌面版两条记录。此时如果直接按“页数”安排后续任务,就会把同一对象重复处理,浪费额度,也让进度判断失真。
判断依据可以分三层:第一,看重复记录是否指向同一内容主体,比如标题、正文和主要链接是否一致;第二,看差异是否只出现在 URL 形态上,比如查询参数顺序、结尾斜杠、协议或主机名大小写;第三,看这些差异是否会影响你后续要做的动作,例如是否要分别提交、分别检查或分别统计。只有第三层成立,重复记录才值得保留为独立对象。
如果你当前的目标是掌握对象总量、安排抽查或判断覆盖率,那么先合并统计更合适。动作是:把同一内容主体的多条记录归为一组,组内保留一条主记录,其余标记为变体;统计时按组计数,任务分配时也按组分配。这样做的代价是暂时看不到变体差异,后续如果要单独处理某个变体,需要回到明细里恢复。
这种做法的适用条件是:变体之间的差异不影响你的核心判断,或者你还没有确定要分别处理它们。结果会直接影响下一步——如果合并后数量与实际对象数量接近,说明问题主要出在 URL 形态;如果合并后仍然偏多,就要继续检查是否存在同一对象被不同路径重复收录,或者对象本身被拆分成了多个可独立访问的页面。
如果你接下来要对每个对象执行不同动作,比如分别检查、分别提交或分别记录状态,那么先保留明细更稳妥。动作是:不急着删除任何记录,而是给每条记录打上“对象标识”和“变体类型”两个标记;对象标识相同的记录归为同一对象,变体类型用于区分是参数、尾斜杠还是其他形态。等到执行动作时,再按对象标识去重,只对需要独立处理的那一条执行。
这种做法的代价是前期整理成本更高,报告页数在一段时间内仍然偏大,容易让人误以为对象数量很多。适用条件是:你还不确定变体是否会带来不同结果,或者后续动作本身需要区分变体。结果会体现在任务队列上——如果按对象标识去重后队列长度明显下降,说明之前多出来的页数主要是重复形态;如果下降不明显,说明重复可能来自更深层的对象划分问题,需要回到对象定义本身。
可以按下面这组证据来选:
这里要说明一个常见误判:请求量、抓取量或某项统计归零,并不能单独证明去重正确。它也可能是查询范围缩小、对象被过滤或任务尚未执行造成的。判断去重是否合理,还是要回到“同一对象是否被正确归组”这个证据上。
假设你面对一份页数偏大的报告,可以按这个顺序做:
这个顺序的关键是:先验证,再合并;先定义对象,再决定页数怎么算。去重不是把数字改小,而是让报告里的每一条记录都能对应到你真正要处理的对象。只要对象定义清楚,页数不一致就不再是异常,而是一个可以解释和取舍的信号。