结论有前提:如果关键词工具在中断前已经把已处理条目的状态逐条落盘,并且你能读到扫描开始时间、最后一条完成记录和队列游标,那么已覆盖范围应以“最后一条完整写入的记录”为边界,而不是以中断时页面显示的进度条或已用时估算。若工具只在内存中累计、结束时才一次性写入,那么中断后你无法从结果文件反推覆盖范围,只能重新扫描或改用能分段落盘的运行方式。
全站扫描被中断后,最容易被误读的是进度百分比。进度条通常按“已取到的URL数÷预估总数”计算,而预估总数可能来自站点地图、历史抓取或上一轮扫描,和本轮实际可抓取范围并不一致。中断发生在抓取阶段、解析阶段还是写库阶段,也会让同一个百分比指向完全不同的覆盖含义。
可核对的证据是落盘结构。打开结果文件或数据表,检查是否存在以下任一形态:
如果是第一种,你可以用“最后一条完整记录”划定覆盖边界,并把它之前的所有条目视为已处理。如果是第二种,覆盖范围不可判定。第三种最理想,恢复时从游标继续即可。第四种需要先去重,否则会把重试当成新增覆盖。
上面结论会在一种情况下失效:工具采用“先写占位记录、再补内容”的两阶段写入。此时最后一行记录虽然完整落盘,但它可能只是一个待处理标记,实际解析结果为空。判断方法是抽查边界附近若干条记录,看正文字段、状态字段和抓取时间是否同时存在。若只有URL和创建时间,没有抓取时间或内容长度,那么边界应向前回退到最近一条三个字段齐全的记录。
另一个会让结论失效的反例是分片并行。多个工作进程同时写同一张表时,最后一条记录的时间戳可能来自某个分片,而其他分片仍在更早的位置。此时应分别取每个分片的最大已完成位置,再取其中的最小值作为整体覆盖边界。只看全局最大时间戳会高估覆盖范围。
中断后出现“结果数量明显少于预期”或“结果数量反而多于上次”,不要直接归因于工具失效或站点变化。可以按下面几组证据区分:
这些证据指向不同动作:超时集中就调整超时与并发后补扫该段;目录集中就检查过滤规则;重复升高就先修去重键再判断覆盖。把“数量少”直接当成“没扫到”会引导你去重扫全站,成本高且可能重复触发同样的中断。
假设一次扫描在运行到第4000条时被手动停止,结果表里第4000条记录含URL、抓取时间和内容长度,第3999条及之前均完整;同时存在一个游标文件,指向第4001条。此时合理动作是从游标恢复,而不是重头扫描。恢复后只需核对新增记录是否与游标之后的队列一致,并抽查边界前后各若干条的状态字段。
若同一场景下结果表只有汇总计数“已处理4000条”,没有逐条记录和游标,那么下一步不应是估算覆盖率,而是换一种能逐条落盘并保留断点的运行配置,或接受重新扫描。重新扫描前先确认站点是否会对高频请求做出限制,避免第二次中断发生在同一位置。
无论本次覆盖范围能否确定,都应该把判断依据固定下来:记录扫描开始与结束时间、使用的入口来源、去重键、并发与超时设置、是否分片,以及中断时的最后一条完整记录标识。下一次运行前,先比对这些字段是否与上次一致;不一致时,覆盖范围不能直接沿用上次结论。具体工具是否提供断点续扫、逐条落盘或分片游标,需要以你实际使用的版本文档和运行日志为准,不能仅凭工具名称或宣传描述推断。