搜索抓取

搜索蜘蛛抓取:Sitemap 声明与页面 canonical 不一致的入口归属核对

当 Sitemap 提交的地址与页面 canonical 指向的地址不一致时,蜘蛛会收到两份互相矛盾的入口信号,表现为部分入口访问逐渐减少。本文按可执行顺序梳理核对方法:先归类不一致类型,再比对源码声明与服务器日志落地情况,最后决定保留哪个入口并收敛重复路径。

搜索抓取

搜索蜘蛛抓取:Sitemap 声明与页面 canonical 不一致的入口归属核对

站点地图(Sitemap)和页面 canonical 都在向搜索蜘蛛表达同一件事:这个地址值得抓取、应当被当作正式入口。但两者并不总是同步维护,改版、分页、参数化调整之后,经常出现 Sitemap 里写 A 地址、页面 canonical 指向 B 地址的情况。蜘蛛拿到两份互相矛盾的信号,通常会选一个继续抓,另一个逐渐减少访问。这个过程不会报错,只会表现为某些入口慢慢没人来。

先判断信号是不是真的冲突

并不是所有不一致都算问题,需要先区分三类情况。

  • 等价不一致:只差结尾斜杠、大小写、http 与 https、www 前缀。这类属于规范化层面,会带来重复入口,但可以通过统一跳转解决。
  • 归属不一致:Sitemap 写的是列表页,canonical 指向详情页或聚合页,两者内容并不相同。这类属于入口归属判断错误。
  • 过期不一致:页面已经下线或改版,Sitemap 仍是旧地址,canonical 已经换成新地址。这类是维护滞后。

把这三类分开,后面的处理方式差别很大,先统一归类再动手。

核对顺序:从声明到落地

  1. 抽样子集:从 Sitemap 里按栏目各抽 20 到 50 条,不必全量,覆盖主要目录即可。
  2. 取页面 canonical:抓取页面源码,记录 canonical 的 href 值,注意区分 head 里的声明和响应头里的 Link 声明。
  3. 比对是否自洽:Sitemap 地址与 canonical 地址去掉协议、域名、结尾斜杠后是否一致,不一致就进入下一步。
  4. 看服务器日志落地:在访问日志中筛选蜘蛛 UA,看它实际请求的是哪个地址、返回什么状态码、是否发生跳转。
  5. 看跳转链:如果 Sitemap 地址会 301 到 canonical 地址,说明两处声明其实一致,只是入口绕了一步;如果两者各自返回 200,就是真正的一页两入口。
  6. 确认收录归属:在搜索后台查看这两个地址的收录与展示情况,判断搜索引擎最终选择了哪一个。

常见成因

  • 改版后栏目路径变化,Sitemap 生成脚本沿用旧规则,页面模板已经更新。
  • 分页与筛选参数页被写进 Sitemap,而页面自身 canonical 指向第一页。
  • 多域名或多语言站点,语言选择逻辑与 Sitemap 域名配置不统一。
  • 内容聚合页与原始详情页互相 canonical,形成 A 指 B、B 指 A 的循环。
  • Sitemap 由第三方工具生成,与站内模板维护在不同节奏上。

处理原则

优先让两处声明指向同一个地址

大多数情况下,正确做法是修改 Sitemap,让它输出与 canonical 一致的地址,而不是反过来改 canonical 去迁就 Sitemap。canonical 是页面级别的判断,更贴近内容本身;Sitemap 是站点级别的清单,改起来成本更低。

能跳转就不要两处并存

如果旧地址确实需要保留对外可见,用 301 指向正式地址即可。Sitemap 里只保留最终地址,避免把跳转前的地址继续提交。

发现循环 canonical 先断链

A 指 B、B 指 A 会让蜘蛛无法确定归属,通常结果是两个地址的抓取频率都下降。保留一个作为自指向,另一个改为 301 或直接下线。

核对时以日志为准,不要只看页面源码。源码可能被缓存或由前端渲染,日志里的请求记录才是蜘蛛实际走过的路径。

核对完成后要留下记录

建议把这三项记在同一份表里:Sitemap 地址、canonical 地址、日志中实际抓取地址与状态码。下次改版或调整脚本时可以对照,避免同一类偏差反复出现。入口数量变少不等于流量一定下降,关键看保留下来的是不是页面真正应该被访问的那个地址。