投放URL的时候,很多人只盯着入口URL能不能被蜘蛛訪問,却忽略了從入口到最终頁面之間還藏着几层跳轉。鏈路一長,抓取结果往往和预期對不上:日誌里能看到蜘蛛来過,但目标頁始终没有抓取记錄。
搜尋蜘蛛确實會跟随跳轉,但耐心有限
主流搜尋引擎的蜘蛛都支持跟随HTTP 3xx跳轉,也就是看到301或302後會繼續請求新地址。所以從原理上说,投放一個跳轉URL並不是完全無效的。
但這個跟随不是無限的。Google官方文档建议跳轉鏈尽量控制在5跳以内,百度没有给出明确數字,不過在真實抓取中,鏈路越長,中間任何一跳出現超时、5xx或者解析異常,整條鏈路就可能直接断掉,蜘蛛會放弃繼續往下走。
几種常见跳轉场景的實际表現
一跳301直達最终頁
這是最干净的情况。蜘蛛請求入口URL,拿到301和Location,再請求最终頁,一次跳轉就結束了。信号传递相對明确,最终頁被發現的概率也最高。
多跳302鏈
302是临时跳轉,蜘蛛一般也會繼續跟,但每多一跳就多一次請求和等待。如果鏈路里夹着統計跳轉、短鏈跳轉、CDN节点跳轉,蜘蛛需要连續請求好几個地址才能到终点,抓取效率會被明顯拉低。更麻烦的是,某一跳如果返回了带參數的中間頁,蜘蛛可能把中間頁当成终点记錄下来。
meta refresh 和 JS 跳轉
HTML里的meta refresh通常能被识別,前提是延迟時間不要太長,几秒以内比較稳妥。而JS跳轉(比如window.location赋值)依赖頁面渲染执行,如果頁面本身就渲染不完整,跳轉可能根本不會發生,蜘蛛自然也就看不到最终頁。
跳到登入頁、首頁兜底或错誤頁
有些站点的跳轉規則配置有問题,未登入用戶會被重定向到登入頁,或者任何異常都兜底跳回首頁。蜘蛛對這類頁面的處理结果就是:它到了终点,但终点不是你想让它看的内容,最终頁等于没被發現。
投放前可以自己做的检查
- 用curl -IL或者浏览器的網絡面板,完整看一遍跳轉鏈,數清楚中間有几跳、每一跳的狀態碼是什么。
- 確認最终頁返回200,並且返回的HTML里能看到正文,而不是一個空壳框架。
- 如果條件允许,直接把最终可訪問的URL作為投放目标,跳過中間层,這样最省事。
- 投放後翻服務器日誌,重点看蜘蛛有没有請求最终頁那個路径,而不是只看到入口URL被訪問。
- 检查最终頁有没有被noindex或者robots.txt挡住,這類問题會让前面的跳轉全部白做。
跳轉鏈断掉,通常是這几個原因
- 中間某一跳返回5xx或者响應超时,蜘蛛到不了下一站。
- 跳轉規則按UA、地区或登入狀態分流,蜘蛛拿到的分支指向了另一個地址。
- 跳轉逻辑寫成了循环,A跳B、B跳回A。
- 终点頁需要登入或人机驗證,蜘蛛拿不到内容。
跳轉本身不是問题,問题在于鏈路太長,或者终点不是你想展示的頁面。把蜘蛛直接引到最终URL,通常比在中間堆几层跳轉更稳妥。
還有一点需要說明:跳轉顺利、蜘蛛也訪問了最终頁,並不等于這個URL一定會被收錄。發現只是第一步,後面的内容质量、站点整体狀態、抓取配額都會影响處理结果,不要把跳轉当成收錄的保證。