先把“被发现”拆成两条链:一条是旧URL经301转向到新URL,另一条是新URL自身被爬虫或索引系统发现。对照组要按这两条链分别建立,不能把所有未出现的新URL都当作“301失败”。下面用一组假设情境说明划分方法。
假设某站把500个旧商品页301到500个新商品页。改版四周后,站点地图里新URL有120个出现在索引结果中,其余380个没有。旧URL的301响应全部返回目标地址,服务器日志里也能看到爬虫访问过其中一部分旧URL。此时真正要回答的不是“301有没有生效”,而是“哪些条件让一部分新URL被继续处理,另一部分停在原地”。
如果直接把380个未出现页面归为“301无效”,就会把响应层问题和发现层问题混在一起。更稳妥的做法是先选一批已知被发现的页面作为阳性对照,再选一批未出现的页面作为阴性对照,然后只改变一个变量做比较。
第一层对照不按页面类型分,而按旧URL的抓取记录分。把500个旧URL分成两组:A组是日志中明确出现过爬虫请求的旧URL;B组是日志中没有出现请求记录的旧URL。然后分别检查A、B两组对应的新URL被发现的比例。
这里的关键动作是拉出旧URL的访问记录,并给每个旧URL标注“有请求”或“无请求”。这个动作的结果会直接决定下一步:有请求但未发现,查新URL;无请求,查旧URL的入口和抓取路径。
第二层对照只取A组,也就是旧URL确实被抓取过的那些。把它们再分成两类:一类是旧URL一次301就到最终新URL;另一类是旧URL经过两次或更多次跳转才到最终新URL,或者中途经过与最终页不同的地址。
这样分组的目的是把“跳转链长度”和“最终页是否被发现”放在一起看。假设A组里有200个旧URL,其中150个一次跳转,50个多次跳转。如果一次跳转的新URL被发现比例明显更高,多次跳转就是需要优先处理的变量。反过来,如果两类比例接近,跳转链长度就不是主要解释。
需要提醒的是,301响应正常只说明服务器按预期返回了跳转,不等于新URL一定会被继续处理。robots.txt限制抓取、页面本身不可索引、站点地图只列了部分新URL,都会让“未出现”有别的解释。因此第二层对照必须同时记录新URL是否可被抓取、是否可被索引,而不是只看状态码。
第三层对照针对所有已到达最终新URL、但未出现在索引结果中的页面。把新URL分成两组:C组有站内链接或站点地图入口;D组没有独立入口,只能靠旧URL跳转到达。
这个分组能区分两种常见情况:一种是新URL本身没有被发现路径,另一种是新URL被发现过但没有被保留。判断依据可以来自服务器日志中新URL的请求记录,也可以来自站点地图覆盖范围。如果C组和D组都大量未出现,就不能把原因简单归到“缺少内链”上。
一个可执行动作是:先给D组补上一条从相关分类页或导航页到新URL的普通链接,保持其他条件不变,过一段时间再比较D组和C组的变化。如果D组开始出现而C组没有同步变化,说明入口缺失是合理解释之一;如果两组都没有变化,就要回到页面内容、重复度和索引状态上查。
读结果时不要只看“出现数量有没有增加”。请求量、抓取量或索引数量归零,都不能单独证明处理正确,因为服务器波动、抓取预算变化、站点地图更新延迟都可能造成同样现象。更可靠的做法是固定观察窗口,比较同一组页面在动作前后的变化,并保留未处理组作为参照。
这样划分后,对照组回答的是“哪一层条件不同”,而不是“301有没有用”。如果阳性对照和阴性对照在同一条件下表现接近,就说明该条件不是主要变量,下一步应换一个条件继续比较;如果两组在同一条件下明显分开,才值得围绕这个条件做集中处理。