先给结论:如果新对象格式只是字段增减、顺序调整或分隔符变化,优先在现有输入规范上增加一层“格式适配”规则;如果新格式改变的是对象粒度,比如从“一个页面一行”变成“一个关键词一行”,或从单值字段变成多值嵌套,就应该重写输入规范,而不是继续打补丁。判断依据不是格式新旧,而是解析后的数据模型是否还成立。
对象格式变化时,最容易犯的错是看到列名变了就立刻改代码,看到分隔符变了就立刻写正则。更稳妥的做法是先做一次层级判断。
字段级变化包括:列的顺序调整、列名同义替换、分隔符从逗号换成制表符、空值写法从空字符串变成 NULL、日期格式从 2024-01-01 变成 2024/01/01。这类变化的共同点是,一行仍然对应一个业务对象,字段含义没有根本改变,解析后的记录集合与原来一一对应。
模型级变化包括:原来一行是一个URL,现在一行是一个关键词加多个URL;原来一个字段只放一个值,现在一个字段里用嵌套结构放多个值;原来对象之间是平铺关系,现在出现父子层级。这类变化会改变后续所有环节的假设,包括去重逻辑、字段映射、校验规则和错误定位方式。
判断动作很简单:把新旧两种格式各取一小段样本,分别解析成内部记录,然后比较记录数量和每条记录的字段集合。如果记录数量关系稳定、字段能一一映射,属于字段级;如果记录数量关系随样本变化、字段无法稳定映射,属于模型级。这个动作的结果直接决定下一步是加适配层还是改规范。
当判断结果是字段级变化时,重写输入规范通常得不偿失。因为原有规范里已经沉淀了大量校验规则、错误提示和边界处理,重写意味着这些规则要重新验证一遍。
更合适的做法是在“原始输入”和“规范输入”之间加一层适配。适配层只做三件事:把新格式的字段名映射到规范字段名;把新格式的值转换成规范值类型;把无法映射的字段记录为待确认项,而不是直接丢弃。
实施时有一个关键取舍:适配层应该做成配置还是代码。如果格式变化来自外部协作方,且未来还可能再变,做成配置更合适,修改时不需要动主流程。如果格式变化是一次性的内部调整,写成代码更直接,但要在规范文档里留下变更记录。
假设一个场景:原来输入是每行“URL,关键词”,现在变成“URL 关键词 备注”,用空格分隔且多了一列。此时适配层可以把空格转成制表符、忽略备注列,原有规范完全不动。验证方式是拿新旧两批样本分别跑一遍,比较解析后的记录是否一致。如果一致,说明适配层成立,下一步可以只针对备注列决定是否纳入规范。
例外情况:如果新格式里出现了原有规范无法表达的值,比如关键词字段里出现了多个用分号分隔的词,而规范只允许单值,那就不能只靠适配层解决,需要回到模型级判断。
当对象粒度或字段结构发生根本变化时,继续加适配层会让规范越来越难维护。此时应该重写输入规范,但重写不等于全部推翻,而是重新定义三件事。
第一,重新定义“一行代表什么”。这是模型级变化后最需要先确认的。如果一行代表一个关键词而不是一个页面,那么去重键、主键和错误定位都会变。先把这个定义写进规范开头,后续所有规则围绕它展开。
第二,重新定义字段类型和必填性。多值字段要明确分隔方式、是否允许空值、是否允许重复值。嵌套结构要明确层级上限,避免出现无限嵌套导致解析器无法处理。
第三,调整校验顺序。模型级变化后,原来的“先校验URL再校验关键词”可能不再适用。更合理的顺序是先校验对象粒度是否符合预期,再校验必填字段,最后校验字段内部格式。这个顺序能让错误提示更接近根因,减少误报。
实施动作:先写一份新规范的样例输入和期望解析结果,用这份样例驱动解析器开发,而不是先改解析器再补文档。样例通过后,再拿历史数据回放,观察有多少记录无法解析。无法解析的记录要分类统计,区分是格式确实不兼容,还是解析器实现有遗漏。这个统计结果决定是否需要保留旧格式的兼容入口。
把选择条件写清楚,比记住结论更有用。
还有一种中间情况:格式变化同时包含字段级和模型级调整。这时可以分两步走,先加适配层处理字段级部分,让流程先跑通,再单独安排一次规范重写处理模型级部分。不要试图用一次改动同时解决两类问题,否则出错时很难定位是哪一层引起的。
改动完成后,常见的验证误区是看请求量、抓取量或处理条数是否变化。这些指标归零或波动有很多合理解释,比如上游数据源本身变了、任务调度时间调整、过滤条件收紧,不能单独用来证明输入规范改对了。
更可靠的验证方式是固定一批样本,分别用旧规范和新规范解析,比较三件事:解析成功的记录数、每条记录的字段值、错误记录的错误类型。如果成功记录数一致、字段值一致、错误类型更精确,说明改动成立。如果成功记录数下降,要先检查是样本本身包含旧规范不支持的格式,还是新规范校验过严。
假设一批一百条样本中,旧规范解析成功九十条,新规范解析成功八十五条,差异集中在多值字段上。这时不要直接判定新规范有问题,而要逐条查看那五条:如果它们确实是多值字段且新规范要求显式分隔,那么解析失败是预期行为,需要补的是上游数据清洗,而不是放宽规范。
最后需要核对的一点是:如果站优云SEO工具本身对输入对象有格式要求,具体支持的字段、分隔方式和校验规则需要以工具内实际说明为准,不能仅凭历史经验推断。在格式变化后,先确认工具当前接受的输入形态,再决定适配层放在工具外还是规范内。