搜索抓取

蜘蛛等多久会走:超时、连接中断与抓取失败的排查顺序

蜘蛛抓取失败时,日志里常常只留下一个笼统的“超时”或“5xx”。本文把一次抓取拆成 DNS、连接、TLS、首字节与传输几段时间,说明连接超时和读取超时的区别,并给出一套从服务器侧逐段测量、定位慢点的自查顺序,帮助站点减少无谓的抓取中断。

搜索抓取

蜘蛛等多久会走:超时、连接中断与抓取失败的排查顺序

很多时候,蜘蛛“没来抓”并不是它不想来,而是来了、连上了、然后在中途被拖到放弃。抓取日志里留给你的信息通常只有一行:状态码缺失、耗时很长、或者干脆记成一个超时。想把问题解决掉,得先知道这段时间到底花在了哪一段上。

一次抓取由几段时间拼成

从蜘蛛的角度看,访问一个 URL 并不是一个动作,而是一串按顺序发生的步骤,每一步都可能成为瓶颈:

  • DNS 解析:把域名换成 IP,解析服务不稳定或 TTL 太短,这一步就会反复消耗时间。
  • 建立连接:TCP 三次握手,网络绕路、防护设备丢包都会让这一步变慢。
  • TLS 握手:证书链过长、协议版本老旧、会话复用没开,都会多出几个来回。
  • 等待首字节(TTFB):服务器真正处理请求的时间,通常是最容易失控的一段。
  • 传输正文:从第一个字节到最后一个字节,页面体积、压缩开关、连接是否复用都在这里起作用。

这五段加起来,才是蜘蛛感受到的“这个页面快不快”。只看总耗时,几乎没法判断该改哪里。

超时不是一个数值,而是几道关卡

连接超时

请求还没送到你的应用层,蜘蛛就在等待握手或等首字节时放弃了。表现通常是日志里没有状态码,或者只有一条连接失败的记录。这类问题多在网络链路、防火墙、CDN 回源这一段。

读取超时

连接已经建立,服务器也开始返回数据,但中间停顿太久,或者正文迟迟传不完。这种情况往往能在日志里看到一个状态码,同时耗时明显高于同站其它页面。它指向的是应用处理慢、数据库慢、或者响应体太大。

抓取日志中的“超时”只说明结果,不说明原因。同一条记录背后可能是 DNS 问题,也可能是某个慢查询,处理方向完全不同。

哪些情况会被记成抓取失败

  • 返回 5xx:应用出错、上游超时、后端服务被重启。
  • 连接被重置:防护策略、并发限制、或协议层不匹配。
  • 429 或类似的限速响应:抓取频率触发了阈值。
  • 空响应或截断的正文:传输中途断开,蜘蛛拿到一个不完整的页面。
  • 4xx:严格说不是超时,但大量 404、403 同样会让蜘蛛在这条路径上白跑。

建议把这几种分开统计,而不是笼统算作“抓取异常”。分开之后,往往一眼就能看出是集中在某个目录、某个子域,还是全站普遍。

自查:把时间花在哪一段量出来

  1. 先从抓取日志里筛出耗时明显偏高的 URL,按目录归类,看是否有规律。
  2. 用命令行工具对同一批 URL 做多次请求,输出各阶段耗时,而不是只看总时间。
  3. 连续采样若干次,关注最慢的那几次,而不是平均值。蜘蛛撞上的往往就是最慢的那次。
  4. 分别对比:带缓存与不带缓存、静态页与动态页、首页与深层页。
  5. 如果耗时集中在首字节,往应用和数据库方向查;如果集中在传输,往体积、压缩和连接复用方向查。
  6. 换一台不同网络的机器再测一次,确认问题在服务端还是链路侧。

常见的拖慢点与处理方向

  • 页面依赖未缓存的复杂查询,建议给高频被抓取的模板页加缓存层。
  • 正文未压缩或压缩未生效,检查压缩是否覆盖了蜘蛛常抓的内容类型。
  • 渲染依赖外部脚本,脚本超时导致整页等待,建议关键内容先服务端输出。
  • CDN 回源超时设置短于源站正常响应时间,造成周期性失败。
  • 连接复用未开启,每个请求都重新握手,累积起来很可观。

不需要一次把所有点都改完。先确定耗时集中在哪一段,再动那一段的配置,改完用同样的方式复测,看耗时曲线有没有变化。稳定而可预期的响应时间,比偶尔很快、偶尔超时要更有价值。