结论先行:功能开关引起的页面变化,应当按“开关状态 + 页面输出 + 抓取可见性”三层分别记录,而不是只给页面截一张图。对少量样本,人工对比通常够用;一旦样本扩展到几十上百个 URL,同一开关在不同模板、不同缓存层级下会产生例外,人工记录会迅速失真。记录的目的不是证明改动正确,而是让下一次异常出现时能判断“哪一层变了”。
功能开关往往只控制某个组件是否渲染,但页面最终呈现还受模板版本、缓存和个性化逻辑影响。如果只记录“开/关”两个值,遇到页面仍然显示旧内容时,就无法区分是开关没生效、缓存没刷新,还是模板本身忽略了该开关。
可行的做法是为每个受影响的 URL 记录四项:开关名与取值、命中的模板标识、返回给爬虫的 HTML 摘要、以及页面在无脚本环境下的可见文本片段。摘要不必完整保存,保留首屏结构和关键区块的文本即可。这样当页面变化时,可以先比对是哪一项先变。
假设一个站点用开关控制“相关推荐”模块的显示。开启后列表页应多出一个区块。若只记录开关为 on,而实际 HTML 中没有该区块,可能的原因包括:模板分支写错、缓存返回旧版本、或该开关只对部分 URL 生效。保留模板标识和 HTML 摘要后,这几种原因就能被区分开。
样本少时,一个开关通常对应一种页面结构,记录方式可以统一。但规模化后常见一个反例:同一个开关被多个模板复用,而其中某个模板只在特定条件下才读取它。此时“开关已开启”并不等于“所有相关页面都会变化”。
这种例外会破坏按开关聚合的记录方式。如果仍然只按开关状态分组,就会把未变化的页面误判为异常,或者把真实异常淹没在正常差异里。更稳妥的分组维度是“开关 + 模板 + URL 模式”,先确认每个组合是否真的受该开关影响,再决定是否纳入同一份记录。
判断某个组合是否受影响的动作是:在开关切换前后各取一次该组合下的样本页面,对比关键区块是否存在。如果切换前后完全一致,就应把该组合标记为“不受此开关控制”,而不是继续按开关状态追踪。这个标记会直接影响下一步——它决定异常排查时是否需要检查该模板。
开关变化后页面输出变了,不代表搜索引擎看到的就是新版本。缓存、渲染方式、以及抓取限制都会让抓取结果滞后或不同。因此版本记录里应把“我们发出的 HTML”和“爬虫实际可获取的内容”分开标注。
具体动作可以是:在开关切换后,用相同 UA 或普通请求各取一次页面,保存状态码、最终 URL 和响应体中的关键文本。若两者不一致,说明中间存在缓存或重定向层,需要先解决这一层,再谈索引层面的变化。忽略这一步,容易把缓存问题误判为索引问题。
需要提醒的是,robots.txt 的抓取限制不等于可靠的索引移除,站点地图也不保证收录。这两点与开关记录的关系在于:它们会影响你观察到的抓取结果,因此不能把“爬虫没抓到新版本”直接归因于开关未生效。
记录本身不是终点,它的价值在于让下一步动作有依据。一份最小记录至少包含:时间、开关名与取值、模板标识、URL 样本、HTML 关键区块摘要、抓取响应状态。字段不必多,但要保证同一 URL 在不同时间点可以纵向对比。
把这三条判断写进记录流程后,每次开关改动都能留下可复查的轨迹。下一步动作应当基于“哪一层先变”来决定,而不是基于页面看起来是否更新。只有区分开开关、模板输出和抓取可见性,功能开关导致的页面变化才不会被误记成同一个版本状态。