被中断的扫描不能靠“跑了多久”或“抓了多少页”来推算覆盖范围,因为中断点之后的数据可能根本没写入。更可靠的做法是:找到最后一条成功落库的记录,把它当作可确认边界,再用站点结构反推边界之外还有哪些区域完全没碰过。下面用一个假设情境把判断过程串起来。
假设你在做一次全站扫描,任务跑到中途因为机器重启或手动终止而停掉。任务日志只显示“已处理 N 个地址”,但 N 这个数字可能包含重复访问、跳转和失败重试,并不能直接当作已覆盖的页面数。此时你手上真正可信的证据只有落库的结果表,而不是运行日志里的计数。判断覆盖范围的第一步,是承认日志计数和实际覆盖是两回事。
把结果表按写入时间排序,取出最后一条记录对应的地址和时间戳,这条记录就是可确认边界。边界之前的地址可以认为已被处理,边界之后的地址状态未知。这里有一个容易被忽略的条件:如果结果表是批量写入而不是逐条写入,最后一批可能只写了一半,那么边界本身也是模糊的。遇到这种情况,要把最后一批整体视为未确认,宁可缩小可确认范围,也不要高估。
判断动作:导出结果表中所有地址,去重后得到已确认集合。把这个集合与站点已知的地址来源做差集,差集就是待确认区域。这一步的结果直接决定下一步——如果差集很小,重跑一次补全即可;如果差集覆盖了整类页面,说明中断发生在结构遍历的早期阶段,需要重新规划扫描顺序。
可确认边界只能告诉你“处理到哪”,不能告诉你“还剩什么”。要补上这一半,需要借助站点自身的结构来源,常见的有以下几类:
这几类来源的可靠性不同。站点地图通常最完整,但可能滞后;内链图反映实际可达性,但深层页面容易被漏掉。把多个来源合并去重后再做差集,比只依赖一种来源更稳妥。
中断后最麻烦的情况是:某些地址其实被访问过,但结果没写进去。以下信号可以帮助区分:
需要提醒的是,抓取量归零或请求量骤降本身不能单独证明任务处理正确,也可能是目标站点限流、网络中断或扫描被主动暂停。这些解释在判断覆盖范围时都要纳入考虑,不能只看一个指标就下结论。
综合上面的证据后,通常面临两个选择:全量重跑,或只补差集。两者成立的条件不同:
如果差集里包含大量带参数的地址,还要先确认这些参数是否真的产生独立内容,否则补跑会引入大量重复。这一步的判断依据是参数是否改变页面主体内容,而不是参数是否存在。
无论选择哪种方式,都要把判断依据写下来:可确认边界的地址和时间戳、差集的来源和数量、选择的补跑方式及理由。这样下次再遇到中断时,可以对照上次的记录快速判断,而不必从头推理。记录本身不需要复杂格式,一份包含边界地址、差集来源和决策理由的清单就够用。
回到最初的问题:判断已覆盖范围的关键不是估算百分比,而是找到可确认边界并明确边界之外的结构性缺口,再据此决定补跑还是重跑。