搜索抓取

同一个页面多个地址:URL 形态不统一,蜘蛛会重复抓几遍

同一份内容挂在 http、https、带 www、带尾斜杠等多个地址下,蜘蛛会把它们当成不同页面分别排队抓取。本文梳理常见的重复地址来源,以及用 301、canonical、内链和 Sitemap 做归一化的具体做法,并说明服务器端需要配合的响应细节。

搜索抓取

同一个页面多个地址:URL 形态不统一,蜘蛛会重复抓几遍

同一份内容,为什么会有好几个地址

做站点运营时,常见的现象是:一份内容其实只有一个页面,但在蜘蛛眼里却像有好几个。原因通常不在内容重复,而在地址形态不统一。下面这些写法往往都能打开同一个页面,对浏览器来说差别不大,对抓取系统来说却是不同的 URL。

  • 协议不同:http:// 与 https:// 各有一套地址
  • 主机名不同:带 www 与不带 www
  • 结尾斜杠不同:/about 与 /about/
  • 大小写不同:/List 与 /list,在部分服务器上等价
  • 默认文件名:/ 与 /index.html
  • 参数残留:会话 ID、来源跟踪参数、排序与筛选参数

单看每一条都不严重,叠在一起就麻烦了。同一篇文章可能被展开成四五个地址,分别进入抓取队列。

蜘蛛会怎样处理这些地址

抓取队列的去重是按 URL 字符串做的,不是按页面内容做的。只要地址不同,就会被当作不同资源排队。抓取额度是有限的,用在重复地址上的每一次请求,都是从真正需要抓取的页面上挪走的。

影响还不止抓取。当多个地址都返回 200 且内容相同,搜索引擎在整理时需要在它们之间做选择;如果内链指向不统一,选择的结果可能来回变动,页面在结果里呈现的地址也会不稳定。

把同一份内容收敛到一个地址上,是抓取效率里成本最低的一步,但它需要全站一起做,只改一处往往没有效果。

归一化要做的几件事

1. 先定一个规范形态

确定协议、主机名、路径写法是否带尾斜杠、默认文件名规则,然后把它固定下来。规范形态一旦确定,后面所有动作都围绕它做。

2. 用 301 把旧形态收拢

非规范形态统一做 301 跳转到规范地址,并且尽量一步到位,不要 A 跳 B、B 再跳 C。重定向链越长,蜘蛛到达目标页的成本越高,中途出问题的概率也越大。

3. 内链只写规范地址

站内导航、面包屑、正文链接、分页链接,尽量统一写成规范形式。相对路径可以减少协议和主机名写错的可能,但尾斜杠这类差异仍然要人为对齐。

4. 页面里标注 canonical

在页面头部用 canonical 指向规范地址。它不能替代 301,但能覆盖一些无法做跳转的场景,例如带参数的页面。

5. Sitemap 只放规范 URL

Sitemap 里的地址应当与页面最终返回 200 的地址完全一致。如果 Sitemap 写的是带 www 的地址,实际响应却是跳转,那这份清单的作用就打折了。

6. 处理参数类地址

会话 ID 不要写进 URL;跟踪参数尽量在服务端去掉或做跳转;筛选、排序、站内搜索这类参数组合要单独设规则,避免生成大量近似地址。

服务器端要配合的地方

归一化做得好不好,最终体现在响应上。几个容易被忽略的点:

  • 跳转目标要稳定,不要出现今天 301 到 A、明天 301 到 B 的情况
  • HTTPS 证书覆盖到位,避免规范地址本身因为证书问题抓不到
  • 规范地址的响应时间维持在合理区间,跳转页和落地页都算在内
  • 不要在非规范地址上返回完整的 200 页面,这会抵消前面的工作

怎么检查有没有收敛

比较直接的办法是翻服务器日志,把同一路径的不同形态放在一起看:

  1. 找出被反复抓取、内容相同的几组地址
  2. 看非规范形态返回的是 301 还是 200
  3. 观察规范地址与非规范地址的抓取比例是否在下降
  4. 抽查页面源码里的 canonical 是否与实际规范地址一致
  5. 核对 Sitemap 中的 URL,逐条确认最终响应

这类整理通常不会立刻见效,更多是把长期浪费的抓取额度慢慢收回来。它也不保证页面会被收录,只是让蜘蛛在同样的时间里走到更多真正有用的地址。