搜索抓取

URL 归一化与蜘蛛抓取:大小写、尾斜杠和默认文档带来的重复入口

同一个页面如果存在大小写、尾斜杠、默认文档等多种写法,蜘蛛会把它当成多个 URL 分别抓取,抓取额度被摊薄,链接信号也被拆散。本文说明重复入口从哪来、会带来什么问题,以及用 301、canonical、内链和 Sitemap 统一地址的落地做法。

搜索抓取

URL 归一化与蜘蛛抓取:大小写、尾斜杠和默认文档带来的重复入口

同一个页面,如果站内同时存在 /About、/about、/about/、/about/index.html 这几种写法,在蜘蛛看来就是四个不同的地址。它们会分别进入抓取队列,分别占用抓取额度,也会让日志里的页面数量看起来比实际多出好几倍。URL 归一化要解决的问题,就是让一个页面只对应一个规范地址。

哪些写法容易被当成不同 URL

  • 大小写差异:/About 与 /about。Linux 服务器通常区分大小写,两者可能都能返回 200。
  • 结尾斜杠:/about 与 /about/,不少框架会同时响应。
  • 默认文档:根目录的 / 与 /index.html、子目录的 /about/ 与 /about/index.html。
  • 协议与主机名:http 与 https、带 www 与不带 www 混用,并且都在正常返回。
  • URL 参数:跟踪参数、排序参数、会话 ID 附加在同一个路径后面。
  • 编码差异:中文或特殊字符直接出现在路径里,与百分号编码形式并存。

以上情况单独出现时影响有限,几种叠加在一起,重复入口的数量会成倍增加。

重复入口带来的实际问题

第一是抓取额度被摊薄。同一份内容被反复抓取,能分给新页面的次数就少了,页面量大、更新频繁的站点感受会更明显。第二是信号分散,内链和外部链接如果分别指向不同写法,页面收到的链接信号就被拆开。第三是维护成本,Sitemap、canonical、导航链接若各写各的,蜘蛛需要多次验证才能确认哪个是主版本,这个过程本身也消耗请求。

归一化的目标是让蜘蛛少走重复的路,而不是让站点收录的地址看起来更多。

把地址收敛到一种写法

  1. 先定规范形式:明确用 https 还是 http、带不带 www、路径是否带尾斜杠,然后写进团队规范。
  2. 服务器层做 301:把非规范写法永久跳转到规范地址,例如 /about/ 跳到 /about。优先用 301,不要用 302 或 JS 跳转代替。
  3. 内链统一:导航、面包屑、正文链接、列表页都使用规范地址,蜘蛛顺着链接走时就不会再次遇到变体。
  4. Sitemap 只放规范 URL,并让 canonical 指向同一个地址,三者保持一致。
  5. 参数类入口单独处理:排序、筛选、跟踪参数能用 robots.txt 或站长平台参数设置处理的,就不要让它们进入抓取队列。

几个容易踩的边界

301 要指向真实存在的页面,不要出现 A 跳 B、B 又跳回 A 的循环,也不要用 301 指向一个返回 404 的地址,否则蜘蛛会认为跳转链失效。服务器区分大小写时,不要为了看起来统一,把两个内容不同的路径强行合并,先确认它们确实是同一份内容。尾斜杠规则要在服务器配置阶段解决,页面里的 JS 跳转对蜘蛛来说往往不算可靠信号。

怎么验证是否已经收敛

从访问日志里按路径去掉参数后统计访问次数,同一份内容如果仍有多种写法被反复抓取,说明还有入口没处理干净。用站长工具查看规范地址的选择结果,再用爬虫工具跑一遍站点,重点看重定向链的长度和 404 的来源,通常能比较快地定位到遗漏的写法。