为什么跳转方式会影响蜘蛛的判断
入口页本身通常不承载最终内容,它的作用是把蜘蛛带到目标页。从入口页到目标页之间,可能是直接返回内容,也可能经过 301、302、meta refresh 或者 JS 跳转。蜘蛛在处理这些跳转时付出的成本、收到的信号并不一样:有的会把抓取额度和信号一并带过去,有的只是临时看一眼,还有的需要额外渲染才能发现下一跳。选错方式,常见的结果不是完全抓不到,而是抓了一半就停。
几种跳转方式的抓取表现
301 永久重定向
服务器端返回 301,语义上表示资源永久搬家。蜘蛛一般会较快更新索引里的地址,并把原来的信号转到新地址,适合入口域名已经确定不再使用、整体迁移的场景。但如果入口页还要反复更换目标,就不适合用 301,因为蜘蛛会逐步把旧入口从索引中剔除,入口本身的价值会被消耗掉。
302 / 307 临时重定向
临时跳转是最常见的做法:入口页保留索引,蜘蛛每次访问都跟着跳一次。它不承诺关系永久,适合轮换目标页、分批测试的场景。需要注意 307 会保留请求方法,一般用于接口类请求;普通页面跳转用 302 就够,不必为了"看起来更规范"而换用 307。
meta refresh 与 JS 跳转
这两种属于客户端跳转。蜘蛛要先拿到 HTML,再决定要不要继续。meta refresh 的等待时间如果设得太长(比如 5 秒以上),部分抓取会直接放弃;JS 跳转则依赖渲染能力,抓到但没渲染,往往就断在入口页。能用服务端跳转,就优先服务端,客户端的方案只作为补充。
跳转链路的长度
一跳可达最理想:入口页到目标页,中间不再有其它中转。链路每加一层,蜘蛛就要多发一次请求、多消耗一份抓取额度,而且中途任何一个环节响应慢或返回错误,整条链路就断了。
- 尽量控制在 1 到 2 跳以内,避免 A 跳 B、B 跳 C、C 跳 D 这种层层转发;
- 不要出现环形跳转,A 跳 B、B 又跳回 A,会让蜘蛛反复空跑;
- 同一入口页的目标尽量稳定一段时间,频繁改动会让蜘蛛前后抓到的结果互相矛盾。
跨域跳转的处理
入口页与目标页不在同一域名时,跳转本身不是问题,问题在于信号传递会被削弱。跨域 301 通常仍能传递一部分信号,但不如同域直接。若入口与目标分属不同主体、不同服务器,建议先把入口页的响应稳定下来(状态码、响应时间、robots 规则),把抓取通道打通,再考虑信号层面的事。顺序反了,容易出现"目标页没抓到,入口页也被拖累"的情况。
容易踩坑的几种做法
- 对蜘蛛返回 302、对普通用户直接返回内容,这种差异化响应如果规则写得太粗,容易被判定为作弊;
- 用 JS 拼接目标地址,地址还带随机参数,蜘蛛每抓一次得到一个新 URL,形成参数爆炸;
- 入口页跳转到 404、500 或者需要登录的页面,抓取记录里会留下一堆无效状态码;
- 跳转目标频繁更换且每次都返回 301,等于不断告诉蜘蛛"这个地址作废了",入口页会越来越难被抓。
怎么确认跳转是否正常工作
- 用 curl -I 看响应头和状态码,确认返回的是 301 还是 302,Location 指向哪里;
- 关闭 JS 再访问一次入口页,看是否还能到达目标页;
- 在抓取日志里筛出该入口页的记录,观察状态码分布,以及后续是否出现目标页所在服务器的访问;
- 定期抽查一批入口页,确认没有跳转链断裂、超时或指向错误地址。
跳转只是通道,通道稳不稳,决定了蜘蛛愿不愿意继续往里走。比起频繁更换目标,先把状态码和响应时间做稳定,收益通常更直接。
整体建议:能 302 就别 301,能一跳就别两跳,能用服务端就别用 JS。入口页的价值在于被发现,把跳转做得干净、稳定、可预期,比堆更多入口域名更实际。