搜索抓取

canonical 目标与内链指向不一致:抓取归集的核对清单

同一份内容常常有多个能打开的形式,当 canonical 声明的目标与内链、面包屑、Sitemap 里实际指向的 URL 不同时,抓取次数会被分散。本文按日志聚合、canonical 提取、内链与 Sitemap 对照的顺序给出核对步骤,并说明分页、多语言变体和渲染差异下容易忽略的细节。

搜索抓取

canonical 目标与内链指向不一致:抓取归集的核对清单

同一个页面往往有多个能打开的形式:带参数的列表页链接、大小写不同的路径、http 与 https 混用、尾斜杠缺失。当 canonical 声明的目标 与站内实际链接指向的 URL 不一致时,蜘蛛会从不同入口把同一份内容抓很多次。日志上的抓取量看着不少,但真正被归集到主 URL 的信号却很分散。

先把三个口径分开

排查这类问题前,先区分三件事:被发现的 URL(出现在内链、Sitemap、外链中的地址)、被抓取的 URL(日志里出现蜘蛛请求的地址)、被归集的规范 URL(canonical 指向的目标)。三者一致时抓取效率最高;不一致时,就要判断是入口的问题还是声明的问题。

常见的指向不一致场景

  • 内链带跟踪参数(?from=、?ref= 等),canonical 指向无参数版本;
  • Sitemap 提交的是 https 版本,站内导航仍写 http,或者反过来;
  • 导航与面包屑使用带尾斜杠的路径,canonical 不带斜杠;
  • 列表页翻页链接指向第 2、3 页,但这些页面把 canonical 写回第 1 页;
  • 移动端使用独立域名或 m 子域,canonical 指向桌面版;
  • 服务端输出的 HTML 中 canonical 正确,但脚本注入的链接指向另一个地址。

核对顺序:从日志倒推入口

  1. 取近 3 到 7 天的日志,筛出状态码 200 的 HTML 请求,按 URL 聚合抓取次数。
  2. 挑出抓取次数靠前的 50 到 100 个页面,逐个抓取源码,提取 rel=canonical,与页面自身 URL 对比。
  3. 在同一批页面中抽取指向它们的站内链接目标,看是否与 canonical 一致。
  4. 打开 Sitemap,核对其中提交的 URL 是否等于 canonical 目标。
  5. 把内链、面包屑、分页、Sitemap 的链接统一到 canonical 目标;非规范 URL 若已长期存在并被外部引用,可考虑用 301 收敛。

几个容易忽略的细节

分页的 canonical

把第 2 页及之后全部 canonical 到第 1 页,等于声明这些页面不必单独保留。如果列表条目只能通过翻页触达,深层条目的发现会被削弱,这一点需要和内容价值一起权衡。

语言与地区变体

多语言站的各语言版本应各自 canonical 到自身,用 hreflang 相互标注,而不是把其他语言页全部 canonical 到主语言版本。否则其他语言版本很难被独立抓取和归集。

渲染方式差异

服务端输出与前端脚本生成的 canonical、链接可能不同。核对时以蜘蛛实际拿到的 HTML 为准,而不是浏览器渲染后的结果。

观察与迭代

抓取次数的分布往往比总量更能说明问题。一个内容有五个 URL、每个各被抓几次,累计看不少,但单一入口的抓取深度可能很浅。

这类一致性核对不必每天做,但改版、切换 CDN、调整参数规则、迁移域名之后都值得抽查一轮。入口统一之后,同样的抓取次数更容易落到真正需要更新的页面上。