站内出現重定向很常见,但重定向鏈的長度,往往决定了蜘蛛拿到一個頁面内容要花多少次請求。一次跳轉能到最终地址,和跳三次、四次才到,對抓取来说是完全不同的两件事。
蜘蛛遇到重定向时的動作顺序
蜘蛛請求某個 URL 後,如果返回 301 或 302,它不會立刻拿到正文,而是讀取 Location 响應头里的新地址,再對這個新地址發起一次請求。只有最终地址返回 200 並带回 HTML,才算真正完成一次内容抓取。
- 請求舊 URL,收到 3xx 與 Location;
- 對新地址再次發起請求;
- 如果新地址仍然是 3xx,重复第二步;
- 直到拿到 200,才開始解析正文和其中的連結。
也就是说,一次跳轉等于两次請求,两次跳轉等于三次請求。鏈條越長,單位時間内能抓的頁面越少,這在抓取预算有限的站点上体現得比較明顯。
鏈條通常是怎样變長的
多數跳轉鏈不是有意设計,而是一次次改動叠加出来的。常见的叠法包括:
- http 跳 https,https 又跳带 www,两跳才到最终頁;
- 早期改版留下的舊路径,没有直接指向最终地址,而是先跳到上一版路径;
- 结尾斜杠、大小寫、參數寫法不统一,服務器先跳一次規范形式,應用层又跳一次;
- CDN 或负载层配置了額外的規范化跳轉,與源站規則叠加;
- 多個域名合並时,中間域名仍然在线並參與跳轉。
這些規則單獨看都合理,叠在一起就形成了三跳以上的鏈條。
多跳带来的三個實际成本
- 請求次數成倍增加:同样的抓取額度,能到達的頁面更少。
- 發現被推迟:新 URL 只出現在鏈條末端,中間任何一环返回 404、500 或超时,蜘蛛就停在原地,後面的地址根本不會被發現。
- 信号分散:中間地址也會被记錄為一次訪問,日誌里 3xx 占比偏高时,很难判断蜘蛛到底抓到了什么。
如果鏈條中出現环,比如 A 跳 B、B 又跳回 A,蜘蛛通常會直接放弃,這個 URL 相当于不存在。
怎么排查站点的跳轉鏈
不需要复杂工具,抽一批典型 URL 逐個看响應头就够用:
- 用 curl 的 -I 參數看單次响應,再用 -L 跟随跳轉,看最後落在哪個地址、经過几跳;
- 首頁、栏目頁、詳情頁、舊連結各抽几個,覆盖不同模板;
- 對照服務器配置、CDN 規則和應用层路由,找出重复的規范化規則;
- 看抓取日誌里 3xx 狀態的占比,占比持續偏高,說明鏈條還没收敛干净。
收敛顺序:先定唯一地址,再改入口
顺序反了容易白做一遍。建议先把每個頁面的最终地址确定下来,把分散的跳轉規則合並成一步直達,然後再更新指向:
- 内鏈直接寫最终地址,不再经過中間层;
- Sitemap 只提交最终地址,不提交會跳轉的舊地址;
- canonical 指向最终地址,與實际返回 200 的地址一致;
- 舊的跳轉規則保留一段時間,確認日誌中舊地址請求下降後再清理。
和外部入口配合时的注意点
無论外部入口带来多少訪問,只要落地的是會跳轉的舊地址,蜘蛛還是要多跑几趟。跳轉只能作為過渡手段,不适合当作 URL 發現的主要方式。更稳定的發現路径,仍然是内鏈直達加上 Sitemap 提交,同时保持服務器响應正常,把不必要的那几跳省掉。