搜尋抓取

HTTP/2 與蜘蛛抓取:连接复用會怎样影响抓取效率

蜘蛛抓取不只是 URL 排队的問题,连接层同样影响效率。本文從 HTTP/1.1 的连接上限讲到 HTTP/2 的多路复用,說明 ALPN 协商、GOAWAY、超时等配置细节怎样干扰抓取,並给出從日誌观察连接表現、調整服務端配置的實用思路。

搜尋抓取

HTTP/2 與蜘蛛抓取:连接复用會怎样影响抓取效率

蜘蛛抓取不止發生在 URL 层

讨论抓取时,多數人习惯從 URL、Sitemap、内鏈這些看得见的地方入手。但蜘蛛真正拿到一個頁面,要先完成 DNS 解析、建立连接、發送請求、接收响應。URL 决定抓什么,连接层决定能不能顺畅抓到。当站点規模變大,连接层的差异會慢慢顯現出来。

HTTP/1.1 下的连接限制

HTTP/1.1 的浏览器和爬虫普遍會對同一個域名限制並發连接數,通常在几條到十几條之間。這意味着蜘蛛在抓取一個頁面时,如果頁面上還引用了額外资源,或者同一時間有多個 URL 排队,就需要在這些连接上排队复用。而连接建立本身是有成本的,TLS 握手、慢啟動都會让每個新连接變慢。

對内容型站点来说,這種開销通常可以接受;但如果頁面依赖大量同域资源,例如样式、脚本和接口請求,HTTP/1.1 的队头阻塞和连接上限就會成為抓取速度的隐形瓶颈。

HTTP/2 改變了什么

HTTP/2 在一條 TCP 连接上支持多路复用,多個請求可以並行传輸,不用為每個請求單獨建连。對蜘蛛而言,常见的變化有:

  • 同一连接内並發發送多個請求,省去反复握手的時間開销
  • 头部压缩减少小請求的传輸体积,對大量小頁面更友好
  • 连接复用降低服務器侧的连接數压力,也更容易做稳定的並發控制

理论上,更少的连接承载了更多請求。但這並不等于抓取量會自動變多——抓取节奏主要由蜘蛛自己的調度策略和服務器响應决定,HTTP/2 只是把通道做得更顺。

服務端配置里容易踩的坑

啟用 HTTP/2 之後,一些配置细节會直接影响蜘蛛的体驗。

ALPN 與 TLS

HTTP/2 通常要求走 TLS,服務器需要通過 ALPN 协商出對應的协议。如果證书鏈不完整、TLS 版本過低,或者中間设备只放行 HTTP/1.1,蜘蛛可能退回舊协议甚至握手失敗。這類問题在抓取日誌里往往表現為连接被重置,而不是某個狀態碼错誤。

连接被提前關閉

HTTP/2 里有两個信号值得留意:GOAWAY 表示服務器准备關閉连接,REFUSED_STREAM 表示某個流被拒绝。如果服務器或中間层频繁發送這類信号,蜘蛛的請求就會失敗重试,抓取速度随之下降。连接超时設定過短,同样會让正常請求被切断。

keep-alive 與超时配置

连接复用依赖合理的空闲超时。超时太短,连接刚建立就被回收,复用率上不去;太長則占用服務器资源。對于抓取量較大的站点,建议先按實际並發观察一段時間,再調整參數,而不是照搬預設值。

從日誌里看连接层的表現

抓取日誌不只记錄 URL 和狀態碼,還能讀出连接特征:

  • 同一 IP 與 UA 的請求時間分布,是否集中在少數時間段
  • 同一连接上是否出現多個請求,也就是有没有走到多路复用
  • 响應时長、连接重置、超时各自占多大比例
  • 被 429、503 挡回的請求,是否與並發突然上升相關

把這些資料和服務器侧的连接數、CPU、带宽曲线放在一起看,更容易判断是蜘蛛来得太急,還是站点自己接不住。

實践建议

  1. 確認服務器已正确啟用 HTTP/2,用命令行工具或在线檢測驗證协商结果,而不是只看配置文件。
  2. 连接层的限流別做得過于激進。直接断開连接,比返回明确的 503 加 Retry-After 更难被蜘蛛理解。
  3. CDN 或 WAF 如果會改寫协议、拦截可疑 UA,先確認没有誤伤正常抓取。
  4. 抓取量大的站点,分開观察頁面請求和资源請求的连接占用,避免资源把頁面抓取的位置挤掉。
  5. 改動配置後观察一到两周日誌,用資料確認變化,而不是凭感觉判断。
连接层優化不能保證收錄,也不會直接提升排名。它解决的是蜘蛛能不能稳定、高效地把頁面取回去這一步,属于基础工程,而不是增長手段。