不少站点做入口页时,习惯把链接指向一个中转地址,再靠 301、302 或 JS 跳转送到真正的目标 URL 上,理由通常是统计点击、做分发或者绕开某些限制。随之而来的问题很实际:搜索蜘蛛跟不跟?能跟到哪里?
先说结论
搜索蜘蛛一般会跟进跳转,但存在跳转次数上限和成本。HTTP 3xx 跳转最稳定,meta refresh 次之,JS 跳转最不保证。跳转层级越多,最终目标 URL 被发现的概率越低,被完整抓取的概率也越低。
搜索蜘蛛是怎么处理跳转的
- 遇到 301、302、307、308 时,会读取 Location 响应头,把新地址放进待抓取队列,再发起一次请求。
- 这个过程会重复,直到拿到 200,或者触达跳转次数上限(常见在 5 次上下),或者碰到循环跳转、超时、错误状态。
- HTML 里的 meta refresh 多数情况下也会被解析,但延迟时间设得太长时可能被直接忽略。
- JS 跳转依赖渲染能力,不同引擎、不同渲染策略下表现不一致,不适合当作可靠通道。
多级跳转会带来哪些损耗
- 抓取配额被摊薄。每一次跳转都是一次请求,原本一次能完成的抓取变成三四次。
- 链条越长,断点越多。中间任意一环超时、返回 5xx、被 robots.txt 屏蔽,后面的目标 URL 就发现不了。
- 耗时增加,超时概率上升,尤其是跳转目标本身响应慢的时候。
- 跳转地址也可能被当成独立 URL 处理,产生重复抓取和状态分散。
- 部分引擎对跳转链长度有硬性限制,超出后就不再跟进。
所以「能跟进」和「能稳定跟进」是两件事,中间隔着链条长度和每一环的健康度。
几种跳转形式的表现差异
301 与 302
301 表示永久,信号更明确,蜘蛛更容易把它视作地址变更并更新索引里的地址;302 表示临时,蜘蛛一般会继续保留原地址。对入口页通往目标 URL 这个场景,如果目的只是让蜘蛛发现目标地址,两种都能做到;如果希望目标 URL 直接成为抓取和收录对象,直连链接会更干净。
meta refresh
延迟建议设为 0,并在页面里同时保留一个可点击的普通链接,这样即使引擎不处理 refresh,也能通过链接发现目标。延迟设成 3 秒、5 秒甚至更长,被忽略的概率会明显上升。
JavaScript 跳转
依赖渲染,可以在 noscript 里或页面其他位置补一个静态链接作为兜底,避免整条路走不通。
实操上怎么降低损耗
- 入口页直接写最终目标 URL,需要统计就用参数或服务端日志区分,而不是多加一层跳转。
- 确实要跳转时,控制在一跳,用 301,Location 指向可直接访问并返回 200 的页面。
- 检查最终 URL:robots.txt 是否允许、是否有 noindex、canonical 是否指向自己、是否需要登录或 Cookie 才能打开。
- 避免跳转链、循环跳转,以及跳到 404、5xx 或验证码页面。
- 跳转目标尽量使用稳定、不带临时参数的地址,减少同一内容出现多个 URL 的情况。
怎么确认蜘蛛确实跟到了最终 URL
看服务器日志:先找入口页的请求记录,再找紧接着出现的跳转目标请求记录,观察状态码序列,例如 200 → 301 → 200,或一路 302 直到 200。如果日志里只有入口页的请求,没有后续跳转请求,多半是跳转形式不被支持,或者链条中间某环断掉了。用抓取模拟工具检查时,注意看它最终「呈现的 URL」和 HTTP 状态码,而不是只看入口页的返回。
跳转不是不能用,而是它把一次发现拆成了多次请求,每多一层就多一个可能失败的地方。能直连就别绕路,必须绕就只绕一步。