蜘蛛抓一个 URL,拿到的不一定总是 200。很多时候它先看到的是 301、302 这类跳转响应,然后顺着 Location 再抓一次。单跳看起来没什么代价,但如果一个地址要连跳三四次才能到终点,蜘蛛花在这条链上的请求数就翻了几倍,而且中间任何一环出问题,整条链就断了。
蜘蛛遇到跳转时的基本动作
从抓取的角度看,跳转不是“错误”,而是一次额外的请求。蜘蛛拿到 3xx 响应头之后,会把 Location 指向的地址当作新目标,通常立刻跟进一次,直到拿到终点页面的内容,这一趟才算完成。有几个细节值得记住:
- 永久跳转(301、308):蜘蛛倾向于把终点地址当作规范地址,后续再遇到旧地址,可能直接按新地址处理。
- 临时跳转(302、303、307):蜘蛛一般照走不误,但不会因此认定旧地址失效,索引里的地址可能还留在原处。
- 跳转目标本身又跳:蜘蛛会继续跟,但每一跳都要重新发一次请求。
所以判断一段跳转是否划算,标准很简单:蜘蛛从入口到拿到内容,中间发了几次请求。
多跳重定向链的真实代价
最常见的多跳链条长得并不复杂:http 版本跳 https,https 的非 www 再跳 www,带尾斜杠的版本再跳一次,中间某一环还夹着一次大小写归一化。用户那边几乎感觉不到,浏览器几毫秒就跳完了,但蜘蛛是按请求计数的,一条三跳的链等于三次抓取。
代价体现在三个地方:一是抓取额度被摊薄,同样一次抓取机会,拿到的内容变少了;二是链条上任何一跳返回 404、超时或者形成循环,后面的内容就抓不到;三是日志里会出现一堆 3xx 记录,把真实的抓取情况盖住,排查起来更麻烦。
跳转本身不伤站,伤站的是没人知道自己在跳,也没人知道跳了几次。
几种容易忽略的跳转来源
- 短链与推广链接:站外投放用的短链通常先跳一次,如果落点的地址本身还要跳,链条就更长。
- CDN 或边缘规则:为了统一域名在边缘层写的跳转规则,可能和源站的重定向叠加,拼成两段链条。
- 语言与地区判断:按 IP 或 UA 跳语言版本时,蜘蛛拿到的往往是默认版本,来回跳容易造成不同爬虫看到不同地址。
- JS 跳转与 meta refresh:蜘蛛通常能识别,但多在渲染阶段处理,发现速度比 3xx 慢,也更依赖渲染是否成功。
怎么查、怎么收
自查办法不复杂,看一下响应头就能把链条拉出来:
- 对代表性 URL 执行 curl -I -L,数一数中间出现几次 3xx,确认终点是不是稳定的 200。
- 在服务器日志里按状态码筛 3xx,看哪些地址被反复跳,尤其是被蜘蛛 UA 请求的那些。
- 把 Sitemap 和站内链接统一写成终点地址,别让蜘蛛从跳转入口进来,这是成本最低的一步。
- 合并重复规则:能一跳解决的,不要因为规则分散变成两三跳;确认没有循环跳转,也没有跳到 404 的情况。
- 改版或换域名时,给旧地址留一条清晰的单跳路径,而不是层层转接。
几个常见误区
一是把跳转当成“权重开关”,指望靠一条 301 解决所有历史问题。跳转主要帮蜘蛛把地址对齐,索引和排序是另一套逻辑,不该预设结果。二是觉得 302 无所谓,长期用临时跳转代替永久跳转,索引里的地址可能长期停在旧版本。三是只检查首页,详情页、筛选页、分页里的重定向链往往更长,也更容易被忽略。
把跳转链控制在两跳以内、尽量单跳直达,是站内抓取路径里性价比很高的一项整理工作。整理完再回看日志里的 3xx 数量,通常能直观看到抓取路径变短了。