蜘蛛進到入口頁之前,先拿到的其實不是 HTML,而是服務器返回的狀態碼和响應头。這一层信息很短,却常常决定蜘蛛是繼續抓、放慢抓,還是干脆先走開。不少蜘蛛池入口頁本身内容没大問题,問题出在服務器给出的信号上。
狀態碼是蜘蛛對入口頁的第一判断
蜘蛛對狀態碼的解讀比較固定:
- 200:正常,内容可取。入口頁大多應该落在這個狀態。
- 301 / 302:跳轉。蜘蛛會跟,但跳轉鏈太長、跳轉目标不稳定时,它可能只跟到中途。
- 403:服務器拒绝訪問。蜘蛛通常理解為不被允许,多次遇到後可能降低對该路径甚至该主机的抓取频率。
- 429:請求過多。這是服務器主動限流,蜘蛛一般會退让,按 Retry-After 或自行降低频率。
- 5xx:服務器错誤。蜘蛛會把责任归到服務器侧,短期可能重试,長期持續报错就會减少来訪。
- 404 / 410:頁面不存在。前者它還會再试几次,後者是明确告诉它別来了。
需要留意的是,狀態碼影响的往往不是單個 URL,而是蜘蛛對整個主机段的信心。同一個入口站長期大量返回 5xx 或 403,蜘蛛後續连正常頁面也可能少来。
响應头里几個容易被忽略的字段
Content-Type 與字符集
如果 Content-Type 声明的是 text/html,實际返回的却是別的内容,或者字符集寫错導致頁面乱碼,蜘蛛解析出来的正文可能是错的。入口頁批量生成时,编碼不统一是常见問题。
X-Robots-Tag
它和 meta robots 效果類似,但作用在 HTTP 层,可以针對整站或某個目錄。入口頁若被加上 noindex,蜘蛛仍可能抓取,但不會把它当正常结果看待;加上 nofollow,頁面里的連結就未必被跟。
Retry-After
配合 429 或 503 使用,等于告诉蜘蛛過多久再来。寫了這個字段,蜘蛛的退避更有依據;不寫,它只能自己猜。
Cache-Control、Last-Modified 與 ETag
這几個字段不影响蜘蛛是否来,但影响它是否重新下载内容。入口頁如果長期不變,合理的缓存标识可以减少重复下载;反過来,内容天天調但缓存头寫得很死,蜘蛛可能拿到舊版本。
蜘蛛遇到错誤时的常见反應
多數搜尋蜘蛛對错誤有一套退避机制,大致可以理解為:
- 首次遇到 5xx 或超时,短期重试几次。
- 错誤持續,抓取間隔被拉長,来訪次數下降。
- 主机层错誤比例過高,蜘蛛對该主机的整体抓取會收缩,優先去抓更稳定的站。
- 错誤恢复後,频率的回升通常比下降慢,需要一段時間观察。
狀態碼本身不决定收錄,它决定的是蜘蛛愿不愿意在這台服務器上多花時間。服務器越稳定,蜘蛛越敢来。
實际使用中的几点建议
- 在服務器訪問日誌里按狀態碼統計,先看 5xx、403、429 的比例,這比看總訪問量更有意义。
- 入口頁不该用 403 来挡蜘蛛,需要屏蔽时用 robots 或明确的 meta 指令,別让服務器直接拒绝。
- 限流用 429 加 Retry-After,比直接掐断连接更友好,蜘蛛能理解這是暂时的。
- 错誤頁不要返回 200,软 404 會让蜘蛛把無内容頁面当正常頁抓走。
- 批量生成入口頁时,统一字符集和 Content-Type,避免因為编碼問题让正文解析失敗。
- 跳轉尽量短,能用 301 就別堆多級 302,目标 URL 保持稳定。
- 定期用抓取工具模拟蜘蛛,检查入口頁返回的狀態碼、响應头和實际渲染内容是否一致。
把狀態碼和响應头理顺,是蜘蛛池里成本很低、但回报比較直接的一步。它不保證蜘蛛一定来,也不保證頁面一定被處理,但能让蜘蛛在判断要不要繼續這件事上少一些犹豫。