先看扫描器在中断前留下的进度记录和已写入结果,而不是凭“跑了多久”估算。判断覆盖范围的关键是找到三类可核对的证据:开始与结束时的URL清单、每类结果的计数、以及最后一条成功写入记录的时间戳。如果这三类证据互相吻合,可以按已覆盖处理;如果只有时间戳,覆盖范围通常不确定。
全站扫描通常分三层执行:发现URL、抓取页面、写入结果。中断可能只影响其中一层。假设一次扫描发现阶段已完成,抓取到一半时进程被杀掉,那么“发现覆盖”是完整的,“抓取覆盖”是不完整的。这两者的结论完全不同。
判断动作:打开扫描器的工作目录,找到URL队列文件或数据库表,看它是否有明确的完成标记。有完成标记,说明发现层可信;没有,则把发现层视为不完整。
仅看一个数字容易误判。更稳的做法是对比三份计数:发现到的URL总数、尝试抓取的URL数、成功写入结果的URL数。三者的关系决定了下一步。
这里有一个容易被忽略的反常现象:某些扫描器在中断时会先写入一条“批次结束”记录,导致计数看起来完整,但实际内容缺失。要区分这种情况,需要看最后若干条记录的时间戳是否集中在一个很短的时间窗内。如果是,说明是批量收尾而非真实完成。
以下情境为假设,用于说明判断方法,不代表任何真实项目结果。
假设某站点约有五千个可抓取URL。一次扫描在运行约四十分钟后被手动停止。工作目录里有一个URL队列文件,标记为“未完成”;结果数据库中有三千二百条记录;日志最后一条写入时间与停止时间相差不到两秒。
第一步,检查队列文件。它没有完成标记,说明发现层可能不完整。但进一步看,队列文件里的URL数量是四千八百条,且最后一批URL的添加时间在停止前十分钟就停止了。这提示发现阶段可能已经自然结束,只是缺少完成标记。
第二步,对比计数。发现四千八百,结果三千二百,差值一千六百。检查临时抓取文件,发现有约一千五百条已抓取但未写入的记录。这意味着实际抓取覆盖接近四千七百,写入覆盖是三千二百。
第三步,决定动作。由于发现层大概率完整,且临时文件可恢复,选择先执行写入恢复,再对剩余约一百条未抓取URL做补充抓取。恢复后写入数达到四千七百,与发现数的差值缩小到一百,此时可以认为覆盖范围已经明确:全站约四千八百个URL中,已处理四千七百个,剩余一百个需要单独处理。
这个路径的关键是:不把“结果数”直接当成“覆盖数”,而是把发现、抓取、写入三层分开核对。任何一层缺失,都会让覆盖判断偏向保守或激进。
以下情况出现时,不建议直接复用已有结果:
这些信号的共同点是:缺少可核对的边界。此时更稳妥的动作是重新执行一次完整扫描,或者至少重新执行发现阶段,再决定是否复用旧结果。重新扫描的成本通常低于在不确定覆盖范围上做后续分析的成本。
判断完成后,把结论写成一条简短记录,包含:扫描目标范围、发现数、抓取数、写入数、中断点、已覆盖比例、未覆盖部分的处理方式。这条记录的作用不是汇报,而是让下一个使用这批数据的人知道哪些结论可以依赖、哪些需要重新验证。
如果后续分析只依赖已写入的结果,就在记录中注明“未覆盖部分不影响当前分析”或“未覆盖部分可能影响某类页面的结论”。这样,覆盖判断就从一次中断的善后,变成了对后续决策的约束条件。