搜索抓取

蜘蛛抓取时的连接与协议:长连接、HTTP/2 与 TLS 握手怎么影响抓取节奏

蜘蛛一次来访往往要取几十上百个 URL,连接建立、协议协商和 TLS 握手同样占时间。本文从长连接复用、HTTP/2 多路复用、握手成本几个角度,说明协议层面对抓取节奏的影响,以及服务器端可以观察哪些指标、哪些情况其实不必折腾。

搜索抓取

蜘蛛抓取时的连接与协议:长连接、HTTP/2 与 TLS 握手怎么影响抓取节奏

提到抓取效率,多数人先想到页面体积和响应时间。但蜘蛛一次来访往往要取几十上百个 URL,这中间的连接建立、协议协商、TLS 握手同样占时间。同一台服务器、同样的页面,配置不同,蜘蛛单位时间内能走完的页面数可能差出一截。

长连接:一次握手,多次复用

HTTP/1.1 默认开启持久连接。第一个请求完成 TCP 握手和(HTTPS 下的)TLS 握手之后,后续请求可以复用这条连接,省掉重复的握手往返。对蜘蛛来说,这意味着在同一段时间预算里,可以覆盖更多 URL。

影响复用的常见配置:

  • Keep-Alive 超时设得过短,连接还没被复用就被关掉;
  • 中间层(CDN、负载均衡、反向代理)与源站的超时不一致,客户端看到的是被提前断开;
  • 部分动态接口返回 Connection: close,把蜘蛛甩回重新握手。

这些设置本身不会让页面更容易被抓,但会实打实地增加每个 URL 的平均耗时。

HTTP/2 多路复用:并发不再等于多开连接

HTTP/2 在一条连接上并行传输多个请求,蜘蛛不必为每个并发请求各建一条 TCP 连接。对服务器而言连接数下降、握手开销减少;对蜘蛛而言,小页面居多的时候整体节奏更紧凑。

一个连接也意味着一个风险点

多路复用把鸡蛋放进了一个篮子。如果这条连接因为服务端限流、超时配置或中间设备被掐断,同一批请求会一起受影响,蜘蛛需要重连再排队。所以启用 HTTP/2 之后,连接层面的稳定性反而更值得盯。

不是所有流量都走同一条路

实际环境里,蜘蛛的请求可能被 CDN、WAF 或不同回源策略分流到多条链路上,部分走 HTTP/2,部分退回 HTTP/1.1。想判断协议层有没有拖后腿,需要在日志里按协议版本分组看,而不是只看请求总数。

TLS 握手:看不见但确实存在的成本

HTTPS 站点每次新建连接都要握手。会话复用和 TLS 1.3 的 0-RTT 能减少往返,但如果会话票据配置不当、或前端节点频繁变更,复用率会掉下来,握手次数随之上升。

一个经验判断:如果抓取高峰时段的 CPU 里 TLS 握手占比明显,同时平均响应时间也上去了,那瓶颈可能不在应用逻辑,而在连接建立环节。

服务器端可以看哪些指标

  • 每 IP 或每 UA 段的连接数与请求数比值:比值高说明复用差;
  • 协议版本分布:HTTP/2 与 HTTP/1.1 各占多少;
  • TLS 握手次数与会话复用率;
  • 连接平均存活时长、被主动断开的次数;
  • 首字节时间与总耗时的差距,能反映握手和排队占用多少。

这些数据在 Nginx、网关或 CDN 的日志与监控里大多能拿到。它们不直接说明蜘蛛偏好什么,但能反映抓取过程是否顺畅。

哪些情况不必折腾协议

抓取量本来就不大、日志里蜘蛛请求占比很低的站点,优先把内容质量和内链结构做好,比调协议参数更划算。协议层优化的收益,通常在抓取量上来之后才明显。

一份简单的核对顺序

  1. 先确认蜘蛛是否存在重连频繁、连接被重置的记录;
  2. 再看协议版本分布与会话复用率是否异常;
  3. 对比调整前后的平均每 URL 耗时,而不是只看单页响应;
  4. 改动一次只动一项配置,避免把原因和结果搅在一起。

连接和协议是抓取链条的下半段,平时不太显眼,但在抓取量增长、页面数变多的时候,它会决定蜘蛛这一趟能走多远。