直接回答:不要只写“遇到异常就跳过”这类笼统句子,而要把例外拆成可判定的条件、触发后的动作和留给人工的出口。以你手里那份“添加百度指数”的操作记录为对象,逐条标注正常路径和例外路径,再决定哪些例外交给脚本自动处理、哪些必须中断并提示人工。两种做法各有代价:全部自动化会掩盖脏数据,全部人工确认会让脚本失去意义。
把人工经验转成脚本需求时,最容易犯的错是把所有“特殊情况”写成一类。实际上例外至少分两种。
区分标准不是“难不难”,而是“换一个人来看,是否会得出同一个处理结论”。如果会,就写成自动分支;如果不会,就留给人工。
假设你手里有一份人工整理百度指数相关数据时的经验笔记,里面写着类似“如果这个词查不到,就跳过”“如果数值明显不对,先记下来”。这两句话都不能直接变成脚本需求,因为“查不到”和“明显不对”没有判定标准。
转换动作分三步:
做完这三步,你得到的不是一段描述,而是一张条件与动作的对应表。脚本需求就可以直接引用这张表,而不是再靠执行者临场理解。
假设你面对一批需要添加百度指数相关字段的关键词,脚本运行中会遇到三种情况:正常返回、字段缺失、数值异常。你有两个看似合理的做法。
做法一:脚本遇到任何例外都跳过,继续处理下一条。成立条件是:例外比例低,且跳过的记录可以事后统一补。代价是异常被静默吞掉,如果字段缺失其实意味着采集方式整体失效,你会得到一份看起来完整、实际大量缺失的结果。
做法二:脚本遇到例外就停止,等人确认后再继续。成立条件是:例外数量少,或者每条例外都需要业务判断。代价是脚本可能频繁中断,尤其在数据源本身不稳定时,人工确认会成为瓶颈。
选择依据不是哪个更“安全”,而是例外是否可逆。如果跳过之后还能凭记录找回,做法一可行;如果跳过之后无法判断缺失原因,做法二更合适。你也可以混合:字段缺失自动跳过并计数,数值异常停止并提示。关键是把“跳过”和“停止”分别绑定到不同的例外类型上。
脚本需求里只写条件还不够,要写明这个条件基于什么假设,以及运行后怎么验证。例如你设定“同一关键词两次采集差异超过某个范围就标记异常”,需要注明这个范围是你根据当前数据分布临时设定的假设,不是固定阈值。
验证动作可以这样设计:先在小批量上运行,统计三类例外的实际数量。如果字段缺失占比很高,说明采集环节本身有问题,此时继续调脚本的例外分支没有意义,应该先回到数据来源检查。这个动作的结果会直接影响下一步:是修脚本,还是修上游流程。
另外,比较改动前后的结果时,要考虑搜索需求本身的季节变化和采集时间差异。某一天异常变多,不一定是你改错了,也可能是当天数据源波动。不要用一次前后对比就断定处理正确。
无论自动化程度多高,都要在脚本需求里写明人工介入的位置。常见做法是输出一份待复核清单,包含原始输入、触发条件、脚本已执行的动作。人工拿到清单后只需要做两件事:确认处理是否正确,以及决定是否把这类例外升级为新的自动规则。
如果一份例外记录反复出现且处理方式一致,就把它从人工清单移到自动分支;如果某类例外每次都得出不同结论,就保留人工确认。这个调整过程本身就是脚本需求迭代的一部分,不需要一次写完。
最后,脚本需求描述例外时,避免使用“正常情况下”“一般不会”这类无法执行的表述。把每个例外写成“当满足某条件时,执行某动作,并记录某信息”,执行者才能在不同环境下得到一致结果。