先给结论:自动导出遗漏分页,通常不是“导出失败”,而是导出任务在分页边界上提前结束。检查完整性不能只看导出文件的行数,而要用“源端可枚举的分页锚点”和“导出端可复算的边界记录”做交叉比对。小样本下逐页目视可行,规模上去后必须改成可复算的边界抽样。
如果导出的文章总数在几十条以内,逐页核对是成立的:你可以从列表页第一页翻到最后一页,记录每页首条和末条的标识,再和导出文件逐条对照。这个方法的边界是——它依赖人工翻页,一旦分页数超过你能耐心翻完的范围,遗漏就会发生在你没翻到的那几页。
当样本规模变大,逐页目视不再成立,要换成边界锚点法。做法是:从源端分页接口或列表页中,只抽取每页的第一条和最后一条作为锚点,形成一份锚点清单;导出完成后,在导出文件里检索这些锚点。如果某一页的两个锚点都缺失,说明整页没被导出;如果只缺一个,说明该页在边界处被截断。这个动作的结果直接决定下一步:整页缺失要回头查分页参数,单条缺失要查该条是否被过滤条件排除。
自动导出最容易骗人的地方,是文件能打开、条数看着不少。要判断完整性,需要让导出过程留下可复算的记录,而不是只留一个结果文件。
有了这三类记录,你就能判断遗漏发生在哪一层。假设一个导出任务请求了 1 到 20 页,第 1 至 15 页每页返回 20 条,第 16 页返回 0 条后任务结束——这不一定代表只有 15 页,也可能是第 16 页请求时参数失效或临时无响应。此时正确的下一步不是直接补导第 16 页,而是先单独重放第 16 页的请求,确认它是真的空页还是异常空页。
锚点比对出现缺口,原因通常落在三类里,处理方式各不相同。
这三类原因的区分很重要,因为它们指向不同的修复动作。把分页位移当成导出端截断去重导,往往只是重复一次同样的遗漏。
锚点法有一个前提:源端分页是可枚举、可稳定复现的。当源端本身不提供稳定分页,或分页结果每次请求都在变化时,锚点清单本身就不可靠,比对自然失去意义。
这种情况下要换一种思路:不再比对锚点,而是比对“导出集合”和“源端全量集合”的差集。具体动作是,先用一个独立的全量枚举方式(例如按时间区间逐段拉取)生成一份基准标识集合,再和导出文件的标识集合做差集。差集为空只能说明在本次枚举口径下没有发现遗漏,不能证明源端不存在未被枚举到的内容。所以这个方法的适用条件是:你能接受“基准集合本身也可能不完整”这个前提,并且愿意用第二个独立口径去交叉验证基准集合。
如果两个独立口径得到的集合仍然对不上,先不要断定哪一方正确。请求量、返回条数或某个统计值归零,可能来自限流、权限变化、参数失效或源端临时异常,这些现象本身不能单独证明处理正确。此时应保留两次枚举的原始记录,缩小到具体分页区间再复现,而不是直接以其中一方为准重导。
把上面的判断落成动作,可以按这个顺序走:先确认导出任务是否留下了分页标识和每页条数记录;如果没有,先补上记录能力,再谈完整性。有了记录之后,用每页首末锚点做一次比对,标记出整页缺失和单条缺失。整页缺失优先查分页参数和过滤条件,单条缺失优先查排序位移和导出端截断。最后,对仍然对不上的区间,用第二个独立口径做差集,并保留两次枚举的原始输出作为后续复现依据。
这套顺序的价值在于:它把“导出的文件看起来对不对”变成了“哪一层记录能证明它对不对”,从而让遗漏分页从偶发异常变成可定位、可复现的具体问题。