蜘蛛拿到一个 URL 之后,第一步不是解析内容,而是发起请求。如果服务器返回的是 301 或 302,它必须再发起一次请求,才能拿到真正的页面。这个再发起一次的动作,就是重定向链对抓取最直接的影响。
一次跳转:蜘蛛做了什么
服务器返回 3xx 状态码,同时给出 Location 头,蜘蛛就把 Location 里的地址当作新的目标再抓一次。中间这些跳转页面本身没有可索引的内容,它们只是路上的路标。
问题是路标会占用抓取次数。抓取量是有限的,一个 URL 跳三次才到终点,等于蜘蛛花了四次请求才完成一次内容获取。如果全站大量链接都走多跳,抓取预算会被消耗在跳转上。
跳几次算多
没有硬性标准,但可以这样判断:
- 一跳,比如 HTTP 到 HTTPS、补尾斜杠、去掉 index.php,属于常见规范化,成本可以接受;
- 两跳开始值得排查,通常意味着规则叠了两层,例如先 302 到带 www,再 301 到 HTTPS;
- 三跳以上基本是配置问题,既浪费抓取,也增加超时和中断的概率。
每一跳都要重新做 DNS、连接和响应,链越长,中间任何一环不稳定都会让整条路径失败。
同域规范化与跨域迁移不一样
同域内的跳转通常是在做统一:统一协议、统一 www、统一大小写、统一尾斜杠。这类跳转只要最终地址唯一且稳定,蜘蛛第二次来就会直接抓终点,因为内链和 Sitemap 会慢慢收敛到规范地址。
跨域跳转,比如换域名、换子域,则要小心。整站迁移时,旧域名上的每条 URL 都应指向新域名上的对应页,保持一对一的 301,而不是全部 301 到首页。同时要把内链和 Sitemap 更新到新域名,否则蜘蛛会一直从旧地址入口进入,再被跳一次。
Sitemap 和内链该写哪个地址
规则很简单:写最终地址,不写跳转地址。
- Sitemap 里的 loc 用返回 200 的规范 URL;
- 站内链接直接指向规范 URL,不要链到一个再跳一次;
- canonical 标签同样指向规范 URL,并与 Sitemap、内链保持一致。
三处不一致时,蜘蛛会收到矛盾的信号,只能自己判断,结果常常是既抓了跳转地址,又把最终地址当成重复内容。
几种容易踩的坑
把 302 当成固定写法
302 表示临时跳转,蜘蛛通常会保留旧地址继续尝试,不会立刻把抓取转向新地址。如果实际上是永久变更,应使用 301。
跳转链里带参数
从带跟踪参数的地址跳到不带参数的地址,看起来是清理,实际上会让每条带参数的链接都形成一条独立跳转路径。更稳的做法是让参数地址本身直接返回规范内容,或在 robots 规则里明确处理。
循环跳转
A 跳 B、B 又跳回 A,蜘蛛会停止并把它当作错误。这类问题一般出现在服务器配置和代码规则互相冲突时,需要在日志里看状态码和 Location 才能发现。
跳转目标返回 404
301 指向一个已经不存在的页面,等于把旧地址的入口也丢掉了。改版整理 URL 时,这一步最容易漏。
怎么排查
- 从抓取日志里筛出 3xx 状态码的请求,统计哪些地址经常出现;
- 对出现频率高的地址手动跟一次跳转,记录跳了几跳、终点返回什么状态;
- 把终点与 Sitemap、内链、canonical 里写的地址对照,找出不一致的地方;
- 能合并的规则就合并,把两跳压成一跳;
- 更新内链和 Sitemap,让入口直接落在终点上。
重定向不是错误,它是把旧地址接到新地址的正常手段。问题在于链条太长、方向不唯一,让蜘蛛把抓取花在了路上。
整理完之后不需要额外的操作,蜘蛛会按抓到的信号逐步调整。观察一段时间日志中 3xx 请求的比例是否下降,就能判断抓取路径有没有变顺。