最可能的原因不是分页接口坏了,而是导出任务在“最后一页”判断上采用了两种不同口径:一种按返回条数是否等于每页上限来判断结束,另一种按游标或时间戳是否推进来判断结束。前者在最后一页刚好满页时会多请求一次空页,后者在数据持续写入时可能永远等不到稳定结束信号。要判断属于哪一种,不能只看总条数,而要看导出日志里最后一页的请求参数、返回条数和下一次请求是否发出。
如果导出结果的总行数与工具界面显示的总数一致,但抽样比对时发现中间某个时间段的数据缺失,通常说明问题出在分页边界合并环节,而不是抓取环节。常见表现是:第 N 页的最后一条和第 N+1 页的第一条之间存在时间或 ID 断层,而总行数因为重复计数或空页占位被补平了。
此时先不要重新跑全量导出。先定位断层出现在哪两个分页之间,再检查这两页的请求参数是否一致。若第 N 页用了“按创建时间升序”,第 N+1 页却因为重试改成了“按更新时间升序”,两条排序口径混在一起,断层就不可避免。
解释一:结束判断错误。工具在某一页返回条数少于每页上限时提前停止,但那一页并非真正的最后一页,只是该页恰好有部分记录被过滤条件排除。过滤条件可能是状态、渠道或时间范围,导致返回条数波动,从而触发误判。
解释二:合并去重错误。所有分页都抓到了,但合并时用了一个不唯一的主键去重,把不同记录当成重复项删掉了。比如用“日期+渠道”作为唯一键,同一天同一渠道有多条记录时只会保留一条。
这两种解释的修复动作完全不同:前者要改结束条件,后者要改去重键。如果搞反了,重跑多少次都会缺。
需要收集三类证据,且要来自同一次导出任务,不能跨任务拼凑。
一个可执行的判断动作:把导出任务改为“只导出某一页区间”,例如只导出第 3 页到第 5 页,并关闭去重。如果此时数据完整,说明问题在去重;如果仍然缺,说明问题在分页结束判断。这个动作的结果直接决定下一步是改去重键还是改结束条件,避免同时改两处导致无法归因。
假设某工具每页上限为 100 条,实际数据共 250 条。正常应返回 100、100、50 三页。若第 2 页因为过滤条件只剩 80 条,工具按“少于 100 即结束”判断,就会漏掉第 3 页。此时日志会显示第 2 页返回 80 条后停止,而第 3 页从未被请求。
另一种假设:工具用游标推进,但第 2 页之后游标值没有变化,工具误以为已到末尾。日志会显示第 2 页和第 3 页请求了同一个游标,返回内容相同。前者是结束条件问题,后者是游标更新问题,修复位置不同。
建议按以下顺序操作,每一步的结果都决定是否继续下一步:
完成上述任一步后,不要立即跑全量。先用一个已知边界的小区间验证修复是否生效。只有小区间完整,才值得扩大到全量导出。否则全量导出只会掩盖问题,让断层更难定位。
不同推广工具资源对分页、游标、去重和导出上限的实现方式不同,具体按钮位置、参数名称和当前是否支持游标导出,需要以该工具当前的帮助文档或接口说明为准。若工具未公开分页机制,可以用小页上限加边界比对的方式反推,而不是假设它一定按条数结束。
最后提醒一点:请求量归零或抓取量下降,不能单独证明导出已经完整,也可能只是过滤条件变严或任务被限流。完整性判断必须回到边界记录和去重前后计数这两个可验证的证据上。