爱站一次全站扫描被中断后怎样判断已覆盖范围

📍 WDQWDWQD987AAAAA:216.73.216.226
📱 Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)
🔗 /0196e2296e51.html
📄

爱站一次全站扫描被中断后怎样判断已覆盖范围

结论先给:中断后不要用“扫描到第几条”或剩余时间倒推覆盖范围,而要把已落地的结果按入口分组,逐组核对“该组是否出现过至少一条成功记录”。只有当你确认每个入口组都至少有一条成功记录,且中断点之后没有新增入口,才能把这次扫描近似看作全站覆盖;否则它只是一次部分覆盖。这个判断有一个会失效的反例:如果站点在扫描期间新增了栏目、子域或大量新链接,即便所有旧入口组都出现过成功记录,也不能认定覆盖完整。

为什么“进度条百分比”不能当覆盖证据

全站扫描的进度通常按待处理队列计算,而队列的生成方式决定了百分比的含义。常见情况是:工具先抓首页,再从首页链接里派生下一批任务。中断时显示的百分比,只说明“已处理任务占当时队列的比例”,并不说明队列本身是否已经穷尽全站。

更麻烦的是,队列是动态增长的。你看到 60% 时,可能后面还会因为发现新目录而追加任务,真实分母比显示的大。因此百分比偏高但覆盖偏低是正常现象,不是工具出错。

能作为证据的,是那些不随队列变化的事实:哪些入口被访问过、每个入口下是否出现过成功响应、失败是超时还是被拒。这些记录在中断后依然可查,而百分比会随会话结束失去意义。

按入口分组核对,而不是按 URL 总数核对

把已抓到的结果按“入口来源”归类,比数总条数更有判断力。可以这样分组:

对每一组,只问一个问题:这一组里有没有至少一条成功记录?如果有,说明该入口在中断前已被打开过,这一支的覆盖是“已进入”状态;如果整组为空,说明中断发生在打开该入口之前,这一支完全没覆盖。

这个方法的价值在于,它把“扫了多少”换成“打开了哪些门”。门没打开,里面有多少房间都无从谈起。

区分三种中断原因,它们对覆盖判断的影响不同

同样是中断,原因不同,已覆盖范围的可信度也不同。

  1. 主动停止或超时退出。已落地的结果通常是完整的,覆盖判断按上面的分组法直接可用。
  2. 网络或目标站点拒绝。此时大量失败可能集中在某个时间段,而不是某个入口。要按时间切分,看失败是从哪一刻开始密集出现的,之前成功的那部分仍可计入覆盖。
  3. 程序异常退出。最需要警惕。结果文件可能只写入了缓冲区的一部分,最后若干条记录可能不完整。这种情况下,不要相信最后一批记录,把它们整段排除后再做分组核对。

如果无法确定属于哪一种,保守做法是只采信中断前明显稳定运行阶段的结果,把末尾一段整体丢弃。

一个带假设的短例子

假设某次扫描在约四成进度时中断。事后检查发现:首页和两个一级栏目都有成功记录,站点地图入口没有任何记录,分页列表只有第一条成功。据此可以判断:主体内容已进入,但站点地图这一支完全未覆盖,分页深层大概率也未覆盖。此时把这次结果当作“全站已覆盖”会漏掉大量只出现在站点地图或深分页里的链接。正确做法是补扫这两支,而不是从头重扫全部。

反过来,如果四个入口组都至少有一条成功记录,且中断后站点结构没有变化,那么这次结果可以近似当作全站覆盖,后续只需做增量核对。注意这里的前提是“结构没有变化”,一旦期间新增栏目,结论立即失效。

确认覆盖后,下一步做什么

判断覆盖范围的目的,是决定补扫还是重扫。如果未覆盖的入口组数量少且边界清晰,优先补扫这些入口,成本远低于全量重来。如果未覆盖的入口组超过一半,或者连哪些入口被打开过都无法确认,那就直接重扫,因为补扫的核对成本已经接近重扫。

补扫前做一个动作:把本次已成功的结果单独留存,不要与补扫结果混在同一份文件里。这样后续出现重复或冲突时,你能分清哪些来自第一次、哪些来自补扫,从而判断是站点变化还是抓取差异。这个留存动作直接影响下一次核对的可信度,值得在补扫开始前完成。

图1 图2

nginx