蜘蛛抓取不止发生在 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、带宽曲线放在一起看,更容易判断是蜘蛛来得太急,还是站点自己接不住。
实践建议
- 确认服务器已正确启用 HTTP/2,用命令行工具或在线检测验证协商结果,而不是只看配置文件。
- 连接层的限流别做得过于激进。直接断开连接,比返回明确的 503 加 Retry-After 更难被蜘蛛理解。
- CDN 或 WAF 如果会改写协议、拦截可疑 UA,先确认没有误伤正常抓取。
- 抓取量大的站点,分开观察页面请求和资源请求的连接占用,避免资源把页面抓取的位置挤掉。
- 改动配置后观察一到两周日志,用数据确认变化,而不是凭感觉判断。
连接层优化不能保证收录,也不会直接提升排名。它解决的是蜘蛛能不能稳定、高效地把页面取回去这一步,属于基础工程,而不是增长手段。