先去重再统计,而不是先统计再解释。报告页数与实际对象数量不一致,通常说明导出结果里存在同一对象的重复行,或分页抓取时把同一对象在不同页、不同时间点各留了一条。判断方法很简单:按对象唯一标识排序,统计唯一值数量,与报告总行数对比。如果唯一值少于总行数,先做去重;如果两者相等,问题不在重复,而在分页缺失或对象本身被拆分,这时去重反而会掩盖漏抓。
两种原因的处置方向完全相反,所以第一步不是删行,而是取证。导出后保留原始文件,另建一张工作表,加入三列辅助信息:抓取时间、报告页码、对象唯一标识(商品ID或链接中的稳定编号)。
可区分的证据大致是:
这里有一个容易忽略的边界:报告页数本身不是对象数量的证据。页数会随每页条数、排序方式、是否包含无排名对象而变,所以页数只能当参考,不能当分母。
保留适用于同一对象的多行确实代表不同查询条件,而且你后续分析需要按条件分别看。前提是每一行都能补齐条件字段,否则合并后无法解释差异。动作上,保留时给每行加一个条件标签,去重键改为“唯一标识+条件”,而不是只用唯一标识。
改写适用于同一对象的多行只是抓取冗余,但你需要保留它出现过的页码或时间范围。做法是把多行合并为一行,用分隔符把页码或时间写进同一单元格,排名取该对象在目标时间点的那一条。前提是你能确定哪一条排名对应你要回答的问题;如果确定不了,就不要改写,先保留原始行。
退出适用于重复比例高到无法判断哪条可信,或者同一标识的排名差异大到互斥。此时把该对象整体移出本次统计,单独记入待核清单,而不是随便挑一条。退出的代价是样本变小,所以要在结论里写明剔除了多少对象,避免把不完整数据当成全量。
三种做法不是都要用。多数情况下,先按唯一标识去重、保留最早或最晚一条即可;只有当排名差异有业务含义时,才值得进入改写流程。
假设一次查询导出 300 行,涉及 260 个商品,其中 40 行是分页重叠产生的重复。如果去重键用“商品标题”,标题相同但实际是不同商品的情况会被误合并,唯一值可能降到 250 以下,看起来“干净”了,实际丢了对象。
如果去重键改用商品ID,唯一值回到 260,与预期接近。这个对比说明:去重键应当选择平台内稳定且唯一的标识,而不是标题、价格或排名这类会变的字段。动作上的结果是,键选对之后,下一步才能判断 260 是否等于你提交查询的对象总数;如果不等,问题就从“重复”转到“漏抓”,处理路径随之改变。
需要说明的是,这个数字只是用来说明比较方法,不代表任何真实导出规模。
小样本时,你可能手工核对十几行就完成了去重,感觉规则很清晰。规模扩大后,会出现几类例外:
这些例外的共同点是:它们只在数据量变大、抓取跨页或跨时间时才暴露。因此,小样本验证出的去重规则不能直接照搬到全量,至少要先用一批包含分页边界的数据做一次校验,确认唯一值数量稳定后再套用。
建议按以下顺序操作,每一步的结果决定下一步:
最后要提醒一点:请求量、抓取量或某个统计值归零,都不能单独证明去重做对了。归零还可能来自查询条件写错、对象被过滤、页面结构变化或抓取中断。判断去重是否成立,依据始终是唯一标识数量与预期对象数量的关系,而不是某个计数是否好看。把这条依据固定下来,下次遇到页数与对象数不一致时,就不必从头猜原因。