做蜘蛛池的人经常會遇到這種情况:入口頁在浏览器里打開一切正常,但日誌里搜尋蜘蛛的訪問量很少,目标 URL 也迟迟没有出現在抓取记錄里。這时除了看内容、看連結,還有一個很容易被忽略的變量——入口頁返回的 HTTP 狀態碼,以及中間经過了什么样的跳轉。
搜尋蜘蛛拿到一個 URL 後的第一步不是解析内容,而是先看服務器返回的狀態碼。狀態碼决定了它接下来做什么:是繼續下载並解析 HTML,還是跟随跳轉,還是直接放弃、甚至把這個地址标记為不可用。入口頁里的目标連結能不能被發現,前提就是入口頁本身有没有被真正讀到。
200 與软 404:只有真正讀到正文,連結才有被發現的机會
入口頁稳定返回 200,並且返回的是完整 HTML 正文,搜尋蜘蛛才會去解析頁面里的 a 标簽、提取 href,進而把目标 URL 放進待抓取队列。這里有一個常见坑:頁面返回 200,但正文其實是“没有找到”“内容不存在”這類提示頁,也就是所谓的软 404。這種情况蜘蛛拿到的 HTML 里通常没有目标連結,等于白抓一次。
還有一種更隐蔽的情况:入口頁返回 200,但正文被模板占满,目标連結被塞在很靠後的位置,或者需要脚本才能渲染出来。狀態碼對了,只是“有机會”,不等于連結一定會被提取。
301、302、307:跳轉能走通,但發現鏈條被拉長
搜尋蜘蛛會跟随重定向,這一点基本可以放心。但需要注意两点:
- 跳轉层數:一次 301 到真實入口頁,一般問题不大;如果 A 跳 B、B 跳 C、C 再跳 D,蜘蛛可能在中間某一跳停下来,或者明顯降低對這條路径的重视程度。
- 跳轉後的落点:蜘蛛真正解析的是重定向之後的那個頁面。如果入口頁 302 直接跳到目标站首頁,那被發現的其實是重定向落点,入口頁里的連結列表根本没參與進来。
另外,用 302 做長期跳轉,语义上是不對的。搜尋引擎會把它当作临时跳轉,可能反复回来检查原始地址,既浪費抓取预算,也让入口頁的狀態變得不稳定。
403、401:蜘蛛拿不到正文,連結就無從提取
這两個狀態碼意味着訪問被拒绝。不管是權限配置错誤、WAF 誤拦,還是按 UA 做了限制,结果都一样:蜘蛛只拿到一個错誤响應,不會去解析頁面里的連結。如果你只在浏览器里測試,很容易漏掉這一点,因為浏览器带着 Cookie 和真實 UA,看到的頁面和蜘蛛看到的完全不是一回事。
404、410:基本等于告诉蜘蛛這條路走不通
入口頁返回 404 或 410 时,蜘蛛一般不會再從响應体里提取連結。410 比 404 更明确,表示资源已永久刪除,搜尋引擎會更快地把這個地址從索引和待抓取队列里清掉。如果入口頁是批量生成的,某一批 URL 規則寫错導致 404,那這批入口頁等于完全失效。
5xx 與 503:不只是這一次没發現,還會影响後面的抓取节奏
5xx 属于服務器端错誤。蜘蛛遇到 5xx 通常會認為是暂时性的,過一段時間再回来重试。但如果入口頁長期返回 5xx 或频繁超时,搜尋引擎會整体降低對這個站点的抓取频率,恢复起来需要時間。503 如果带 Retry-After 响應头,语义上是“暂时不可用,請稍後再来”,比裸的 500 更規范一些,但同样不适合長期使用。
狀態碼决定的是入口頁有没有被讀到;讀到之後連結能不能被提取,還取决于連結的寫法、位置和頁面渲染方式。這两件事是串联關系,不是二選一。
一個可操作的排查顺序
- 用日誌里的真實搜尋蜘蛛 UA 去請求入口頁,看返回的狀態碼,而不是用浏览器直接打開。
- 確認返回体是完整 HTML,而不是空响應、驗證頁或跳轉提示。
- 統計入口頁的狀態碼分布,重点看 3xx 占比和 5xx 出現频率。
- 检查重定向鏈,尽量把跳轉层數控制在一次以内。
- 確認 robots.txt、WAF、CDN 規則没有针對蜘蛛做額外拦截。
把這些理顺之後,入口頁的目标連結才有被發現的基础條件。需要說明的是,即使狀態碼全部正常,也只是让連結進入了候選范围,具体什么时候抓、抓不抓,仍然由搜尋引擎自己决定,没有哪種配置能保證一定被抓取或被收錄。