抓取日志里出现错误码时,很多人第一反应是"是不是蜘蛛不喜欢我的站"。其实同样是抓取失败,在蜘蛛看来差别很大:有的只是这一次没拿到,过一会儿会再来;有的说明整个主机正在出问题,蜘蛛会主动降低访问频率,甚至暂时把这段路径排到后面。搞清楚这些差别,才能判断该马上处理,还是过几分钟再看。
先分两类:临时抖动和持续故障
判断依据主要有三个:状态码本身、错误持续的时间和影响范围、以及服务器给出的附加信息,比如 Retry-After 响应头。个别 URL 偶发 500,通常是某段代码或某个查询超时;整站大面积 5xx,往往意味着这台主机当前不稳定。范围不同,蜘蛛后续的调整也不同。
500、502、504:站点侧的问题,蜘蛛会向外退
500 一般表示服务端脚本出错,502 和 504 多出现在反向代理、网关或后端超时。这类错误的共同点是问题在站点这边,而且往往不止影响一个页面。蜘蛛连续遇到 5xx 时,常见做法是降低该主机上的并发和抓取频率,把资源挪去别的站点,过一段时间再回来试探。
需要注意的是,5xx 不会让已经索引的 URL 立刻消失,但反复失败会让蜘蛛对这段路径的信心下降——原本每天来几次的目录,可能变成几天才来一次。恢复之后也不一定马上回到原来的节奏,通常要有一段正常响应的时间来慢慢回来。
503:这是明确告诉蜘蛛"现在别来"
503 的语义是服务暂时不可用,适合用在计划内维护、临时下线、高峰期限流这些场景。如果维护有明确的结束时间,可以在响应头里带上 Retry-After,写清楚多久之后再试。蜘蛛看到这个信号,一般会推迟重访,而不是当成永久失效。
反过来说,如果服务器长期返回 503,蜘蛛会逐渐把它当成一种不稳定的常态,抓取频率同样会降下来。所以 503 适合短时间用,不适合当作长期的"挡蜘蛛"方案。
429:限流信号,别让它变成常态
429 表示请求过多。有些站点在高峰期用它限制一切来源的请求,蜘蛛也在其中。偶尔出现可以理解,但如果蜘蛛几乎每次来访都撞上 429,它会明显放慢节奏。更麻烦的是,限流往往发生在抓取最密集的时段,也就是蜘蛛最需要拿到内容的时候。
比起一刀切地限流,更常见的做法是给不同类型的请求设置不同阈值,或者只限制动态、耗资源的路径,让静态页面和主要入口保持可访问。
403、401 与连接层失败
403 表示拒绝访问,蜘蛛无法判断是内容不存在还是被挡在门外;被挡的次数多了,来访通常会减少。401 则是要求身份认证。连接层的失败——DNS 解析不了、连接被重置、首字节时间过长——不会留下一个漂亮的状态码,但同样会被计入抓取失败的统计里。这类问题常在服务器负载高、防火墙拦截或证书异常时冒出来。
出现错误后,可以按这个顺序看
- 确认范围:是单个 URL、某个目录,还是整站。用日志按路径分组,别只看总数。
- 看时间分布:是某几分钟的突发,还是持续了几个小时甚至几天。
- 看响应头:有没有 Retry-After,是否被 CDN、WAF 或负载均衡改写过。
- 看静态资源:图片、CSS、JS 大批 5xx 时,页面即使返回 200,蜘蛛拿到的也是不完整的页面。
- 确认恢复:修好之后继续盯同一段路径的状态码,别只看首页就收工。
页面返回 200,不代表这次抓取就是成功的。渲染所需的资源成批失败时,蜘蛛看到的内容可能和用户看到的相差很远。
把稳定性当成抓取路径的一部分
抓取路径不只是链接怎么连,还包括蜘蛛每一次请求能不能顺利拿到东西。同样的内链结构,放在一台响应稳定的服务器上,和放在多台机器频繁抖动的环境里,最终被走完的页面数量可能差很多。与其反复调整清单和链接,不如先把 5xx 和连接失败压到一个很低的水平,再去处理结构和深度的问题。
最后提醒一句:状态码是给机器看的信号,写法要贴合语义。把该返回 404 的页面返回 200,把限流写成 404,都会让蜘蛛对站点做出错误判断,之后的抓取安排也就更难预期。