蜘蛛池的主要任務是让搜尋引擎蜘蛛顺着入口頁爬到目标 URL。入口頁本身往往只是一個中轉,真正被“發現”的是跳轉之後的目标頁。也正因為如此,跳轉方式選错了,蜘蛛可能在半路就停下,後面铺的連結再密也没用。
蜘蛛是怎么處理跳轉的
主流搜尋引擎蜘蛛遇到跳轉时,會先记錄狀態碼或頁面里的跳轉信号,再决定要不要繼續請求新地址。這個過程消耗的是同一份抓取预算:一次跳轉等于两次請求。跳轉鏈越長,被放弃的概率越高。
301 永久重定向
最“干净”的跳轉。蜘蛛一般會跟随,並把發現信号向新地址传递。用在入口頁上,意味着入口頁本身不再被当作落地頁,而是被当作一個跳板。需要注意的是,如果入口頁數量很大且都做 301 到同一批目标頁,容易形成明顯的批量模式。
302 / 307 临时重定向
蜘蛛通常也會跟随,但语义是“临时”。有些實現會在多次抓取後又變回 200,這種反复會让蜘蛛降低對该地址的信任度。如果你希望入口頁長期稳定地指向某個目标,302 不是好選擇;如果目标頁還在調整,302 反而更合适。
meta refresh
放在 HTML head 里的 <meta http-equiv="refresh">。因為需要先把 HTML 抓下来再解析,所以比 3xx 多一次解析成本。延迟時間设為 0 或 1 秒时,多數蜘蛛能處理;设成几十秒,蜘蛛通常不會等。
JS 跳轉
location.href 這類跳轉依赖渲染。蜘蛛愿意渲染时能跟到,不愿意渲染时鏈路就断在入口頁。把 JS 跳轉和 3xx 混用、或者把跳轉寫在异步回調里,都會增加不确定性。
跳轉鏈的長度
入口頁 → 中間頁 → 目标頁,這種两跳以上的结构,每一跳都在消耗预算,也在增加“某一跳失敗就全断”的風險。多數情况下,一跳到位比多跳更稳。如果确實需要中間层,至少保證每一跳都是可被抓取的静態响應。
容易被忽略的坑
- 跳轉目标不可達:跳過去是 404、超时或需要登入,蜘蛛下次就不太愿意再跟。
- 用 JS 拼接跳轉地址:地址在執行时才生成,蜘蛛拿不到完整 URL。
- 跳轉前先检查 UA 或 Referer:识別错一次,可能整段鏈路對蜘蛛都不可见。
- 同一入口頁在不同時間跳向不同地址:蜘蛛重复抓取时得到矛盾结果,容易判定為異常。
- 跳轉頁返回 200 又同时带 meta refresh:语义混乱,部分蜘蛛會直接当作普通頁面處理。
實践上的取舍
- 要長期稳定地指向目标頁,優先 301;只是临时調整,用 302。
- 能用 3xx 就不優先用 meta refresh,能用静態跳轉就不優先用 JS 跳轉。
- 跳轉鏈尽量控制在一跳,最多两跳。
- 跳轉目标頁要能正常返回 200,且内容與入口頁主题別差得太遠。
- 上线後翻服務器日誌,確認蜘蛛确實請求了跳轉後的地址,而不是只停在入口頁。
跳轉方式不决定收錄,但它决定蜘蛛有没有机會看到你的目标 URL。把這一段修顺,是成本最低、见效最快的一步。