搜索抓取

同一个页面被蜘蛛当成多个 URL:大小写、斜杠与 www 的重复抓取

同一份内容如果可以用多种 URL 写法访问,蜘蛛会把它当成多个地址分别抓取,抓取配额和日志都被分摊。本文整理大小写、尾斜杠、默认文档、www 与跟踪参数等常见重复来源,以及如何用服务器 301、内链统一和日志排查把抓取收敛到规范地址上。

搜索抓取

同一个页面被蜘蛛当成多个 URL:大小写、斜杠与 www 的重复抓取

蜘蛛判断一个地址抓过没有,比对的是完整的 URL 字符串,而不是页面内容。同一份内容只要能用两种以上的写法访问到,在它眼里就是两个甚至多个待抓取地址,会被分别排进队列。结果是抓取量被摊薄,日志里多出一批看起来陌生的路径,排查收录问题时很容易被带偏。

同页多址最常见的几个来源

  • 大小写差异:/About 与 /about、/images/Logo.png 与 /images/logo.png。Linux 环境路径大小写敏感,服务器可能对两种写法都返回 200。
  • 尾斜杠:/news 与 /news/ 在部分服务器配置下都能正常打开,而不是互相跳转。
  • 默认文档:目录根与 /index.html、/index.php 同时可访问。
  • 主机名与协议:带 www 与不带 www、http 与 https,如果没有统一跳转,就是四套地址。
  • 端口与路径冗余:example.com:80 与 example.com、/a//b 与 /a/b。
  • 跟踪参数与参数顺序:?utm_source=…、?ref=…,以及 ?a=1&b=2 与 ?b=2&a=1,内容往往完全一样。
  • 编码写法:中文路径的百分号编码大小写不同,空格被写成 %20 或 +。

代价不只是多抓几次

重复地址会同时占用抓取额度、服务器连接和日志空间。更麻烦的是信号分散:内链和外部链接如果指向不同写法,蜘蛛拿到的关于哪个是主版本的信息就是矛盾的。同一内容以多个 URL 出现,页面之间也容易互相争夺相似的主题判断。

怎么把重复地址找出来

  1. 从服务器日志里按路径聚合,暂时去掉查询参数再统计请求量,看有没有只差大小写、斜杠或默认文档的成对路径。
  2. 检查内链和 Sitemap 用的是哪种写法,两边是否一致。
  3. 手动用不同写法各请求一次,看服务器返回 200 还是 301。
  4. 检查页面上的规范标签指向的地址,是否和实际访问地址完全一致。

统一到一种写法

最直接的做法是在服务器层做 301:把带 www 的跳到不带 www(或反过来),把 http 跳到 https,把 /index.html 跳到目录根,把缺尾斜杠和多尾斜杠统一成一种。301 是明确指令,蜘蛛会沿着它走到规范地址,抓取也会逐步集中过去。

规范标签值得用,但要清楚它只是提示,并不阻止抓取。变体地址如果仍然返回 200,蜘蛛可能还是会去请求一遍。真正减少重复抓取的是两件事一起做:服务器统一跳转,加上站内链接写法一致。

几个容易踩的坑

  • 用 JS 跳转或 meta refresh 代替 301:蜘蛛需要额外处理或等待,指向关系也不如 301 明确。
  • 用 robots.txt 屏蔽规范变体:屏蔽之后蜘蛛在变体页上看不到规范标签,判断反而更模糊。
  • 只改 Sitemap 不改内链:清单里的写法对了,页面上几百条链接还在用旧写法,收敛效果有限。
  • 参数变体一刀切屏蔽:如果某些参数确实会改变页面内容,屏蔽可能误伤真实页面,先确认参数是否影响呈现。
重复抓取通常不是蜘蛛抓错了,而是服务器允许同一份内容有多个入口。把入口收敛到一个,抓取量才有机会用在真正的新页面上。