搜索抓取

服务器响应慢下来的时候,蜘蛛的抓取节奏会怎么变

讨论抓取时,大家更常看状态码、robots 和 Sitemap,很少看响应时间。本文拆解蜘蛛为何在意页面响应速度:并发槽位被占用、超时中断、抓取速率下降,以及由此带来的抓取覆盖停滞。同时给出容易忽略的慢源、日志自查方法和可落地的调整顺序。

搜索抓取

服务器响应慢下来的时候,蜘蛛的抓取节奏会怎么变

讨论抓取的时候,大家更常看状态码、robots、Sitemap,很少看响应时间。但对蜘蛛来说,一个页面“能不能打开”和“多久打开”是两件事,后者往往更直接影响它愿不愿意把时间花在你的站上。

蜘蛛对响应时间的敏感,来自它的工作方式

蜘蛛不是一个用户,它同时管着很多站点、很多 URL。每个抓取请求要占用一个并发槽位,而槽位是有限的。当某个页面响应很慢,这个槽位就被长时间占住,其他 URL 只能排队等。所以慢页面的代价不只是那一个页面,而是整段抓取时间被拉长。

另外,蜘蛛通常有自己的超时阈值。超过阈值还没拿到完整响应,这次抓取就可能被中断,日志里留下一个不太好看的结果。它可能会稍后重试,但重试同样要花抓取预算。

慢在哪里,需要分清楚

用户感知的“慢”和蜘蛛遇到的“慢”并不完全重合,拆开看会更清楚:

  • 连接阶段:DNS 解析慢、TLS 握手慢,常见于解析服务不稳定或证书链配置复杂。
  • 首字节时间(TTFB):服务器开始返回第一个字节之前的时间,多半是程序逻辑或数据库查询的问题。
  • 传输阶段:页面体积过大、未压缩、把大文件当正文返回,都会拖长传输时间。
  • 渲染阶段:HTML 很快,但内容靠 JS 拼出来,蜘蛛需要进渲染队列,整体耗时再叠一层。

响应变慢之后,通常会看到什么现象

  • 抓取速率整体下降,日志里同一时间段的蜘蛛请求数明显变少。
  • “已发现未抓取”的 URL 数量增加,新页面迟迟轮不到。
  • 抓取覆盖停止增长,但站点并没有报错,也没有被 robots 挡住。
  • 部分 URL 反复被抓,部分 URL 一直没动静,分布看起来很不均匀。

这些现象单独看都不像服务器问题,容易被归到内容或内链上,结果改了半天页面结构,问题还在。

几个容易被忽略的慢源

排查的时候,可以先从这几类地方看:

  1. 没有缓存的动态查询。尤其列表页、标签页、搜索结果页,一次请求打一次数据库。
  2. 第三方脚本与统计代码。页面本身很快,但要等外部资源,整体响应被拖住。
  3. 图片和静态资源没做压缩,还缺了合理的缓存头,蜘蛛每次都要完整拉一遍。
  4. 日志同步写盘或页面里调用了外部接口,高峰期把响应时间整体推高。
  5. 中间件里的限速、鉴权、防盗链逻辑,对蜘蛛也照样走了一遍。

怎么用日志看清真实情况

服务器日志里通常能看到响应时间、状态码和返回字节数。把这几个字段按 URL 分组统计,会看到一些平时不看的东西:哪些路径在平均响应上明显偏慢,哪些 URL 返回 200 但字节数很小,哪些请求集中在同一秒里扎堆。

如果日志里保留了 UA,还可以单独看蜘蛛那一部分请求,观察它的请求间隔。间隔在变大、同一批 URL 的重访时间在拉长,往往说明抓取节奏在放缓,而不是它忘了你的站。

能落地的调整顺序

不用一次改完,按影响面从大到小来排:

  • 先给动态页面做缓存,哪怕只是短时间的页面缓存,也能把 TTFB 压下来。
  • 静态资源交给 CDN,并设置合理的缓存过期时间。
  • 压缩传输内容,图片按需生成尺寸,不要原图直出。
  • 减少页面上不必要的重定向和阻塞型脚本。
  • 把不需要被抓取的慢接口,用 robots 或权限控制挡在抓取路径之外。
不要把“蜘蛛抓得慢”当成需要限速的理由。响应慢导致的抓取减少,本质上是你自己把通道变窄了;这时候再加 Crawl-delay,只会让恢复更慢。

稳定比单次快更重要

偶尔一次 200 毫秒、偶尔一次 8 秒,比稳定在 800 毫秒伤害更大。蜘蛛会根据长期的响应表现来安排对你的抓取,波动大的站点很难维持稳定的抓取节奏。把响应时间的波动压下来,比追求某一次跑分好看更实际。

做完这一轮,再回头看抓取覆盖、URL 发现和内链结构,判断会更准确:到底是路径没铺好,还是路虽然铺好了,但走得实在太慢。