跳到主要内容

自动停止

Benjamin 支持在满足指定条件的情况下自动停止。

目前 Benjamin 支持配置如下的自动停止条件:

  • 时间限制:在爬取多久后停止
  • Target 数量限制:在爬取多少个 Target 后停止
  • Result 数量限制:在爬取多少个 Result 后停止

以上限制可以从 TaskConfig 的顶级参数中配置。默认情况下,所有以上配置均为不限制。

停止的策略

所有自动停止均为软停止(Soft Stop)。在触发停止条件时只会停止爬取新的目标,而所有已经在爬取中的目标不受影响,会继续爬取完成。这意味着,无论是时间限制还是数量限制都只是一个软约束,最终的爬取结果可能会超过这些限制值。

停止中的状态

考虑到多种因素,在触发自动停止后并不会将任务的状态设置为 Stopping,而是继续保持 Running 状态。如需判断任务是否处于停止中,可以通过 Task 中是否存在 namespaceSTOP_EARLY_REASONNote 来判断。

对应 Note 的 fields 内容中的 r 字段始终存在、代表了停止原因,不同原因可能会额外追加一些特有的字段,具体可参考下面的文档。

停止时机

时间限制

时间限制用于限制在爬取开始后多久会停止爬取。时间限制可以通过 TaskConfigmax_time_seconds 字段来配置,单位为秒,默认不限制。

当因时间限制而停止时,STOP_EARLY_REASON Note fields 的 rExceedRunningTime

{
"time":"2023-11-17T05:09:48.816960716Z",
"namespace":"STOP_EARLY_REASON",
"message":"running time 70s exceeds limit 60s",
"fields": {
"r": "ExceedRunningTime",
"mostSeconds": "60", // 限制的最长运行时间
"usedSeconds": "70", // 首次触发限制时的实际运行时间
}
}

Target 数量限制

Target 数量限制用于限制在爬取多少个 Target 后停止爬取(包含所有爬取完成的和所有爬取中的)。Target 数量限制可以通过 TaskConfigmax_target 字段来配置,默认不限制。

当因 Target 数量限制而停止时,STOP_EARLY_REASON Note fields 的 rExceedTargetsCountLimit

{
"time": "2023-11-17T05:08:32.215641728Z",
"namespace": "STOP_EARLY_REASON",
"message": "targets count 2 exceeds limit 1",
"fields": {
"r": "ExceedTargetsCountLimit",
"limitTargets": "1", // 限制的最大 Target 数量
"currentStartedTargets": "2", // 首次触发限制时的实际已经开始运行的 Target 数量
}
}

Result 数量限制

Result 数量限制用于限制在爬取得到多少个 Result 后停止爬取。Result 数量限制可以通过 TaskConfigmax_result 字段来配置,默认不限制。

当因 Result 数量限制而停止时,STOP_EARLY_REASON Note fields 的 rExceedResultsCountLimit

{
"time": "2023-11-17T05:08:11.563342298Z",
"namespace": "STOP_EARLY_REASON",
"message": "results count 71 exceeds limit 1",
"fields": {
"r": "ExceedResultsCountLimit",
"limitResults": "1", // 限制的最大 Result 数量
"currentResults": "71", // 首次触发限制时的实际 Result 数量
}
}

备注:

  1. 因所有 Target 也会生成一个对应的 Result,因此实际上 Result 数量限制也包含了 Target 数量限制。
  2. 考虑到 Result 可能重复,因此 Result 的限制计算时会利用 CanonicalURL 字段排除重复的进行计数。但因为 NewResult 事件并不会去重,因此下游可能观测到发送的 NewResult 数量远大于这里限制的数量。