入口頁最核心的职责,是把蜘蛛带到真正的目标 URL。除了在頁面上摆連結,跳轉是另一種常见做法。但跳轉方式選得不對,蜘蛛可能到了门口就停下,或者把入口頁当成一個没有價值的中間层。
先想清楚跳轉要達成什么
在挑方式之前,先把三件事對齐:
- 可發現:蜘蛛能顺着跳轉鏈走到目标頁,而不是停在入口頁。
- 信号去向:原本指向入口頁的連結與抓取记錄,是留在入口頁還是轉给目标頁。
- 可回退:入口頁將来換目标、下线或改结构时,改動成本是否可控。
這三点的優先級不同,選出来的跳轉方式往往也不同。
几種跳轉方式的差异
301 永久跳轉
301 的语义是“這里以後都不在了,請去新地址”。對蜘蛛来说,這是一條明确的迁移信号,多數情况下會把入口頁的记錄逐步轉移到目标 URL。它适合固定映射的场景:一個入口頁長期只指向一個目标頁,且不打算频繁更換。
要注意的是,301 鏈條不宜過長。入口頁 → A → B → 目标頁這種多級跳轉,會消耗抓取预算,也容易在某一环断掉。尽量一跳到位。
302 與 307 临时跳轉
临时跳轉告诉蜘蛛“位置暂时變了,但原地址還算數”。蜘蛛通常仍會保留入口頁,抓取力度是否跟過去,取决于它對临时性的判断。這類跳轉适合活動頁、短期专题這種會更換目标的场景。
如果長期用 302 指向一個稳定目标,等于一直在告诉蜘蛛“這只是临时的”,信号传递就會變得模糊。這種情况不如直接给連結,或者換成 301。
JS 跳轉
用 JavaScript 做 location 跳轉,依赖蜘蛛是否执行脚本。主流搜尋蜘蛛基本具备渲染能力,但渲染是有成本的,入口頁本身如果没有實质内容,可能排不進渲染队列。
所以 JS 跳轉更适合作為补充路径,而不是唯一路径。頁面上同时保留一個可点击的普通連結,是成本很低的保險。
meta refresh
meta refresh 是寫在網頁头部的声明式跳轉,解析成本低,各類爬虫的兼容度也比較好。缺点是延迟時間不好把握:设為 0 秒最干脆,设成几秒又會让蜘蛛在入口頁多停一會儿。另外,這種方式對信号传递的表達比較弱,通常被理解為“頁面自己主動換個地方”,而不是嚴格的迁移声明。
常见誤区
- 一個入口頁同时用多種跳轉方式,比如既有 302 又有 JS 跳轉,指向的還不是同一個地址。蜘蛛可能只走其中一條,另一條就成了無效路径。
- 跳轉目标带一堆參數或會话 ID,每跳一次生成的 URL 都不一样,结果目标頁被拆成多個版本。
- 把跳轉頁当中轉层,一层套一层,每层只寫一句“正在跳轉”。這類頁面本身没有内容,蜘蛛走到最後往往什么也没拿到。
- 把 404、410 和跳轉混着用,入口頁狀態时好时坏,狀態碼来回變,蜘蛛很难建立稳定的抓取印象。
按场景選,而不是按习惯選
- 入口頁與目标頁是長期一對一關系:優先直接連結,其次 301。
- 目标頁會周期性更換:用 302 或 307,換的时候同步更新,別留舊跳轉。
- 目标頁不在同一域名下,且你希望信号轉移:301 更合适,同时確認目标頁能正常訪問、不需要登入。
- 入口頁本身有内容、想让蜘蛛留下做二次發現:直接给連結,跳轉只作為辅助。
- 只是临时切換几分钟做维護:用 302 或 503,別去動 301。
跳轉方式没有绝對的好坏,關键是它和你的長期意图是否一致。反复横跳,比一次選错更伤抓取關系。
用日誌驗證跳轉是否按预期工作
改完跳轉後,观察几天的訪問记錄:入口頁是否還在被抓、目标頁出現频次是否上升、有没有冒出明顯不该存在的中間 URL。如果入口頁訪問量没下降、目标頁也没變化,多半是跳轉没被识別,或者跳轉鏈在某一环被拦下了。
同时留意跳轉响應本身的耗时。跳轉頁如果响應慢,蜘蛛可能在拿到跳轉指令之前就超时离開,前面所有設定都白做。
最後提醒一句:跳轉只是路径设計的一部分,真正决定目标頁能不能被稳定抓取的,還是目标頁自身能否正常訪問、内容是否可讀。跳轉做對了,也只是把门打開。