入口頁本身不是终点,它更像一块路牌。蜘蛛来到這里之後,下一步能不能顺利到達目标頁,取决于你用什么方式把它送過去。跳轉方式属于那種平时没人注意、出問题时又很难排查的环节,值得單獨拿出来讲清楚。
四種常见做法
301 永久跳轉
服務器直接返回 301,並给出 Location 头。蜘蛛在 HTTP 层就能拿到目标地址,不需要渲染頁面,也不用等脚本执行。優点是路径短、确定性高,适合入口頁與目标頁長期绑定的情况。代價是灵活性低,一旦要換方向,等于重新建立一條鏈路。
302 與 307 临时跳轉
临时跳轉适合測試期或短期投放。搜尋引擎對 302 的處理相對保守,传递的信号比 301 弱,也更可能反复確認。307 在請求方法语义上更嚴格,放到抓取场景里,與 302 的差別並不大,不必為了這個细节纠结。
JS 跳轉
用脚本修改地址,蜘蛛必须先执行 JS 才能看到目标。這會把它推進渲染队列,時間不确定,部分抓取行為可能根本不执行脚本。如果你無法確認對方是否渲染,這條路就只能算补充,不能当主路径。
meta refresh
寫在 head 中的刷新声明,零秒版本對多數蜘蛛是可讀的,但優先級低于服務器跳轉,也容易被理解為頁面自身内容不够,只能靠跳走。带延迟的刷新更麻烦,蜘蛛不一定愿意等。
不跳轉,直接放連結
在入口頁正文里放一個普通連結,让蜘蛛自己决定跟不跟。這是最笨的方式,也是最透明的方式——锚文本、上下文、周围内容它都能看到。很多场景下,它比花哨的跳轉更有效。
蜘蛛實际怎么處理
- 服務器返回的 3xx 狀態碼優先級最高,蜘蛛在 HTTP 层就完成识別。
- JS 跳轉依赖渲染,可能進入二次抓取,到達時間不确定。
- meta refresh 需要解析 head 区域,通常能识別,但不如 3xx 直接。
- 普通連結最容易被理解,因為它本身就是頁面内容的一部分。
几處容易踩的坑
- 跳轉鏈太長:入口頁到 A,A 再到 B,B 才是目标頁。每多一跳,丢一次的概率就多一分。
- 同一批入口頁里 301 與 302 混用,出問题时不方便定位。
- 目标頁自身不可訪問,跳過去也拿不到東西,先確認目标頁正常返回。
- 跳轉地址带會话參數,同一目标頁生成多個 URL,反而分散了抓取。
- 把跳轉寫進脚本的加载回調里,頁面又做了懒加载,蜘蛛可能先看到一個空壳。
落地建议
- 入口頁與目标頁關系長期稳定时,優先用服務器端 301。
- 測試阶段用 302,確認鏈路没問题再固化。
- 不要為了統計或绕行叠加多层跳轉,鏈路越简單越好。
- JS 與 meta refresh 只作為补充手段,不要作為主路径。
- 每批入口頁上线後抽查响應头,確認狀態碼和 Location 與预期一致。
- 记錄每條入口頁的跳轉去向,方便後續止损和替換。
跳轉的本质,是让蜘蛛用最小的成本知道下一頁在哪。越靠近 HTTP 层越稳,越靠近渲染层越慢。
把跳轉当成基础设施,而不是当成技巧。這样在批量维護、替換和排查时,你會省下很多力气。