在蜘蛛池入口頁里放一條指向目标 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。把鏈路缩短、把返回碼修對,比在入口頁堆更多連結更實际。