先说结论
大多数情况下,搜索蜘蛛会跟随 HTTP 跳转。也就是说,入口页里放一个 301 或 302 地址,蜘蛛顺着 Location 头继续请求,最终落到目标 URL 上,这条 URL 就有机会进入待抓取队列。但它不是无条件跟随:跳转链太长、中途报错、最终地址被 robots.txt 拦住,都会让发现中断。
蜘蛛是怎么处理跳转的
常见的跳转方式有三种:HTTP 3xx、meta refresh、JavaScript 跳转。对入口页来说,HTTP 3xx 是最容易被蜘蛛稳定跟进的,因为它不依赖页面渲染。
- 301 / 308:永久跳转,蜘蛛会把它当作地址变更信号,跟随的意愿最强。
- 302 / 307:临时跳转,蜘蛛同样会跟,但会更谨慎,因为源头随时可能变。
- 跳转目标必须放在 Location 响应头里,并且是一个完整可访问的地址,写成相对路径或拼错都会让蜘蛛停在原地。
换句话说,短链本身不是问题,问题在于短链背后是不是一条干净、可直达的路径。
哪几种情况会跟丢
- 跳转链太长。经过三五跳之后,不同蜘蛛的耐心不一样,链路越长,被截断的概率越高。建议控制在一次跳转以内。
- 中间某一跳返回 4xx 或 5xx。只要链路中的任意一环挂了,后面的目标 URL 就不会被发现。
- 最终地址被 robots.txt 屏蔽。蜘蛛跟到了,但抓取请求会被规则拦下,等于白跟。
- 短链服务做了 UA 判断或限流。有些短链会对非浏览器 UA 返回验证页、广告页,甚至直接 403,蜘蛛自然也就跟不过去。
- 短链服务插入中转页。部分服务为了统计会在中间插一个 HTML 页面,这个页面如果用了 JS 跳转,跟进成功率就会下降。
能直连就直连。跳转每多一层,就多一个可能失败的点,而失败的那一环往往不会给你任何提示。
跳转对“发现”和“收录”是两件事
顺着跳转找到最终 URL,解决的是发现问题。蜘蛛把这个地址放进队列,任务就算完成了。至于它会不会被抓取、抓取后会不会被收录,取决于目标 URL 自己的状态:能不能正常返回、内容是否有价值、是否存在重复版本、站内有没有其他入口指向它。
另外要注意,如果目标 URL 长期只能通过 302 到达,蜘蛛在判断规范地址时可能会摇摆。这种情况下,最好让入口页直接指向最终地址,而不是让它站在跳转链的末端。
入口页链接可以这样写
- 优先在 HTML 里直接写出最终 URL 的 <a href>,让蜘蛛一步到位。
- 确实需要跳转时,用 301,一次跳到最终地址,不要层层转接。
- Location 用绝对地址,确认返回码、是否被 robots.txt 拦截、服务器是否稳定。
- 避免让公共短链服务夹在中间,尤其是对非浏览器 UA 不友好的那种。
- 入口页自身保持 200 且可正常访问,蜘蛛才有机会读到这条跳转链接。
自查清单
- 用命令行或抓取工具看一遍完整跳转链,确认没有多余中转。
- 换一个搜索蜘蛛 UA 再请求一次短链,看返回是否还是跳转。
- 确认最终 URL 的 robots.txt 允许抓取。
- 在入口页保留至少一条直达最终 URL 的普通链接。
- 定期复查短链是否失效、是否被服务方回收。
小结
搜索蜘蛛愿意跟随跳转,但只愿意跟一条清晰、稳定、可访问的路径。对入口页来说,最省事的做法永远是直接写最终 URL;如果非要用短链或跳转,就把它压缩成一次干净的 301,并且定期检查它在蜘蛛 UA 下的表现。这样至少不会因为中间环节出问题,白白丢掉一次被发现的机会。