直接回答:不要只写“遇到异常就跳过”,而要把例外拆成三张清单——可判定的触发条件、触发后的动作、动作失败后的去向。人工处理时靠直觉补位,脚本没有直觉,所以例外描述的质量决定了脚本是帮你提升权重,还是把一批页面悄悄漏掉。
同一个人,手动处理一批页面时判断很准:哪些页面该改标题、哪些该补内链、哪些先放着不动,几乎不出错。把同样的经验写成脚本需求后,跑出来的结果却常常两极分化——要么大量页面被误改,要么大量页面被静默跳过。这不是经验错了,而是经验里隐含了大量“看情况”的分支,写需求时没有被翻译出来。
常见的两种解释:第一种是需求写得不够细,缺了边界条件;第二种是需求写得太细,把所有偶发情况都当成规则,脚本反而僵化。两种解释都成立,但对应完全不同的改法,必须先区分。
可判定例外指的是脚本能读到明确信号就做出判断的情况,例如页面返回状态异常、正文区域为空、目标字段已存在、同一页面被重复命中。这类例外应当写成硬规则:条件成立就执行指定动作,动作结果写进日志。
不可判定例外指的是需要人看内容语义才能决定的情况,例如两段表述哪个更贴合页面主题、某个栏目是否值得继续投入。这类例外不要试图用规则穷举,而应写成“挂起并输出待人工确认清单”,让脚本负责收集和分类,人负责拍板。
把这两类混在一起,是脚本失控的主要来源:把不可判定的写成硬规则,会误伤;把可判定的留给人工,会拖慢。
写需求时,每条例外至少包含四个字段,缺一个都会在后期变成返工:
假设一个场景:脚本负责给一批页面补充站内链接。若某页面正文过短,硬规则可能直接跳过。但“正文过短”本身有多个原因——页面类型本来就不需要长正文、正文被前端渲染后才出现、采集时截断。这三种原因对应的处理完全不同,所以触发条件里要同时记录页面类型和采集方式,才能在下一次跑批时区分。
判断该往哪个方向改,看三个信号:
这里要提醒一点:某项统计从有到无,不能单独证明规则写对了,也可能是采集口径变了、页面结构改了或跑批时间不同。比较改动前后时,要同时考虑季节和搜索需求本身的波动,不要把所有变化都归因于这次脚本调整。
一个可落地的做法:先让人工处理一小批页面,处理过程中同步记录每次“犹豫”的瞬间。犹豫点就是例外清单的原始素材。把每个犹豫点翻译成触发条件加动作,再拿同一批数据让脚本重跑,对比人工结果与脚本结果的差异集合。差异集合里的每一条,都要能回答“这是条件没写全,还是本来就不该写成规则”。回答不了的,先挂起,不要硬塞进规则。
这个动作的结果会直接影响下一步:如果差异主要来自条件缺失,就继续补规则并扩大跑批量;如果差异主要来自语义判断,就把脚本定位为筛选和预处理工具,把最终决策保留在人工环节。两种定位对应不同的投入节奏,也对应不同的权重提升预期——前者追求覆盖面,后者追求准确率,混着定目标只会两头落空。