先想清楚:跳轉是為了發現,還是為了记錄
蜘蛛池入口頁的跳轉,通常服務两個目的:一是把蜘蛛從入口頁引到目标 URL,让目标頁有机會被發現;二是让入口頁本身留下被抓取的记錄,维持蜘蛛的回訪习惯。這两個目的並不完全一致,選擇的跳轉方式也不同。
如果入口頁只是“跳板”,蜘蛛到達後立刻离開,目标 URL 的發現效率取决于跳轉是否被正确跟随;如果入口頁還要承担记錄和回訪功能,就不宜让蜘蛛彻底忘掉入口頁。先确定目的,再選跳轉類型,比事後补救更省事。
301:适合稳定映射,別用来频繁換目标
301 表示永久跳轉。蜘蛛在多次抓取後,通常會更新自己记錄的地址,後續可能不再回訪入口頁,而是直接訪問跳轉後的目标。因此,301 适合入口頁與目标 URL 長期一對一、不打算频繁更換的场景。
- 适合:入口頁和目标頁绑定稳定,希望蜘蛛把注意力集中到目标頁。
- 不适合:今天跳 A、明天跳 B 的轮換策略,因為蜘蛛更新记錄後,入口頁的回訪可能减少,目标更換後不一定能及时重新發現。
- 注意:如果目标頁之後又換了,舊 301 可能让蜘蛛繼續訪問舊地址,需要尽快修正。
302 與 307:临时跳轉,保留入口頁的回訪
302 表示临时跳轉,蜘蛛一般會保留入口頁的抓取记錄,繼續回訪入口頁並重新跟随跳轉。307 與 302 類似,但更强調保持原有請求方法。對于需要按批次、按時間段切換目标的蜘蛛池,302/307 通常比 301 更灵活。
但临时跳轉也不是随便用。如果入口頁今天跳 A、明天跳 B,而每次跳轉都返回 302,蜘蛛會反复抓入口頁,這對入口頁的抓取频次是一種消耗。更稳妥的做法是把目标數量控制在一個小范围,並观察日誌里目标 URL 是否被持續跟進。
302 鏈不宜過長。A 跳 B、B 跳 C、C 跳 D 的连环跳轉,會让蜘蛛在中間环节消耗抓取次數,最终目标反而可能被忽略。
JS 跳轉與 meta refresh:能识別,但別当作唯一手段
JS 跳轉依赖爬虫执行頁面脚本的能力。不同蜘蛛對 JS 的执行程度不一样,有的會执行,有的只看 HTML 源碼。如果入口頁只用 JS 跳轉,部分蜘蛛可能停在入口頁,目标 URL 不會被發現。因此 JS 跳轉更适合作為补充,而不是主力方式。
meta refresh 是 HTML 层面的跳轉,多數蜘蛛能够识別,但需要關注延迟參數。常见的 content="0;url=..." 表示立即跳轉,识別率相對好一些;如果把延迟设成 5 秒、10 秒,蜘蛛可能直接忽略,或者把頁面判断為低质入口。meta refresh 可以用于简單场景,但同样不建议作為唯一跳轉方式。
直接返回 200 並放連結:最稳,但少了跳轉統計
入口頁直接返回 200,並在正文里放置指向目标 URL 的連結,是结构最简單的方式。蜘蛛抓取入口頁时,會顺着連結發現目标,不需要依赖跳轉跟随。這種方式出错概率低,也方便做内鏈层級控制。
代價是跳轉統計不如服務端跳轉直观:你看不到一次明确的跳轉動作,只能通過日誌里目标 URL 的抓取记錄来判断。如果你更看重稳定,而不是跳轉次數报表,這種方式往往更省心。
跳轉鏈長度:尽量控制在一跳
無论用哪種跳轉,鏈越長,中間环节失敗的概率越高。蜘蛛在每一跳都要重新發起請求,如果其中某一跳返回超时、404 或 5xx,後面的目标就不會被訪問到。建议把跳轉鏈控制在一跳,入口頁直接指向最终目标。
- 能直達目标,就不要经過中間跳轉頁。
- 如果必须多跳,确保每一跳都返回正确的狀態碼。
- 定期检查跳轉鏈中是否有失效环节。
怎么观察跳轉是否生效
不要只看配置,要看實际抓取行為。可以通過服務器日誌、模拟抓取工具和狀態碼记錄来交叉驗證。
- 入口頁日誌:確認蜘蛛是否訪問了入口頁,返回碼是否為 200 或 3xx。
- 目标 URL 日誌:確認蜘蛛是否在入口頁抓取後不久訪問了目标 URL。
- 狀態碼记錄:检查跳轉鏈每一跳的返回碼,避免出現 302 连环或 404。
- 回訪频次:观察入口頁是否還在被持續抓取,判断蜘蛛是否已经“记住”了跳轉目标。
常见誤区與使用建议
- 用 301 频繁更換目标,導致蜘蛛不再回訪入口頁。
- 認為 JS 跳轉一定會被所有蜘蛛执行。
- 把 meta refresh 的延迟设得太長,蜘蛛直接忽略。
- 跳轉鏈层层嵌套,目标 URL 反而没有被發現。
- 只做跳轉,不在入口頁保留任何可抓取内容或連結。
比較稳妥的组合是:需要長期稳定映射时用 301;需要按批次切換目标时用 302 或 307;JS 跳轉與 meta refresh 作為辅助,不作為唯一通道;同时让入口頁返回正确狀態碼,並在日誌中確認目标 URL 确實被跟進。跳轉方式没有绝對的好坏,關键是和目标策略匹配,能观察、能回滚,出現問题时不至于無從排查。