在蜘蛛池入口页里,把目标 URL 包一层跳转链接很常见,例如先指向 /go?url=xxx,再由服务端返回 301 或 302 跳到目标页面。这样做有时是为了统计点击,有时是为了隐藏真实地址。问题随之而来:搜索蜘蛛在入口页看到的是跳转链接,它会不会继续跟到最终目标 URL?
搜索蜘蛛基本会跟随 3xx 跳转
主流搜索蜘蛛对 301、302、307、308 这类 HTTP 跳转的处理逻辑比较一致:抓取跳转链接时,如果响应是 3xx 且 Location 指向另一个可抓取 URL,通常会继续请求 Location 地址,直到拿到最终 200、404、410 或其他终止状态。也就是说,入口页上的跳转链接本身可以被发现,最终目标 URL 也有机会被跟进。
但“会跟随”不等于“一定发现并抓取”。最终目标是否进入抓取队列,还取决于几个条件:
- 跳转目标是否被 robots.txt 禁止抓取;
- 跳转链是否过长,蜘蛛可能在若干跳后放弃;
- 跳转响应是否超时、返回 5xx 或被 WAF/CDN 拦截;
- 目标 URL 是否已经 404、410 或需要登录;
- 入口页和跳转链接本身的抓取优先级、站点抓取预算。
跳转链接和直接链接,在 URL 发现上有什么差别
从 URL 发现角度看,直接写目标 URL 更确定:蜘蛛在解析入口页 HTML 时就能提取到目标地址,抓取时可以一次到位。跳转链接则多了一步,蜘蛛先抓跳转页,再根据 Location 决定下一步。多数情况下最终目标仍会被发现,但中间多了一次请求,也多了失败点。
另外,蜘蛛通常会把跳转后的最终 URL 当作实际抓取对象。如果最终 URL 是 200 且可访问,它可能被记录为已发现;如果最终 URL 返回错误或跳转回入口页,发现和抓取就可能中断。对于蜘蛛池入口页来说,跳转链越短越稳定,越有利于目标 URL 被发现。
几个容易踩的误区
- 302 不等于“不传递任何东西”:它主要表示临时跳转,蜘蛛一般仍会跟随,但长期使用 302 做固定跳转并不合适。
- 跳转链接加 nofollow:如果入口页上的跳转链接本身带 rel=nofollow,蜘蛛可能不继续跟进,最终目标自然难以被发现。
- 用 JS 或 meta refresh 代替 3xx:这些方式与 HTTP 跳转的处理不同,发现效果不稳定。
- 跳转目标频繁变化:同一跳转 URL 每次返回不同目标,蜘蛛可能难以稳定发现和抓取。
- 只看到跳转请求,就以为目标被抓:日志里出现跳转链接的抓取,不等于最终目标 URL 已被抓取,需要看最终响应。
实操建议
如果入口页必须通过跳转指向目标 URL,可以尽量做到:
- 跳转链保持一跳,避免多级 302 套娃;
- 使用稳定、可公开访问的最终 URL,不要依赖登录态或临时参数;
- 确认最终 URL 没有被 robots.txt 屏蔽,也没有返回 4xx/5xx;
- 跳转链接不要加 nofollow,除非你明确不想让它继续跟进;
- 观察服务器日志中跳转请求和最终目标的抓取记录,判断是否只是“发现”而没有“抓取”。
总结来说,入口页链接先经 301/302 跳转,搜索蜘蛛通常会继续跟进,最终目标 URL 有较大概率被发现。但跳转会增加不确定因素,蜘蛛池运营中如果目标是稳定发现 URL,直接链接通常比跳转链更可控。