為什么跳轉方式會影响蜘蛛的判断
入口頁本身通常不承载最终内容,它的作用是把蜘蛛带到目标頁。從入口頁到目标頁之間,可能是直接返回内容,也可能经過 301、302、meta refresh 或者 JS 跳轉。蜘蛛在處理這些跳轉时付出的成本、收到的信号並不一样:有的會把抓取額度和信号一並带過去,有的只是临时看一眼,還有的需要額外渲染才能發現下一跳。選错方式,常见的结果不是完全抓不到,而是抓了一半就停。
几種跳轉方式的抓取表現
301 永久重定向
服務器端返回 301,语义上表示资源永久搬家。蜘蛛一般會較快更新索引里的地址,並把原来的信号轉到新地址,适合入口域名已经确定不再使用、整体迁移的场景。但如果入口頁還要反复更換目标,就不适合用 301,因為蜘蛛會逐步把舊入口從索引中剔除,入口本身的價值會被消耗掉。
302 / 307 临时重定向
临时跳轉是最常见的做法:入口頁保留索引,蜘蛛每次訪問都跟着跳一次。它不承诺關系永久,适合轮換目标頁、分批測試的场景。需要注意 307 會保留請求方法,一般用于接口類請求;普通頁面跳轉用 302 就够,不必為了"看起来更規范"而換用 307。
meta refresh 與 JS 跳轉
這两種属于客戶端跳轉。蜘蛛要先拿到 HTML,再决定要不要繼續。meta refresh 的等待時間如果设得太長(比如 5 秒以上),部分抓取會直接放弃;JS 跳轉則依赖渲染能力,抓到但没渲染,往往就断在入口頁。能用服務端跳轉,就優先服務端,客戶端的方案只作為补充。
跳轉鏈路的長度
一跳可達最理想:入口頁到目标頁,中間不再有其它中轉。鏈路每加一层,蜘蛛就要多發一次請求、多消耗一份抓取額度,而且中途任何一個环节响應慢或返回错誤,整條鏈路就断了。
- 尽量控制在 1 到 2 跳以内,避免 A 跳 B、B 跳 C、C 跳 D 這種层层轉發;
- 不要出現环形跳轉,A 跳 B、B 又跳回 A,會让蜘蛛反复空跑;
- 同一入口頁的目标尽量稳定一段時間,频繁改動會让蜘蛛前後抓到的结果互相矛盾。
跨域跳轉的處理
入口頁與目标頁不在同一域名时,跳轉本身不是問题,問题在于信号传递會被削弱。跨域 301 通常仍能传递一部分信号,但不如同域直接。若入口與目标分属不同主体、不同服務器,建议先把入口頁的响應稳定下来(狀態碼、响應時間、robots 規則),把抓取通道打通,再考虑信号层面的事。顺序反了,容易出現"目标頁没抓到,入口頁也被拖累"的情况。
容易踩坑的几種做法
- 對蜘蛛返回 302、對普通用戶直接返回内容,這種差异化响應如果規則寫得太粗,容易被判定為作弊;
- 用 JS 拼接目标地址,地址還带随机參數,蜘蛛每抓一次得到一個新 URL,形成參數爆炸;
- 入口頁跳轉到 404、500 或者需要登入的頁面,抓取记錄里會留下一堆無效狀態碼;
- 跳轉目标频繁更換且每次都返回 301,等于不断告诉蜘蛛"這個地址作废了",入口頁會越来越难被抓。
怎么確認跳轉是否正常工作
- 用 curl -I 看响應头和狀態碼,確認返回的是 301 還是 302,Location 指向哪里;
- 關閉 JS 再訪問一次入口頁,看是否還能到達目标頁;
- 在抓取日誌里筛出该入口頁的记錄,观察狀態碼分布,以及後續是否出現目标頁所在服務器的訪問;
- 定期抽查一批入口頁,確認没有跳轉鏈断裂、超时或指向错誤地址。
跳轉只是通道,通道稳不稳,决定了蜘蛛愿不愿意繼續往里走。比起频繁更換目标,先把狀態碼和响應時間做稳定,收益通常更直接。
整体建议:能 302 就別 301,能一跳就別两跳,能用服務端就別用 JS。入口頁的價值在于被發現,把跳轉做得干净、稳定、可预期,比堆更多入口域名更實际。