先给结论:自动导出如果只抓了第一页或中途停止,不能靠“文件能打开”判断完整;要先用请求日志与分页计数交叉核对,再决定是重跑还是补抓。两种条件会导向不同动作:接口返回稳定总数时,按总数对账;没有稳定总数时,按末页特征与去重后的记录数对账。
自动导出遗漏分页,通常有两种成因:一种是工具按固定页数上限截断,另一种是翻页过程中请求被限流或超时后静默结束。前者往往在导出设置里留有页数或条数上限,后者则表现为前后两次导出的条数不一致。
如果接口或导出文件里带有稳定的总数或游标终点,核对就简单:用导出记录数对比总数,差额等于缺失分页的累计条数。如果没有任何总数,只能靠末页特征判断——最后一页是否填满、是否出现重复的首条记录、页码是否回跳到第一页。这两种条件对应两种动作:前者可以直接算出缺了几页,后者只能判断“是否已经到末尾”,无法精确算出漏了多少。
完整性检查的核心不是看导出文件,而是看抓取过程留下的痕迹。假设一个导出任务按每页 50 条抓取,日志显示请求了第 1 到第 8 页,但第 8 页只返回 12 条,而第 7 页返回 50 条,那么第 8 页很可能是末页,也可能是被限流截断——这两种解释都成立,不能只凭“不满一页”就断定结束。
做完这一步后,如果发现请求次数少于预期页数,下一步就是补抓缺失页码,而不是直接重跑整个任务。补抓能减少重复请求,也更容易定位是哪一页开始出问题。
多个角色对“导出了多少”理解不同时,分歧通常来自口径:有人按文件行数算,有人按去重后条数算,有人按接口返回的总数算。把这三组数字并列写进一张核对表,比争论“到底全不全”更有效。
核对表至少要有四列:页码、该页返回条数、该页首条唯一标识、请求状态。任何一页的请求状态不是成功,或首条唯一标识与上一页末条重复,就标记为待确认。这样,完整性从主观判断变成逐页可查的记录。需要说明的是,具体工具是否提供请求日志、日志保留多久,不同产品差异很大,需要以实际导出界面和文档为准。
假设某次导出共 6 页,每页 100 条,日志显示第 5 页返回 100 条、第 6 页返回 0 条且状态为超时。此时有两种处理:如果接口支持按页码重试,就单独补抓第 6 页;如果不支持,只能把页大小调小后重跑第 5 页之后的部分。补抓完成后,用去重后的总条数对比预期总数,差额为 0 才视为完整。这个例子里的数字只是说明比较方法,不代表任何工具的实际表现。
有些导出任务本身就不保证分页稳定:数据在抓取期间持续新增,后一页可能包含前一页已经抓到的记录;或者接口对同一查询返回的顺序不固定。这种情况下,即使请求全部成功,去重后条数也可能少于各页条数之和,不能据此判定遗漏。适用条件是:在抓取时间窗口内数据相对静止,且排序字段稳定。若这两个条件不成立,完整性检查只能做到“请求覆盖了所有页码”,无法保证内容无遗漏。
因此,检查完整性的动作应落在“请求是否覆盖全部页码、每页是否有成功响应、去重后是否与预期总数一致”这三项上,任何一项不满足,下一步就是补抓或调整页大小重跑,而不是直接使用导出结果。