蜘蛛池里的入口頁大多不是终点,真正的目标是让蜘蛛顺着入口頁走到目标站。這时候就有一個很具体的工程問题:入口頁用什么方式把蜘蛛“送”過去?301、302、meta 刷新、JavaScript 跳轉,看起来都是跳轉,但蜘蛛處理它們的方式並不一样,選错會让目标頁白白丢掉一次被發現的机會。
先分清两類跳轉
從實現层面看,跳轉可以分成服務端和客戶端两大類。服務端跳轉在 HTTP 响應头里就完成了,蜘蛛拿到响應头就知道该去哪;客戶端跳轉要先下载並执行頁面里的代碼,蜘蛛才知道下一步。這個差別直接决定了抓取鏈路的長度和不确定性。
服務端跳轉:301、302、307
- 301 永久跳轉:语义是“這個地址以後一直指向新地址”。蜘蛛通常會记住新地址,並在後續抓取中直接訪問新地址,适合入口頁彻底弃用、把抓取都交给目标頁的场景。
- 302/307 临时跳轉:语义是“暂时指過去”。蜘蛛一般會跟過去看一眼,但不會把原地址替換掉,後續可能還會反复回到原地址確認,适合活動頁或临时導流。
- 跳轉鏈條:A→B→C 這種多級跳轉,每多一层就多一次請求,蜘蛛在半路放弃的概率會上升。能一步到位就別绕。
客戶端跳轉:meta refresh 與 JavaScript
- meta refresh:寫在 HTML 的 head 里,設定為 0 秒即跳。多數主流蜘蛛能识別並跟随,但它属于 HTML 层,仍然需要先完整拿到頁面。
- JavaScript 跳轉:通過 location.href 等方式执行。能执行 JS 的蜘蛛會跟,不能执行的就停在入口頁,對不确定抓取能力的蜘蛛来说風險最高。
- 用戶点击跳轉:放一個“点击進入”的連結,蜘蛛虽然會顺着 a 标簽爬,但這類連結在頁面上往往被弱化,實际被發現的比例不稳定。
蜘蛛面對不同跳轉的常见表現
- 遇到服務端 3xx:直接看 Location 头,鏈路最短,也最容易被记進抓取队列。
- 遇到 meta refresh:先抓完入口頁,再解析 head,再發起第二次請求,多一次往返。
- 遇到 JS 跳轉:取决于渲染能力,同一個地址在不同蜘蛛那里结果可能完全不同。
- 遇到跳轉到 404 或超时:這次抓取基本白跑,還可能拖低该入口頁後續的抓取優先級。
按场景怎么選
- 入口頁只是過渡、目标頁才是長期内容:優先 301,语义清晰,鏈路干净。
- 入口頁需要保留、只是临时導流:用 302,避免蜘蛛把入口頁從索引里換掉。
- 入口頁要展示一段說明文字,同时引導蜘蛛繼續走:可以让服務端跳轉與頁面正文並存,但注意別让頁面内容與目标頁完全重复。
- 目标地址需要根據来源動態判断:能服務端處理就別推给 JS,少一次渲染的不确定性。
- 跳轉目标按批次固定,別让同一個入口頁今天跳 A、明天跳 B,蜘蛛容易判断為不稳定。
几個容易踩的坑
- 用 JS 跳轉却指望所有蜘蛛都能跟過去,等于把结果押在不确定因素上。
- 301 跳到一個同样會跳轉的中間頁,形成鏈條,白耗抓取预算。
- 跳轉目标带一串随机參數,每次抓取地址都不同,等于制造了大量重复 URL。
- 入口頁跳向一個返回 5xx 的目标,蜘蛛會把這筆帳记在入口頁身上。
跳轉只是把蜘蛛带到门口,门後有没有可抓的内容、返回什么狀態碼,才是决定這次抓取有没有價值的部分。
落地时的几條建议
把跳轉方式当成接口约定来管理:入口頁模板统一使用同一種跳轉方式,目标地址集中配置,改的时候改一處而不是到處改。上线後观察日誌里的抓取路径,看蜘蛛是停在了入口頁還是走到了目标頁,這比凭感觉判断可靠得多。同时给跳轉目标做狀態碼和响應時間的例行检查,跳轉本身没問题、目标頁打不開,前面的功夫一样會白費。