入口页的任务是把爬虫引到目标页,但在爬虫决定要不要继续往下走之前,它最先读到的是服务器返回的 HTTP 状态码。状态码给错了,锚文本、正文、内链做得再细也很难被正常处理。下面按蜘蛛池的常见场景,把 200、3xx、404、410、429、503 过一遍。
爬虫拿到状态码后大致会做什么
不同爬虫的实现细节有差异,但基本逻辑比较一致:
- 2xx:认为页面正常,继续解析 HTML、抽取链接和正文,纳入后续调度。
- 3xx:跟随跳转,但跳转层级过深或形成循环时会中断;长期用跳转也可能让目标地址的权重传递打折扣。
- 4xx:视为页面不存在或无权限访问,通常会降低对这条路径的抓取频率,多次重复后逐步放弃。
- 5xx:视为服务器端临时故障,一般会安排稍后重试;短时间大面积 5xx,会影响爬虫对整个站点的抓取节奏。
入口页应该在什么情况下给 200
只要这个入口页是你希望被访问、被解析、被继续跟进的,就应该稳定返回 200,并且返回的是真正含链接的 HTML,而不是一条空壳。常见的坑是页面虽然返回 200,但正文只有一句加载中,链接靠脚本异步插入,爬虫拿到的几乎是空页面。这种情况下状态码没问题,内容层出了问题,效果和返回 404 差别不大。
404 与 410 的区别,别混着用
404 表示找不到,410 表示曾经存在但已永久移除。对爬虫来说,410 的信号更明确,页面从索引中移除通常更快一些,但它同时意味着这条路彻底作废,不会再被反复访问试探。蜘蛛池里的入口页大多是临时资源,下线后返回 404 更稳妥;只有当某个入口页确实要永久作废、且你希望它尽快从抓取队列里消失时,才考虑 410。不要为了省事,让整批入口页统一返回 410,那等于主动告诉爬虫这批域名没什么可看的。
503 和 429 的正确姿势
503 表示服务暂时不可用,可以搭配 Retry-After 头告诉爬虫多久之后再来;429 表示请求过频。这两个码在蜘蛛池里的典型用途是服务器临时维护,或者抓取压力过大需要缓一缓。需要提醒的是,有人把 503 当成养页面的手段,让入口页长期返回 503,这种做法并不划算:爬虫会把它当成不稳定的信号,重试几次仍无果后同样会降低访问频率,甚至影响同域名下其他正常页面。临时用可以,长期挂就是自损。
常见的状态码误用
- 入口页返回 404 却指望目标页继续被跟进,链接根本不会被解析。
- 所有请求一律返回 200,包括错误路径,短期看着干净,实际会让大量无效 URL 进入抓取队列,稀释抓取预算。
- 把 302 当成永久跳转长期使用,跳转链一层套一层。
- 服务器超时后返回 200 空页面,爬虫既拿不到内容也拿不到错误信号。
- 用 403 屏蔽某些爬虫,结果误伤了正常抓取。
实操建议
- 入口页与目标页分层管理:入口页给 200,失效后统一走 404,不做花式状态码。
- 跳转尽量一层到位,能用 301 表达永久关系就不要长期挂 302。
- 需要限制频率时优先用 429 或 503 加 Retry-After,并控制在短时间窗口内。
- 批量上线前先抽查状态码,别等抓取异常了再回头翻日志。
- 把状态码分布纳入日常巡检,和访问日志一起看。
怎么快速自查
最直接的办法是用 curl 批量请求入口页,只看响应头,把返回的 HTTP 版本、状态码、Location、Content-Type 记下来,再和服务器访问日志里的状态码分布对照。
如果日志里某个入口目录大量出现 4xx 或 5xx,先查服务器配置和脚本报错,而不是急着换域名。状态码是入口页最基础的一层,它对了,后面的内容、链接、更新节奏才谈得上起作用。