中断后不要只盯着“扫描到第几页”这个数字。判断已覆盖范围,关键是把本次运行留下的可核对痕迹分成两类:一类能证明某个URL确实被处理过,另一类只能说明它被列入过队列。前者可以计入覆盖,后者只能算待确认。下面按这个区分展开。
全站扫描通常按发现顺序推进:先取出一个种子页,再把它链接到的页面加入待处理队列。中断发生时,队列里可能已经堆了大量URL,但它们只是被登记,并没有经历抓取、解析和结果写入。进度数字往往反映的是队列消耗量或发现量,而不是处理完成量。
因此会出现一个矛盾现象:界面显示已发现几千个页面,但导出结果里只有几百条记录,或者同一批样本在中断前后表现不一致。这不是数据坏了,而是“发现”和“处理”被混在了一起。
解释一:覆盖范围确实到了中断点,只是结果尚未落盘。有些工具会把抓取结果先缓存在内存或临时文件,中断时来不及写回。这种情况下,已处理页面的数量接近中断点,但结果文件偏少。
解释二:覆盖范围远小于中断点,队列里混入了大量未处理URL。如果工具采用广度优先且并发较高,队列膨胀会很明显,中断时真正完成处理的页面可能只占队列的一小部分。
区分这两种解释,可以看三类证据:
假设一次扫描在中断前导出了800条记录,其中600条带有完整字段,200条只有URL。同时日志里找到550条“处理完成”标记。那么可以保守地认为,至少有550个URL被真正处理过;那600条完整记录里可能有50条是中断前刚好写完但日志还没来得及刷新的。此时已覆盖范围应取550到600之间,而不是800。
接下来做一个动作:从这550条里随机抽20条,手动访问其中5条,确认它们当前仍可访问且内容与记录一致。如果这5条都能对上,说明这批完成记录是可信的,可以把它们作为后续增量扫描的起点;如果对不上,说明结果文件可能被覆盖或串了批次,需要重新跑一轮小范围验证。
如果扫描对象是动态渲染页面,结果文件里的字段完整并不等于内容被完整抓取,可能只拿到了骨架。此时要额外看是否有渲染完成标记,否则覆盖范围会被高估。另外,如果工具在中断后自动续跑并覆盖了原结果文件,那么中断前的覆盖痕迹可能已经丢失,只能以最后一次完整导出为准。
还有一种边界:当站点存在大量参数URL或重复路径时,已发现数量会远大于实际独立页面数。这种情况下,覆盖范围应按去重后的规范URL统计,而不是按原始记录条数。
这样做的好处是,恢复扫描时不会重复处理大量已完成的页面,也不会因为高估覆盖而漏掉真正没抓到的部分。至于具体工具在中断后是否保留临时文件、是否支持断点续跑,需要以你当前使用的版本和实际日志为准,不能仅凭界面提示判断。