搜索抓取

同一内容多个地址:蜘蛛抓取时的去重与规范化选择

同一份内容常常存在多个可访问地址,比如 http 与 https、带与不带 www、尾斜杠差异、跟踪参数等。蜘蛛会先做 URL 层面的精确去重,再做内容层面的近似判断,最后才参考 canonical、内链和 Sitemap 给出的提示。本文梳理这些重复地址的来源、在抓取日志中的表现,以及规范化处理的优先顺序与常见误区。

搜索抓取

同一内容多个地址:蜘蛛抓取时的去重与规范化选择

做站点运营时,经常会遇到这样的情况:同一篇文章,通过好几个地址都能打开。对用户来说也许没差别,但对蜘蛛来说,这是多份候选 URL,抓取和判断都要多花一份力气。理解蜘蛛怎么在多个地址之间做选择,能帮我们把抓取资源用在真正需要的地方。

重复地址一般从哪来

多数重复不是刻意制造的,而是站点演进过程中自然留下的:

  • 协议与主机名:http 与 https、带 www 与不带 www,四个组合同时可访问。
  • 路径写法:末尾带斜杠与不带斜杠、大小写混用、中文路径编码方式不同。
  • 参数版本:跟踪参数、排序参数、会话标识,让同一列表页出现几十个变体。
  • 功能页副本:打印版、移动版、AMP 版、预览链接,各自有独立 URL。
  • 编号与别名并存:一篇文章同时有 ID 路径和标题别名路径。

这些地址如果都能返回 200,蜘蛛就需要自己判断它们是同一份内容还是不同内容。

蜘蛛大致会分三层处理

第一层:URL 层面的精确去重

最基础的判断发生在字符串层面。完全相同的 URL 只会被抓一次,抓过的地址会进入队列记录。这一层不看内容,只看地址本身,所以任何字符差异都会被视为新地址。

第二层:内容层面的近似判断

当多个地址被抓回来后,蜘蛛会比较正文主体、标题、结构等信息,判断它们是否高度相似。如果相似度高,通常会选一个作为代表版本,其余的在抓取调度上降权。这个过程对站点是黑盒,我们能做的只是把信号给清楚。

第三层:站点给出的规范提示

canonical 标签、内链指向、Sitemap 中列出的地址、301 跳转,都是站点主动表达偏好的方式。其中 301 的信号最强,canonical 相对温和。

canonical 是提示而不是命令。它需要和其他信号一致才有说服力,如果内链指向 A、canonical 指向 B、Sitemap 又列出 C,等于给了三个方向。

从抓取日志能看出什么

重复地址的问题往往先体现在日志里,而不是在页面表现上:

  • 同一内容的多个地址反复被抓,且频次接近,说明蜘蛛还没确定哪个是主版本。
  • 参数版本抓得很勤,干净地址反而少见,说明内链或历史入口把蜘蛛引偏了。
  • 规范版本长期不更新抓取,非规范版本持续被抓,通常是两边的内链和跳转关系混乱。

把这些地址按路径归类统计,比逐条看日志更容易发现问题。

处理的优先顺序

遇到重复地址,建议按下面的顺序处理,不要一上来就用禁止抓取:

  1. 能 301 就 301。协议、主机名、尾斜杠这类写法差异,用一次跳转永久固定下来,成本最低。
  2. 统一内链与 Sitemap。全站链接只指向规范地址,Sitemap 只列规范版本,避免自己制造分叉。
  3. 用 canonical 兜底。对于无法跳转的场景,如参数页、打印页,用 canonical 指向主版本。
  4. 谨慎使用 robots 屏蔽。屏蔽能阻止抓取,但也意味着页面上的 canonical 提示可能读不到,两者叠加容易产生矛盾信号。
  5. 参数做集中处理。对站内搜索、排序、筛选参数,优先用规则收敛入口,而不是逐个屏蔽。

几个容易踩的坑

  • canonical 指向一个已经被 robots 屏蔽的地址,等于把信号丢进了黑洞。
  • 两个地址互相 canonical,蜘蛛无法从中得到明确结论。
  • 把分页页面的 canonical 全部指向第一页,导致后续页面的新内容失去被发现的机会。
  • 移动版与桌面版各自 canonical 到自己,形成两套并行体系。
  • 只在首页做了跳转,深层链接仍然保留旧写法。

日常检查清单

可以把下面几件事纳入常规巡检:核对协议与主机名的跳转是否一次到位;抽查内链是否统一指向规范地址;对照 Sitemap 与实际可访问地址是否一致;统计日志中同一内容对应的地址数量是否有上升趋势。规范化不是一次性的清理工作,新栏目、新功能上线时都可能带出新的重复入口。把规则固定下来,比事后逐个补救更省力。