先给结论:自动导出漏掉分页,多数时候不是“最后一页没抓到”,而是导出任务在翻页过程中提前判定结束,或者分页游标被重复、跳过。检查完整性的关键动作,是拿导出结果与一份独立获取的分页清单做逐页比对,而不是只看总行数。总行数对得上,仍可能中间缺页、尾页重复,所以必须落到页码或时间切片这一层。
一个常见的矛盾现象是:导出文件的行数和大致预期接近,但抽样核对时发现某几个时间段的数据明显偏少。这时有两种成立的解释。
这两种原因的修复方向完全不同:前者要改终止条件,后者要改翻页方式。所以先区分原因,再动手补数据。
能区分它们的证据,是“每一页的抓取记录”,而不是最终合并后的文件。让导出程序在运行时输出一份日志,每请求一页就记录:请求的页码或游标、返回条数、本页首条和末条记录的某个稳定标识(例如商品ID或时间戳)。
拿到日志后这样判断:
假设一个例子:某次导出共请求了 40 页,每页 100 条,合并去重后得到 3860 行。表面看接近 4000,似乎只差一点。但检查日志发现第 17 页返回 0 条后程序就停了,而第 18 页其实有数据。这里总行数的“接近”纯属巧合,真正的问题是提前终止。
要判断有没有漏,必须有一个独立于导出程序的分页基准。可行的做法是先单独跑一次“只取分页信息”的轻量查询,把总页数、每页条数、末页条数记下来,再和导出日志逐页对照。基准和导出不要共用同一套翻页代码,否则同一个 bug 会在两边同时出现,比对就失去意义。
对照时重点看三处:
不要急着重跑整个导出。先做一个小范围补抓:只针对日志中可疑的那几页,单独请求并保存,然后与主文件按稳定标识合并去重。合并后再次统计总行数和各时间切片的条数。
这个动作的结果会直接决定下一步:如果补抓后各页标识衔接正常、切片分布也合理,说明只是翻页终止或边界问题,修好终止条件和翻页方式即可;如果补抓时仍然出现同样的缺页,说明问题出在查询条件本身(例如筛选条件把部分数据排除了),这时改导出程序没有用,要先核对查询口径。在查询口径未确认前,不要用总行数归零或抓取量下降来证明处理正确,因为筛选条件变化、数据本身更新、请求被限流,都能产生同样的现象。
每次自动导出后,按顺序做三件事:保存导出日志、生成独立的分页基准、逐页比对页数与标识衔接。只有三步都通过,才把文件标记为完整。任何一步不通过,先定位是终止条件、翻页边界还是查询口径,再决定补抓范围。这样即使换工具或换查询对象,检查方法本身仍然成立;具体工具的分页上限、导出条数限制等信息,需要以实际使用时看到的为准。