描述例外情况的关键,是把“人看到什么就跳过、什么情况下不能照常处理”转成脚本能判断的条件分支。前提是否稳定,决定你应该写成硬规则还是待确认标记:前提稳定时写死跳过条件,前提会变化时写成可配置参数并保留人工复核输出,避免脚本在边界场景里静默做出错误动作。
人工经验里最容易被忽略的部分,是操作者凭上下文做出的临时判断。写脚本需求时,先问一句:这个判断依据在可预见的时间内会不会变。若不会变,例如“页面返回状态不是成功时不做后续处理”,可以直接写成硬性条件;若会变,例如“某类栏目暂时不参与处理”,就应写成参数,并注明谁来维护、多久复核一次。
两种条件对应两种写法:
判断依据可以看三个信号:这条例外最近三个月是否被改过;不同操作者是否给出过不一致的判断;例外触发后是否有人工回看。三个信号里有两个指向“会变”,就按可配置处理。
人工经验常写成“内容太少的页面先不动”“看起来是重复的就不处理”。这类描述脚本无法执行,因为“太少”“看起来”没有阈值。改写动作是:为每个模糊词补一个可测量的判断量,并注明这个量由谁提供。
假设一条经验是“列表页内容偏少时跳过”。可以改写成:当列表页可提取的条目数少于配置项 min_items 时,跳过该页,并把 URL 与条目数写入待确认文件。这里 min_items 是假设的配置名,具体取值由业务方给出,不由脚本自行猜测。这样改的结果是:脚本行为可预测,边界页面不会被误处理,同时留下证据供下一步调整阈值。
需要写进需求的例外类型通常有四类:
每类都要写清触发条件、脚本动作、记录位置三件事,缺一件,后续排查就会失去线索。
假设你有一批栏目页要按人工经验批量调整标题。人工经验是“频道首页不动,只改二级列表页”。
若栏目结构稳定、频道首页路径有固定前缀,可以把例外写成:路径匹配该前缀的页面直接跳过,不进入处理队列。这是硬规则,脚本简单,执行结果容易核对。
若栏目结构正在调整,前缀可能变化,则应把例外写成一份豁免清单文件,脚本每次运行前读取。清单里没有的页面按常规处理,清单里有的跳过并记录。运行后先看待确认清单里出现了哪些新页面,再决定是否把它们加入豁免。这个动作的价值在于:结构变动期不会因为写死前缀而误改新频道页,也不会因为漏掉豁免而重复处理。
两种选择的依据是同一条:例外依据会不会变。会变就外置成清单,不会变就内联成条件。
例外处理是否写对,不能只看脚本有没有报错。要看出现在待确认清单里的页面数量与类型:如果大量正常页面被跳过,说明阈值过严或豁免清单过宽;如果本该跳过的页面被处理了,说明条件写漏。此时的动作是调整阈值或清单,再跑一次小范围样本,而不是直接全量执行。
比较改动前后时要注意,搜索需求本身会随季节和事件变化,抓取或请求数据的变化也可能来自采集时间、频次差异,不能把一次波动直接归因于脚本改动。稳妥做法是保留改动前的记录作为基线,用同一时间段、同一采集方式做对照,再判断例外规则是否合理。
需求文档里不要把例外散落在流程描述中。单独列一节,逐条写:触发条件、脚本动作、记录位置、维护人。维护人这一项常被省略,但它决定了例外清单多久复核一次。没有维护人的清单会随时间失效,最终变成无人敢改的历史包袱。
如果例外数量超过十条,考虑按类型分组,并给每组一个默认处理方式:跳过、转人工、还是按常规处理。分组后,新增例外只需归入已有组,不必每次重写判断逻辑。这样做的直接结果是需求更短、脚本分支更少,后续调整时也更容易定位是哪个条件在起作用。