搜尋抓取

蜘蛛抓取时的连接與协议:長连接、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. 改動一次只動一項配置,避免把原因和结果搅在一起。

连接和协议是抓取鏈條的下半段,平时不太顯眼,但在抓取量增長、頁面數變多的时候,它會决定蜘蛛這一趟能走多遠。