蜘蛛拿到一个 URL 之后,并不总是直接拿到内容。很多时候它先撞上一次 3xx:从 http 跳到 https,从旧域名跳到新域名,从 /page 跳到 /page/。这些跳转在浏览器里几乎无感,但在抓取这条链路上,每一跳都是一次额外的请求、一次额外的等待。
一跳到底要花掉什么
蜘蛛处理一次重定向,至少要新增一轮完整请求:解析地址、建连、发请求、读响应头。响应头里如果还有新的 Location,它才决定要不要继续跟。也就是说,一条三跳的跳转链,对蜘蛛来说等于访问了三个 URL,而只有一个 URL 有真正的内容。
- 抓取配额:同一批配额被分摊到多跳上,真正需要内容的页面反而排后
- 时间成本:每一跳都要重新建连或复用连接,链路越长,单页耗时越高
- 发现路径:跳转链中间那几跳 URL,往往也会被记进已发现队列
跳转本身不是错误,问题在于跳转是不是必要的、是不是稳定收敛的。如果每次访问都要绕三圈才落到终点,蜘蛛对这个站点的抓取效率判断就会偏保守。
3xx 里哪些是正常的,哪些值得警惕
301 与 308:告诉蜘蛛“以后就走新地址”
这两个是永久跳转,蜘蛛一般会把已发现记录迁移到目标地址,后续再访问通常直接走新 URL。前提是目标地址稳定,不要今天跳 A、明天跳 B。
302 与 307:临时跳转,别拿它当长期方案
临时跳转意味着旧地址仍然存在。如果线上实际是永久的地址变更,却用了 302,蜘蛛可能反复回到旧地址确认,等于把抓取量浪费在确认动作上。307 会保留请求方法,一般出现在表单或接口场景,对页面抓取的直接影响较小,但同样会拉长链路。
链太长的时候,蜘蛛可能中途停下
不同搜索引擎对跳转次数的容忍度不一样,但趋势是明确的:跳得越多,继续跟下去的概率越低。常见情形是链尾内容长期不被抓,日志里只看到前面几跳的访问记录。
- 跳转链超过两三跳时,深层内容被抓到的间隔会明显变长
- 链条中间如果出现 404 或 5xx,整条链就断在这里
- 循环跳转(A→B→A)会让蜘蛛直接放弃这条路径
容易被忽略的几类自动跳转
- 尾斜杠与大小写:/Page 跳到 /page、/page 跳到 /page/,单独看没什么,叠在一起就是两跳
- 移动端跳转:按 UA 判断后跳到 m 域名,若两套地址都对外暴露,就多出一条链
- 登录或地区判断:未登录、非目标地区被跳到首页,蜘蛛看到的就不是原页面内容
- CDN 或负载均衡层的规则跳转:站点代码里看不到,但日志里全是 301
在日志里怎么看跳转链
抓取日志里,3xx 状态码的数量和分布能说明不少问题。建议按状态码分组,把 301 和 302 的请求地址、Location 目标分别列出来,再人工串一下链条。
- 找出所有 3xx 请求,按来源地址去重
- 顺着 Location 收一遍,标记出链条长度超过两跳的路径
- 核对这些路径是否有对应的内链或 Sitemap 记录,能改内链的就直接改成终点地址
- 确认永久变更的用 301,临时跳转保留 302,别混用
一个比较实用的做法是:内链和 Sitemap 里只写终点地址,把跳转留给那些外部已经发出去、改不了的旧链接。这样蜘蛛顺着站点内部走的时候,不需要为跳转额外付费。
跳转是给外部旧地址兜底的,不是站内导航的常规走法。站内每多一跳,都是把有限的抓取机会分给了没有内容的响应。