在蜘蛛池入口页里放一条指向目标 URL 的链接,通常不会直接命中目标站,中间可能夹着 https 跳转、www 跳转、短链或一个中转页。跳转本身不是问题,问题是跳转链太长时,搜索蜘蛛会在某一跳停下,后面的目标 URL 就一直没有被请求过。
跳转和链接是两条不同的发现路径
搜索蜘蛛拿到入口页 HTML 后,对 a href 的处理是「记下这个 URL,之后单独去抓」。而 301/302 是抓取当前 URL 时服务器直接返回的响应,蜘蛛会立刻跟着 Location 头走下一跳。前者是排队,后者是当场跳。
这两种机制在跳转链里会混在一起:入口页的链接指向一个中转 URL,中转 URL 返回 302 到最终目标。蜘蛛先排队抓中转 URL,抓到 302 后再跳到目标。如果中转 URL 本身还没被抓过,这一跳就卡在抓取队列里,而不是卡在跳转逻辑里。
不同跳转方式,容忍度不一样
- 301 / 308 永久跳转:蜘蛛会跟,并且会逐步把旧 URL 换成新 URL。跳转链里有两三个 301 串联,通常还能跟完,但每多一跳,中途被放弃的概率就上升。
- 302 / 307 临时跳转:同样会跟,但蜘蛛会反复回来确认旧 URL 是否恢复,抓取请求量比 301 更浪费。
- meta refresh:属于 HTML 层面的跳转,蜘蛛能识别,但处理优先级低于 HTTP 跳转,延迟通常更长。
- JavaScript 跳转:依赖渲染。如果入口页只是把 location.href 写在脚本里,蜘蛛不一定执行到位,目标 URL 很可能不会被发现。
实践里比较稳妥的认知是:跳转链控制在 3 跳以内。超过 5 跳的链条,能不能走完就变成概率问题,而且每一跳都在消耗抓取配额。
跳转过程中,URL 发现会丢吗
会,常见的丢失点有三个:
- 中转 URL 自己返回了 404 或 410,链就断在这一跳,后面的目标 URL 蜘蛛根本看不到。
- 中转 URL 加了 noindex,或者被 robots.txt 屏蔽,蜘蛛可能不再往下跟。
- 跳转指向带会话参数的地址,不同蜘蛛请求拿到不同 Location,最终落到哪个 URL 不确定。
如果入口页、中转页、目标 URL 这条链里,你只盯着入口页的抓取日志,很容易误判成「蜘蛛来了却没抓目标」。
怎么确认蜘蛛到底跟到了第几跳
- 用命令行把跳转链完整打出来:curl -IL 入口页地址,看 Location 一层层指向哪里,有没有成环。
- 在目标站的访问日志里搜索蜘蛛 UA,看它请求的完整路径和参数,判断是从哪一跳过来的。
- 把中转页日志和目标页日志按时间对齐,看两次请求之间隔了多久、是否成对出现。
- 如果中转页日志里有蜘蛛、目标页日志里没有,基本可以确定链条在中间某处断了。
减少无谓跳转的几个做法
- 入口页链接尽量直接写成目标 URL,不要让 http 跳 https、裸域跳 www 这类跳转夹在中间。
- 必须中转时,让中转页返回 301 而不是 302,减少蜘蛛反复回访旧地址。
- 别在中转页上叠加 meta refresh 和 JS 跳转,一种就够。
- 跳转链里不要插入需要登录或需要 Cookie 的中间页,蜘蛛拿不到会话就会停。
- 定期抽查中转 URL 的返回码,301 变成 404 是最常见的「链条悄悄断掉」。
跳转本身不违规,也不直接决定页面是否被收录——它只影响搜索蜘蛛能不能顺利走到目标 URL。把链路缩短、把返回码修对,比在入口页堆更多链接更实际。