当同一套火车头采集器规则在新人手里报错、在资深人员手里也报错,但两人给出的原因完全不同时,不要先争论谁更懂,而要先找能区分两种解释的证据。常见矛盾是:新人认为“规则写错了”,资深人员认为“目标页面结构变了”。这两种判断都可能成立,但对应的下一步动作完全不同,因此需要用可观察的日志、请求结果和页面快照来对照。
把“规则写错”作为解释,通常需要满足这些条件:同一规则在之前可运行,且近期没有改动采集目标;错误集中在字段提取为空或标签匹配失败;测试时返回的页面内容与规则假设的层级一致。此时问题更可能出在采集器内部的标签路径、循环范围或编码设置上。
把“页面结构变了”作为解释,则需要另一组条件:采集器发出的请求能正常返回内容,但返回的 HTML 中原本用于定位的容器、类名或层级已经不存在;同一规则在不同时间运行,结果不稳定;或者部分字段能取到、部分字段取不到。这些迹象说明规则本身未必写错,而是它依赖的外部结构发生了偏移。
两种解释并不互斥。实际诊断中更常见的是:页面结构先变,规则没有同步调整,于是表现像“规则写错”。因此对照证据的目的不是选边,而是确定先改哪一层。
第一类证据是原始响应。把采集器实际收到的 HTML 保存下来,检查规则中使用的选择器或正则是否还能命中。如果保存下来的页面里根本没有对应节点,那么“规则写错”就不是首要原因;如果节点存在但匹配结果为空,才需要回到规则本身。
第二类证据是时间对照。用同一规则分别对同一目标在较早快照和当前页面运行。若早先快照能正常提取、当前页面不能,且两者 HTML 结构不同,那么结构变化的解释更强。若两者结构相同但都失败,则更可能是规则或运行环境问题。
第三类证据是请求层面的差异。检查请求是否被重定向、是否返回了验证页、是否因为缺少必要请求头而拿到不同内容。这类情况下,页面结构没有变,规则也没有错,但采集器拿到的并不是预期页面。此时继续改选择器不会解决问题。
第四类证据是字段级结果。把每个字段的提取结果单独列出,而不是只看整体成功或失败。若只有依赖某个容器的字段失败,其他字段正常,通常指向该容器结构变化;若所有字段都失败,则更可能是请求失败、编码错误或规则整体未生效。
假设某条采集规则原本从列表页提取标题和链接,最近标题为空、链接仍能取到。新人会先检查标题字段的标签路径,发现路径写的是 <h3 class="title">,于是认为路径写错了。资深人员则先保存当前页面,发现标题现在放在 <a class="item-title"> 里,原来的 h3 已经不存在。此时证据支持“结构变化”而不是“路径写错”。
下一步动作应该是:先用当前页面中的新容器更新定位,再重新运行一次。如果更新后标题和链接都恢复,说明主要问题是结构偏移;如果更新后标题能取到但链接又丢了,才需要回头检查规则中字段之间的依赖关系。这个顺序能避免在错误方向上反复修改。
诊断结束后,把结论写成一条可验证的假设,而不是一句“规则有问题”。例如:“当前页面标题节点已从 h3 变为 a.item-title,因此标题字段为空。”然后只改与这条假设直接相关的部分,运行一次,观察结果是否与预期一致。若一致,再处理下一个字段;若不一致,回到证据层重新对照。
对新人来说,关键动作是保存原始响应并做字段级检查,而不是凭印象改标签。对资深人员来说,关键动作是说明自己依据的是哪一类证据,而不是直接给出结论。两者对照证据的方式不同,但都需要让下一步动作能被结果检验。这样即使判断不同,也能通过一次运行收敛到同一个可处理的问题上。