结论先说:扫描中断后,能判断的只是“中断前已经处理过哪些对象”,而不是“全站已经安全覆盖”。如果工具按站点地图顺序推进,并且中断前已抓到完整的一批URL,那么你可以把中断点之前视为已覆盖;但如果工具是并发抓取、边抓边写结果,或者中断时正在写入一批数据,那么“已覆盖”的范围会小于你看到的进度条位置。要得到可核对的范围,必须回到扫描日志和输出记录里,找出最后一条完整写入记录,而不是看百分比。
扫描中断后最容易误判的地方,是把“请求发出去”当成“结果已保存”。一次抓取通常包含请求、响应、解析、写库四个阶段。中断可能发生在任何一个阶段:请求发出但没有响应、响应返回但没解析、解析完成但没写入。只有写入成功的记录,才能算作覆盖范围。你可以打开扫描日志,查找最后一条带有完整状态标记的记录,例如状态码、抓取时间、页面指纹都齐全的那一条。如果最后几条只有请求时间、没有状态码,说明它们大概率没有完成写入,应排除在已覆盖范围之外。
一个实际动作是:把中断前最后一批记录按时间排序,找到连续完整写入的截止点,以这个截止点为界。这个动作的结果会直接决定下一步——如果截止点之后还有大量URL未处理,你需要重新扫描剩余部分;如果截止点非常接近中断位置,只补扫少量URL即可。
单看进度条或数量统计,很容易得出相反结论。要区分不同解释,可以核对以下三类证据:
反例是:假设日志显示已处理8000条、总目标10000条,看起来覆盖了80%。但如果你发现最后500条只有请求记录、没有响应记录,那么真实已覆盖可能只有7500条左右。这个反例说明,进度数字本身不能作为判断依据,必须回到记录完整性上。
假设某次扫描按站点地图顺序单线程推进,目标10000个URL,中断时日志显示已写入7200条,且最后一条记录状态完整。在这个假设下,可以把7200条视为已覆盖,剩余2800条需要重新扫描。但如果工具是多线程并发、每批写一次库,那么中断时正在写入的那一批可能只保存了一部分,实际覆盖范围会小于7200条。此时更稳妥的做法是:以最后一个完整批次为界,把最后一批URL全部重新扫描一次,而不是只补扫未出现的URL。
这个例子的意义在于,覆盖范围不是一个固定数字,而是取决于扫描器的调度方式和写入方式。你要先确认自己用的是哪一种方式,再决定补扫范围。
判断出已覆盖范围后,下一步不是立刻全站重扫,而是做一次差异补扫。具体做法是:
这样做的结果是,补扫量通常小于全站重扫,也能避免重复处理已覆盖URL带来的资源浪费。需要注意的是,如果工具本身不支持按URL清单定向扫描,那么你只能选择全站重扫,此时应优先确认工具是否提供断点续扫或分片扫描能力,具体功能需要以该工具当前实际界面和文档为准。
如果扫描过程中工具对URL做了动态发现,比如从已抓页面里继续提取新链接,那么“全站URL清单”本身在中断时就是不完整的。这种情况下,已覆盖范围只能描述“已发现并处理的部分”,不能代表全站。另一个失效条件是:工具在中断时清空了临时缓存或回滚了未提交数据,那么日志里看到的记录可能并不对应最终保存结果。遇到这两种情况,最稳妥的动作是重新扫描,而不是基于中断日志推断覆盖范围。
判断覆盖范围的核心,始终是找到最后一条完整写入记录,并确认扫描器的调度方式是否允许你按顺序推断。只要这两点不清楚,就不要把中断前的进度当作可用结论。