核心做法是把“开关状态”和“页面输出”分开记录:每次开关变更都留一份可复现的快照,注明变更时间、开关名、取值、请求的URL与返回内容摘要。这样做的原因是,功能开关经常同时影响模板分支、缓存键和返回给爬虫的HTML;如果只记录“页面变了”,事后无法判断是开关本身、缓存还是其他改动造成,也就无法决定哪些旧内容值得保留、哪些可以退出。
旧系统或旧合作关系退出时,常见的情况是:把某个功能开关关闭后,页面正文看起来恢复了旧版,但抓取到的HTML里仍残留新模块的容器,或者反过来,页面显示旧版而结构化数据仍是新版。此时有两种合理解释。
这两种解释对应的处置顺序不同:前者要先处理缓存键与刷新策略,后者要先确认模板和脚本是否也随开关回退。仅凭“页面肉眼看起来恢复了”无法区分。
可区分的原因是缓存命中与模板输出的痕迹不同。建议在每次开关变更时,用同一URL、同一User-Agent,分别记录以下内容:
如果开关关闭后,响应体哈希与变更前一致,且缓存头显示命中旧缓存,那么更可能是解释一;如果哈希变化、容器仍在但内容为空,则更接近解释二。这里的关键是:抓取限制不等于索引移除,站点地图也不保证收录,所以版本记录不能只依赖这些文件,必须回到实际返回的HTML。
假设某旧合作方模块由开关 partner_block_enabled 控制,准备退出,但其中“常见问题”部分仍有保留价值。可以按以下方式记录:
true 时的页面快照,标出合作方模块与常见问题区块的HTML片段。这个例子中的数字只用于说明比较方法:每次只改一个变量,并保留前后两份快照。实际动作是“先关数据、再关模板”,其结果是:如果第一次变更后常见问题仍在,说明它不依赖合作方数据,可以安全保留;如果第一次变更后常见问题也消失,则说明两者共用同一数据装配路径,需要先拆分再退出。
功能开关变化后,页面输出还可能受其他因素影响:CDN缓存、服务端页面缓存、A/B测试分组、地区或登录态差异。因此记录时要固定请求条件,并注明假设。若涉及HTTPS,只能说明传输层配置,不能据此推断页面无漏洞或排名更好;若涉及多个搜索引擎,其对开关后HTML、动态渲染和结构化数据的处理方式不同,需要分别核查,不能用一个引擎的结果推断另一个。
另外,请求量或抓取量归零不能单独证明开关处理正确,也可能是抓取预算调整、robots.txt临时限制或站点整体流量变化所致。下一步应结合响应体哈希和容器存在性判断,而不是只看流量曲线。
建议为每个受开关影响的URL维护一条版本记录,至少包含:时间、开关名与取值、请求条件、响应体哈希、关键容器是否存在、缓存命中状态。当需要决定旧内容是否保留时,先查这条记录:若关闭开关后目标内容仍稳定输出,且不依赖即将退出的数据源,就可以保留;若目标内容随开关一起消失,则应先拆分数据依赖,再执行退出。这样,版本状态记录就不只是留档,而是直接决定保留与退出的顺序。