例外情况不能只写“特殊情况特殊处理”,而要写成可核对的判定条件、动作和结果。做法是:先固定一个事实基线,再把分歧点转成“如果……则……”的规则,最后为无法自动判断的情形保留人工确认入口。下面用两种条件展开:规则稳定、能事先穷举时,脚本可以自动执行;规则依赖上下文、各方理解不一致时,脚本只负责收集证据和标记,不直接改站。
判断依据不是例外数量多少,而是例外能否被客观描述。能写成明确比较的,例如“同一路径在两个版本中返回的状态码不同”“页面标题为空或与模板占位文本相同”“内链指向的地址返回跳转链超过一次”,适合交给脚本。需要理解业务意图的,例如“这段内容是否仍然符合当前活动主题”“这个栏目是否应该继续保留”,适合由脚本输出待确认清单。
一个实际动作是:把人工经验逐条改写成“触发条件 + 期望动作 + 不确定时的去向”。假设某条经验是“重要页面不要被误加 noindex”,脚本需求不能只写“检查 noindex”,而应写成:当页面属于已登记的重要路径集合,且响应中出现 <meta name="robots" content="noindex"> 时,记录路径、发现时间、页面来源和上一版对照值;若该路径不在登记集合内,只记录不告警。这样写的结果是,下一步能直接判断是配置错误、模板差异还是登记集合本身过期,而不是收到一堆无法归类的提醒。
运营、开发、编辑对同一事实理解不同,通常不是谁不认真,而是各自看到的对象不同:有人看模板,有人看单页,有人看已经渲染后的结果。脚本需求要先把“看的是哪一个对象”写清楚,再写例外。
例如,编辑认为“标题已改”,开发看到的是模板变量未更新,脚本抓到的却是缓存版本。此时例外描述应写成:若同一地址在两次抓取中标题不同,保留两次结果并标记“版本不一致”,不自动判定哪一次正确。这个动作会让下一步变成核对发布记录和缓存刷新范围,而不是继续争论谁看错了。
当例外集合有限且判定标准稳定时,脚本可以直接执行低风险动作。比如内链检查中,允许的跳转是“http 跳 https”“带 www 跳不带 www”“末尾斜杠差异”,其余跳转一律进入待确认清单。动作结果是:可自动归一化的链接被修正,无法归类的链接保留原状并附带前后地址。下一步只需处理待确认清单,不必全量复查。
但要注意,自动修正本身会改变页面之间的指向关系。一次改动前后比较要考虑季节、搜索需求变化和数据采集差异,不能因为某个页面的抓取量或请求量变化就断定是这次修正造成的。
当例外涉及内容意图、栏目去留、活动周期时,脚本不应直接改站。需求可以写成:当页面同时满足“无内链指向”“无站点地图收录”“最近一次内容更新早于登记周期”时,输出为“待人工确认”,并附上路径、最后更新时间和发现来源。人工确认后再决定是保留、合并还是移除。
这种写法的关键是保留反证。若某个路径请求量归零,不能单独证明它应该被移除,也可能是采集口径变化、入口被临时下线、统计未覆盖该来源。脚本需求里应要求同时记录这些可能解释,避免把相关现象当成处理正确的证据。
可以直接使用下面的结构,把口头经验转成可核对条目:
假设一个短例子:某条经验说“栏目页不要出现空列表”。脚本需求可写成——当栏目页正文中列表项数量为 0,且该栏目在登记表中标记为“应长期存在”时,记录路径和抓取时点,不自动隐藏栏目;若未标记为长期存在,只记录不告警。这个假设说明的是比较方法:先区分登记状态,再决定动作,而不是把所有空列表都当成同一类问题。
看三件事:第一,待确认清单是否在减少,还是只是从一种描述换成另一种描述;第二,每条记录能否回答“谁在什么时点看到了什么”;第三,人工确认后能否反推脚本规则是否需要调整。若清单长期不减少,通常不是例外太多,而是触发条件写得太宽,或者适用范围没有限定。
把例外写成可核对的项目,最终目的不是让脚本替人做所有决定,而是让分歧落在同一份证据上。规则稳定时自动执行,规则依赖上下文时保留人工确认,这两条路径分开之后,网站排名优化步骤中的后续动作才有明确的输入和输出。