入口頁本身只是一個中轉站,它的任務是把蜘蛛带到目标站。但带過去的方式不止一種:有 301、302 這样的 HTTP 跳轉,有 meta refresh,也有 JavaScript 跳轉,還有最朴素的可见連結。不同方式在蜘蛛眼里並不是等價的,處理方式和跟不跟、跟多遠都不一样。
為什么跳轉方式值得單獨拿出来看
蜘蛛抓到一個入口頁後,會先看响應,再决定下一步。如果响應里明确寫着這個地址換到另一個地址,蜘蛛通常會繼續請求新地址;如果跳轉藏在脚本里,或者信号不够明确,蜘蛛可能停在入口頁,也可能把入口頁当成最终頁面。入口頁數量一多,跳轉方式選得不對,就會表現為入口頁抓了、目标站没動静。
几種常见跳轉方式的蜘蛛表現
301 永久跳轉
301 传递的是舊地址永久換成新地址的信号。蜘蛛一般會較快地把新地址纳入抓取范围,並且後續再遇到舊地址时,也可能直接按新地址處理。對入口頁来说,如果入口頁本身不打算承载内容,只是把蜘蛛引向目标站,301 是相對干净的選擇。但要注意:一旦大量入口頁都用 301 指向同一個目标地址,目标站會集中承受抓取压力,而不是被分散。
302 與 307 临时跳轉
302 表示临时跳轉,蜘蛛通常也會跟,但保留舊地址的抓取记錄,不會立刻用新地址替換。307 類似,只是更嚴格地保持原請求方法。用 302 做入口頁跳轉,好處是後續調整目标地址时改動成本低;坏處是蜘蛛可能反复回到入口頁確認,入口頁的抓取次數會比 301 多一些。如果入口頁只是临时測試,302 没問题;如果長期固定指向某個目标站,302 容易让抓取在入口頁上多绕一圈。
meta refresh
meta refresh 寫在 HTML 的 head 里,浏览器和蜘蛛都能识別,但優先級低于 HTTP 跳轉。它的優点是實現简單,不需要改服務器配置;缺点是跳轉意图不够强,蜘蛛可能先把入口頁当普通頁面處理,再决定跟不跟。如果入口頁只有一條 meta refresh,没有其他連結,蜘蛛漏跟的概率會比 HTTP 跳轉高一些。
JavaScript 跳轉
通過 JS 改 location 的方式,對部分蜘蛛来说並不總是能可靠执行。搜尋引擎對 JS 的渲染能力在提升,但抓取阶段和渲染阶段是分開的,蜘蛛可能先拿到一個没有目标連結的頁面就走了。把跳轉完全交给 JS,等于把能不能到目标站這件事押在渲染上,入口頁數量多的时候不太划算。
直接可见的連結
最朴素的方式是在入口頁正文里放一個普通連結,让蜘蛛自己决定跟不跟。這種方式没有跳轉信号,但對蜘蛛来说路径是明确的,也方便入口頁保留一点自己的内容。缺点是它更像引導而不是跳轉,蜘蛛不一定會優先跟。适合入口頁本身有一定内容、不急于把蜘蛛立刻送走的情况。
選擇跳轉方式时的几個判断点
- 目标地址是否長期固定:長期固定優先 301;需要频繁調整則考虑 302 或可见連結。
- 入口頁是否保留内容:只做中轉,HTTP 跳轉更直接;想保留一点頁面信息,可见連結更自然。
- 蜘蛛的渲染能力:不确定對方是否执行 JS 时,不要把跳轉只放在脚本里。
- 抓取压力的落点:跳轉會让目标站承接更多請求,入口頁再多,压力也不會凭空消失。
一個容易忽略的细节:跳轉鏈的長度
有些入口頁不是一步到位,而是 A 跳到 B,B 又跳到 C,最後才到目标站。每多一层跳轉,蜘蛛就多一次請求,也多一個可能中断的环节。鏈路過長时,蜘蛛可能在中間某一跳停下来,或者把中間的地址当成最终頁。比較稳妥的做法是让入口頁直接跳到目标地址,减少中間层;如果确實需要中間层,至少保證每一跳都是 HTTP 跳轉,而不是 HTTP 跳轉接一段 JS 再接 meta refresh。
落地建议與排查顺序
- 先確認入口頁返回的跳轉類型:是 301、302,還是 200 頁面里藏着 meta refresh 或 JS。
- 用抓取工具或日誌看蜘蛛是否真的請求了目标地址,而不是只看入口頁有没有被抓。
- 如果目标站没有動静,優先把混合跳轉改成單一 HTTP 跳轉,减少中間层。
- 如果目标站抓取量突然變大,检查是否大量入口頁同时 301 到同一個地址,必要时分散目标。
- 跳轉方式調整後,观察一段時間再判断,不要一两天没變化就反复改。
跳轉方式是入口頁和蜘蛛之間的指路方式。指得越直接、越稳定,蜘蛛越容易走到目标站;指得太绕或者太依赖渲染,入口頁就容易被当成终点。