搜索抓取

蜘蛛抓取中途被打断:超时、5xx 与连接失败之后会怎样

蜘蛛抓一个 URL,日志里只有一行记录,但中间要经过 DNS、连接、请求、响应、传输几个环节,任何一环出问题都会中断。本文拆解常见的三种中断方式,说明中断之后蜘蛛会如何重试、降频、延后回访,以及哪些问题其实出在服务器配置上。

搜索抓取

蜘蛛抓取中途被打断:超时、5xx 与连接失败之后会怎样

蜘蛛抓一个 URL,日志里往往只留下一行记录,看起来是一次很简单的请求。但从它决定访问到拿到完整的 HTML,中间要经过好几个环节:解析域名、建立连接、发起请求、等待响应、传输正文。任何一环出问题,这次抓取就中断了。而中断的次数,会直接影响一个站点被发现的效率。

一次抓取要经过哪些环节

  • DNS 解析:把域名换成 IP,缓存失效时会额外增加耗时。
  • 建立连接与握手:TCP 三次握手,如果是 HTTPS 还要加上 TLS 协商。
  • 发送请求、等待响应头:这一段主要看服务器什么时候开始处理。
  • 接收正文:页面越大、动态生成越慢,这一段越长。

其中耗时最长、也最不可控的,是服务器处理请求的那一段。蜘蛛的等待时间有上限,超过上限它就会放弃这次抓取,把资源留给别的 URL。

三种常见的抓取中断

响应超时

服务器迟迟不返回任何内容,蜘蛛等到超时后断开。常见原因是慢查询、外部接口阻塞、模板渲染耗时过长。它不一定会报错,只是这次抓取白跑一趟。

服务端 5xx

服务器明确表示自己出了问题,比如 500、502、503。蜘蛛会把它当作临时故障,而不是页面消失。但如果连续几天都是 5xx,抓取频率就会被压低。

连接被拒或重置

防火墙拦截、并发限流、连接数打满,都可能让蜘蛛在握手阶段就被拒。这类失败在日志里常常只有一行连接错误,不太显眼,但影响和超时类似。

中断之后会发生什么

  • 蜘蛛通常会重试几次,而不是立刻放弃这个 URL。
  • 如果同一个主机上连续多次失败,该主机的整体抓取速度会被压低,这是一道自我保护机制。
  • 已经被收录的页面不会因为一次超时就掉出索引,但更新会延后,直到下一次成功回访。
  • 失败的 URL 会被推回队列,深页本来就抓取优先级低,一旦失败,回访间隔会被拉得更长。
一次超时是偶然,一批超时是信号。前者不用管,后者需要查。

哪些中断其实可以避免

  1. 让响应时间保持稳定。真实情况是波动的,但不要出现大量请求同时卡住的情况,尤其是数据库压力最大的时段。
  2. 限流要温和。宁可返回 429 并带上 Retry-After,也不要直接断开连接,后者对蜘蛛来说更难判断。
  3. 5xx 只用于真正的临时故障。如果某个栏目已经下线,返回 404 或 410 比一直报 500 更清楚。
  4. 消耗大的页面尽量做缓存。同一份内容在短时间内被多次请求,没必要每次重新计算。
  5. 给蜘蛛留出带宽余量。日志里抓取请求和真实用户请求混在一起时,很难判断是谁把服务器压住的。

怎么确认问题出在哪

先看抓取日志里的响应时间分布,不要只看平均值。中位数正常、尾部很长,说明有少数请求卡住了,这类情况对蜘蛛的体验同样不好。接着对比不同爬虫的抓取统计,如果只有某一个来源失败率偏高,问题更可能出在链路或拦截规则上;如果所有来源都在失败,那就是站点本身。

抓取路径能否走通,靠的不是某一次抓取多快,而是它在大多数时候都能顺利完成。稳定比快更重要。