搜索抓取

同一份内容多个 URL:抓取分散的来源与收敛做法

站内常因大小写、末尾斜杠、参数、协议或主机名差异,产生多个指向同一内容的 URL。蜘蛛会逐个抓取,抓取时间被摊薄,日志也更难读。本文梳理这些重复地址的常见来源,并给出内链统一、301、canonical、Sitemap 收敛的处理顺序与检查方法。

搜索抓取

同一份内容多个 URL:抓取分散的来源与收敛做法

为什么会出现“同一内容多个 URL”

很多站点在开发阶段不会刻意区分 URL 形式,上线后随着栏目增多、参数叠加、域名切换,同一份内容往往会对应好几个可访问地址。对用户来说差别不大,对搜索蜘蛛来说却是几个独立页面:它会分别请求、分别解析、分别安排后续抓取。

常见的重复来源

  • 大小写差异:/About 与 /about 都返回 200。
  • 末尾斜杠:/list 与 /list/ 同时可访问。
  • 参数叠加:?from=xxx、跟踪参数、?page=1 等默认参数。
  • 协议与主机名:http 与 https、带 www 与不带 www 并存。
  • 索引页与内容页:/article/123 与 /article/123.html、打印版地址。
  • 排序与视图参数:?sort=price、?view=list 之类只是展示顺序变化。

抓取分散带来的实际影响

最直接的影响是抓取时间被摊薄。假设一个列表页有 500 条内容,每条内容存在三种 URL 形式,那么蜘蛛要抓 1500 次才覆盖得完,其中三分之二是重复劳动。对更新频繁的站点,这意味着新内容被发现的速度变慢。

其次是日志噪声。同一个页面的抓取记录散落在多条 URL 上,统计访问量、判断哪些栏目被冷落时容易误判。此外,内链如果指向不统一的地址,页面之间的推荐关系也会被分散,不利于蜘蛛理解哪个地址才是主版本。

收敛的处理顺序

1. 先统一站内链接

内链是蜘蛛发现 URL 最稳定的入口。把导航、面包屑、列表页、正文推荐位里的链接统一成同一个形式,是成本最低、见效最直接的一步。相对链接与绝对链接混用时,注意 base 标签和路径拼接是否符合预期。

2. 用 301 把旧形式导向规范地址

对于已经存在并被抓取过的重复地址,用 301 永久跳转指向规范版本,比让它继续返回 200 更明确。跳转链尽量保持一跳,不要 A 到 B 再到 C。

3. canonical 作为补充而非替代

canonical 是一个提示,不是强制指令。它不能替代 301,也不建议跨域名滥用。

如果页面必须保留多个可访问地址,例如分页或多语言版本,可以在页头写 canonical 指向主版本。但如果站内链接本身指向就不一致,canonical 的效果会打折扣。

4. Sitemap 只列规范 URL

Sitemap 里出现重复地址,等于主动引导蜘蛛去抓非主版本。整理一份只包含规范地址的清单,并定期核对是否与站内链接一致。

5. 参数与视图页的处理

对排序、筛选、跟踪类参数,优先考虑在服务器端做规范化跳转,或对无意义参数组合返回 301。确实需要保留的参数页面,用 canonical 指向不带参数的主版本。不建议一律用 robots.txt 屏蔽,因为被屏蔽的 URL 仍可能被其他页面链接出去,蜘蛛只能看到存在却抓不到,无法判断内容关系。

怎么检查是否收敛到位

  1. 从服务器日志里按 URL 聚合,看看同一路径是否出现多种写法。
  2. 抽样几个栏目,手动对比站内链接、canonical、Sitemap 三处地址是否一致。
  3. 观察跳转链长度,确认没有多层重定向。
  4. 新增栏目或改版时,把 URL 规范约定写进开发检查项。

小结

URL 规范化的目标不是消灭所有参数,而是让蜘蛛在有限时间里把精力放在会变化的正文页上。先统一内链,再用 301 收敛历史地址,最后用 canonical 与 Sitemap 做补充,通常能覆盖大部分重复抓取问题。执行后不必急着看结果,抓取行为的调整往往需要一段时间才会反映在日志里。