搜尋抓取

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、調整參數規則、迁移域名之後都值得抽查一轮。入口统一之後,同样的抓取次數更容易落到真正需要更新的頁面上。