站点运营

站点运营:抓取频次与并发控制,别让抓取高峰拖垮页面响应

抓取频次其实是双向的:一边是搜索引擎愿意花多少预算来抓,另一边是服务器能不能在高峰时段答得出来。本文把抓取调度、robots.txt 里的 Crawl-delay 与服务器并发限流三件事分开讲,给出可执行的自查清单、值得长期观察的日志指标,以及分层限流的思路,帮助站点在蜘蛛集中来访时不至于卡死。

站点运营

站点运营:抓取频次与并发控制,别让抓取高峰拖垮页面响应

很多站长把抓取频次理解成“蜘蛛来得越多越好”,实际上频次是双向的:一边是搜索引擎愿意花多少预算来抓,另一边是你的服务器能不能在高峰时段稳住。只看任何一边都容易判断失误——蜘蛛来得少,未必是被冷落;蜘蛛来得猛,也未必是受宠。

先把三种“频次”分开看

日常讨论里说的抓取频次,其实混杂了三件事,混着看就会互相打架。

  • 搜索引擎的抓取调度:由平台根据站点历史响应质量、更新频率等信号决定,你只能间接影响,不能直接设定。
  • robots.txt 里的 Crawl-delay:只有部分爬虫会读,而且是建议值不是硬限制,写得太长会连带压掉新页面的发现速度。
  • 服务器侧的并发与限流:真正由你完全掌控的部分,也是出问题时最该先动手的地方。

服务器侧的自查清单

  1. 统计每分钟请求数峰值,区分是蜘蛛造成的还是真实用户造成的。
  2. 确认应用层有没有并发上限,超限时是排队、拒绝,还是直接拖死。
  3. 检查数据库连接池是否够用,抓取高峰常常在这里先崩。
  4. 静态资源与动态页面是否走同一套进程,图片被抓爆会不会拖累页面本身。
  5. 超时阈值是否合理,太长的超时会把连接一直占着不放。

限流要做,但别做成一堵墙

带宽被打满时,最省事的做法是全站加一层严格的频率限制,结果往往是蜘蛛进不来、新内容迟迟不被发现。更稳的思路是分层:对已知的搜索引擎爬虫给一个宽松但有限的上限,对来源不明的请求收紧,对登录、站内搜索、筛选参数这类动态入口单独设限。

如果确实需要临时降速,返回 503 或 429 并带上 Retry-After,比直接返回错误页或长时间挂起要好得多。前者蜘蛛会在约定时间后重试,后者容易被判定为服务器不稳定,抓取频次反而被压低。

限流的目的不是把请求挡在门外,而是让重要页面在被抓的时候,服务器还答得出来。

日志里值得长期盯的几个指标

  • 每小时抓取请求数,看趋势而不是绝对值。
  • 平均响应时间与 P95 响应时间,平均值正常不代表没有拖尾。
  • 5xx 与 429 的比例,超过一个小比例就该查原因。
  • 被抓取 URL 的分布,判断带宽是不是被低价值页面消耗掉了。
  • 出站带宽峰值,以及它与蜘蛛来访峰值的重合程度。

几个容易走偏的做法

一是把 Crawl-delay 设成几十秒,以为这样能省资源。对抓取预算本就不多的站点,这等于主动放慢内容发现。二是只在 robots.txt 里写规则,却不在服务器日志里验证效果,规则写了没人遵守也无从得知。三是只顾着给蜘蛛限速,忽略真实用户的并发,结果高峰期两边一起卡。

抓取频次这件事没有一劳永逸的配置。内容规模、访问量、服务器规格都在变,隔一段时间用日志回看一次,比一次性把参数调到极端要实用得多。