结论先给:如果自动导出只抓了第一页或前几页,完整性不能靠“文件里有数据”来判断,而要用“应有分页数 × 每页条数”和末页特征做交叉核对。一个会让这个结论失效的反例是:导出工具把分页合并成了滚动加载,页面没有可见页码,此时按页码推断会误判。下一步动作是先确认分页形态,再决定核对方法。
分页通常有三种形态:带页码的列表、只有“下一页”的列表、无限滚动。带页码的列表最容易核对,因为总页数通常直接显示;只有“下一页”的列表需要一直点到按钮消失,才能知道总页数;无限滚动没有页码,只能靠滚动触发次数或接口返回的游标来判断。
如果自动导出脚本只处理了第一页的链接,后两种形态都会漏。判断方法不是看导出文件大小,而是看导出前后页面上的“末页特征”是否一致。末页特征可以是最后一条记录的标题、编号或时间,只要它在导出文件里出现,说明至少抓到了最后一页。
假设某列表页显示“共 47 页”,每页固定 20 条,那么应有条数约为 47 × 20 = 940 条,最后一页可能只有 7 条,所以实际条数应在 921 到 940 之间。如果导出文件只有 20 条或 100 条,说明只抓了前几页。
这个方法的适用条件是:每页条数固定,且页面显示的总页数或总条数可信。如果每页条数会随筛选条件变化,或者总页数只是估算值,那么“应有条数”只能作为参考,不能作为唯一依据。此时应改用末页特征核对:手动翻到最后一页,记下最后一条记录的某个稳定字段,再在导出文件里搜索该字段。
多个角色对“导出是否完整”有不同理解时,不要争论“看起来全不全”,而是把分歧拆成三个可核对项:
这三个项目都可以写成“谁、在什么页面、看到什么值、和导出文件哪一行对应”。这样分歧就从主观判断变成了可复核的事实。
假设某后台列表显示“共 12 页”,每页 50 条,导出文件有 600 条,末页最后一条编号是 A-0598。核对时先搜索 A-0598,如果搜不到,说明末页没抓到;如果搜到了,但条数只有 550,说明中间有分页被跳过。这个例子的数字只用于说明比较方法,不代表任何真实工具的输出。
动作上,先手动翻到最后一页并记录末页特征,再把该特征作为搜索词放进导出文件。如果搜不到,下一步不是重新导出全部,而是检查脚本是否只处理了第一页的链接,或者是否在翻页时丢失了会话状态。如果搜到了但条数不足,下一步是检查是否有分页被去重逻辑误删。
如果列表页没有固定分页,而是按时间倒序无限加载,那么“总页数 × 每页条数”的推算就不成立。此时完整性只能靠“最后一次滚动后是否出现明确的结束提示”来判断。如果页面没有结束提示,那么任何自动导出都无法仅凭页面本身证明完整,需要改用接口返回的游标或总数字段,并明确该字段是否由页面本身提供。
另一个失效条件是:导出工具在翻页时自动去重,而列表本身存在重复记录。此时实际条数少于应有条数,不一定是遗漏,可能是去重导致的。要区分这两种原因,可以临时关闭去重再导出一次,比较两次的条数差异。
不要一发现条数不对就立刻重新导出。先记录三个值:页面显示的总页数或总条数、末页特征、导出文件的实际条数。如果末页特征存在且条数落在推算区间内,说明导出基本完整,不需要重导。如果末页特征不存在,或者条数明显低于推算下限,再检查脚本的分页处理逻辑。这样做的结果是:你能够把“感觉漏了”变成“末页特征缺失”或“条数低于下限”这样的具体证据,下一步是改脚本还是补导出就有了依据。