扫描被中断后,最危险的做法是直接看“已发现页面数”并当成全站规模。更可靠的做法是:先确认中断发生在哪个阶段,再用站点自己的可核对清单去比对软件已经产出的URL集合,最后把“未覆盖”区分为三种不同原因,而不是笼统地记成“没扫到”。
假设一次全站扫描跑到中途被手动停止或进程退出,界面显示已发现URL数量比上一轮完整扫描还多。直觉会认为“这次覆盖更广”,但这个数字可能只是中断时刻的中间状态:爬取队列里已经入队但尚未抓取的URL通常也会被计入发现量,而它们的抓取结果、响应状态和页面要素都还没有产生。因此发现量高不等于覆盖完整,它只说明链接发现阶段走得比较远。
与之相反的情况同样成立:如果中断发生在链接发现早期,已发现量会明显偏低,但这也不必然意味着漏掉了大量页面,因为很多深层页面本来就要经过多跳才能被发现。把发现量单独当作覆盖率指标,在两个方向上都会误导判断。
第一种解释是中断点落在抓取阶段。此时链接发现已经推进到较深位置,URL清单接近完整,缺的是这些URL的抓取结果,例如标题、状态码、可索引性判断。第二种解释是中断点落在发现阶段。此时清单本身就不完整,缺的不只是结果数据,而是页面地址还没被找到。
两者的处理方式完全不同:前者只需要补抓结果,后者需要重新规划抓取入口和深度。要区分它们,不能靠软件里的进度百分比,因为不同工具对“进度”的定义可能包含队列、重试、跳过规则,具体口径需要核对所用工具的说明文档。
最有效的证据是站点自己的URL来源清单,而不是软件给出的汇总数字。可以从以下几个可独立获取的集合入手:
把软件导出清单与站点地图清单做差集,如果差集集中在少数深层目录,且这些目录在导航中需要多跳才能到达,更支持“发现阶段中断”的解释;如果差集很小、但大量URL缺少抓取结果字段,更支持“抓取阶段中断”的解释。日志能进一步验证:如果日志里出现大量请求但导出结果里没有对应记录,说明中断发生在结果落盘之前。
一个具体动作:先导出软件当前的URL清单,按状态字段分组统计,再与站点地图声明的URL做差集。如果差集里超过一半是深层分页或筛选参数页,下一步应优先检查抓取深度和入口设置,而不是直接重跑全站;如果差集很小但待抓取项很多,下一步只需在相同配置下续跑或重跑抓取环节。这个动作的结果直接决定你是调整发现策略还是调整抓取策略。
当某个目录在导出结果中完全没有记录时,不要立刻断定它是漏扫。可能的解释包括:该目录被robots规则阻止、被软件的去重规则合并到其他URL、被规范化规则改写成另一个地址、服务器在扫描期间对该目录返回了限流响应、或者该目录本身没有从任何已抓取页面获得入链。这些原因都会让一个实际存在的目录在结果里消失,但对应的处理动作各不相同。
区分方法是逐项排除:先检查robots与软件自身的排除规则,再检查URL规范化后的最终地址是否出现在清单里,然后查看日志中该目录的响应状态分布。只有这些解释都被排除后,才把它计入“未覆盖”。
与其记录一个覆盖率百分比,不如记录三个可复核的量:软件清单中成功抓取的URL数、站点地图与导航可推导出的已知URL数、以及两者差集中经过人工确认属于真实缺失的数量。第三个数字才是决定下一步的依據。中断前的配置、中断发生的阶段、以及差集的目录分布,应一并留存,否则重跑后无法判断这次结果是否比上次更完整。
需要提醒的是,任何单一来源的URL清单都不等于全站真实页面集合,站点地图可能滞后,导航可能不覆盖全部入口,日志可能只保留有限时段。因此覆盖范围的判断本质上是多个来源的交叉比对,而不是信任某一个数字。