先想清楚:跳转是为了发现,还是为了记录
蜘蛛池入口页的跳转,通常服务两个目的:一是把蜘蛛从入口页引到目标 URL,让目标页有机会被发现;二是让入口页本身留下被抓取的记录,维持蜘蛛的回访习惯。这两个目的并不完全一致,选择的跳转方式也不同。
如果入口页只是“跳板”,蜘蛛到达后立刻离开,目标 URL 的发现效率取决于跳转是否被正确跟随;如果入口页还要承担记录和回访功能,就不宜让蜘蛛彻底忘掉入口页。先确定目的,再选跳转类型,比事后补救更省事。
301:适合稳定映射,别用来频繁换目标
301 表示永久跳转。蜘蛛在多次抓取后,通常会更新自己记录的地址,后续可能不再回访入口页,而是直接访问跳转后的目标。因此,301 适合入口页与目标 URL 长期一对一、不打算频繁更换的场景。
- 适合:入口页和目标页绑定稳定,希望蜘蛛把注意力集中到目标页。
- 不适合:今天跳 A、明天跳 B 的轮换策略,因为蜘蛛更新记录后,入口页的回访可能减少,目标更换后不一定能及时重新发现。
- 注意:如果目标页之后又换了,旧 301 可能让蜘蛛继续访问旧地址,需要尽快修正。
302 与 307:临时跳转,保留入口页的回访
302 表示临时跳转,蜘蛛一般会保留入口页的抓取记录,继续回访入口页并重新跟随跳转。307 与 302 类似,但更强调保持原有请求方法。对于需要按批次、按时间段切换目标的蜘蛛池,302/307 通常比 301 更灵活。
但临时跳转也不是随便用。如果入口页今天跳 A、明天跳 B,而每次跳转都返回 302,蜘蛛会反复抓入口页,这对入口页的抓取频次是一种消耗。更稳妥的做法是把目标数量控制在一个小范围,并观察日志里目标 URL 是否被持续跟进。
302 链不宜过长。A 跳 B、B 跳 C、C 跳 D 的连环跳转,会让蜘蛛在中间环节消耗抓取次数,最终目标反而可能被忽略。
JS 跳转与 meta refresh:能识别,但别当作唯一手段
JS 跳转依赖爬虫执行页面脚本的能力。不同蜘蛛对 JS 的执行程度不一样,有的会执行,有的只看 HTML 源码。如果入口页只用 JS 跳转,部分蜘蛛可能停在入口页,目标 URL 不会被发现。因此 JS 跳转更适合作为补充,而不是主力方式。
meta refresh 是 HTML 层面的跳转,多数蜘蛛能够识别,但需要关注延迟参数。常见的 content="0;url=..." 表示立即跳转,识别率相对好一些;如果把延迟设成 5 秒、10 秒,蜘蛛可能直接忽略,或者把页面判断为低质入口。meta refresh 可以用于简单场景,但同样不建议作为唯一跳转方式。
直接返回 200 并放链接:最稳,但少了跳转统计
入口页直接返回 200,并在正文里放置指向目标 URL 的链接,是结构最简单的方式。蜘蛛抓取入口页时,会顺着链接发现目标,不需要依赖跳转跟随。这种方式出错概率低,也方便做内链层级控制。
代价是跳转统计不如服务端跳转直观:你看不到一次明确的跳转动作,只能通过日志里目标 URL 的抓取记录来判断。如果你更看重稳定,而不是跳转次数报表,这种方式往往更省心。
跳转链长度:尽量控制在一跳
无论用哪种跳转,链越长,中间环节失败的概率越高。蜘蛛在每一跳都要重新发起请求,如果其中某一跳返回超时、404 或 5xx,后面的目标就不会被访问到。建议把跳转链控制在一跳,入口页直接指向最终目标。
- 能直达目标,就不要经过中间跳转页。
- 如果必须多跳,确保每一跳都返回正确的状态码。
- 定期检查跳转链中是否有失效环节。
怎么观察跳转是否生效
不要只看配置,要看实际抓取行为。可以通过服务器日志、模拟抓取工具和状态码记录来交叉验证。
- 入口页日志:确认蜘蛛是否访问了入口页,返回码是否为 200 或 3xx。
- 目标 URL 日志:确认蜘蛛是否在入口页抓取后不久访问了目标 URL。
- 状态码记录:检查跳转链每一跳的返回码,避免出现 302 连环或 404。
- 回访频次:观察入口页是否还在被持续抓取,判断蜘蛛是否已经“记住”了跳转目标。
常见误区与使用建议
- 用 301 频繁更换目标,导致蜘蛛不再回访入口页。
- 认为 JS 跳转一定会被所有蜘蛛执行。
- 把 meta refresh 的延迟设得太长,蜘蛛直接忽略。
- 跳转链层层嵌套,目标 URL 反而没有被发现。
- 只做跳转,不在入口页保留任何可抓取内容或链接。
比较稳妥的组合是:需要长期稳定映射时用 301;需要按批次切换目标时用 302 或 307;JS 跳转与 meta refresh 作为辅助,不作为唯一通道;同时让入口页返回正确状态码,并在日志中确认目标 URL 确实被跟进。跳转方式没有绝对的好坏,关键是和目标策略匹配,能观察、能回滚,出现问题时不至于无从排查。