同一个页面往往有多个能打开的形式:带参数的列表页链接、大小写不同的路径、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 正确,但脚本注入的链接指向另一个地址。
核对顺序:从日志倒推入口
- 取近 3 到 7 天的日志,筛出状态码 200 的 HTML 请求,按 URL 聚合抓取次数。
- 挑出抓取次数靠前的 50 到 100 个页面,逐个抓取源码,提取 rel=canonical,与页面自身 URL 对比。
- 在同一批页面中抽取指向它们的站内链接目标,看是否与 canonical 一致。
- 打开 Sitemap,核对其中提交的 URL 是否等于 canonical 目标。
- 把内链、面包屑、分页、Sitemap 的链接统一到 canonical 目标;非规范 URL 若已长期存在并被外部引用,可考虑用 301 收敛。
几个容易忽略的细节
分页的 canonical
把第 2 页及之后全部 canonical 到第 1 页,等于声明这些页面不必单独保留。如果列表条目只能通过翻页触达,深层条目的发现会被削弱,这一点需要和内容价值一起权衡。
语言与地区变体
多语言站的各语言版本应各自 canonical 到自身,用 hreflang 相互标注,而不是把其他语言页全部 canonical 到主语言版本。否则其他语言版本很难被独立抓取和归集。
渲染方式差异
服务端输出与前端脚本生成的 canonical、链接可能不同。核对时以蜘蛛实际拿到的 HTML 为准,而不是浏览器渲染后的结果。
观察与迭代
抓取次数的分布往往比总量更能说明问题。一个内容有五个 URL、每个各被抓几次,累计看不少,但单一入口的抓取深度可能很浅。
这类一致性核对不必每天做,但改版、切换 CDN、调整参数规则、迁移域名之后都值得抽查一轮。入口统一之后,同样的抓取次数更容易落到真正需要更新的页面上。