搜尋抓取

蜘蛛一次抓多少頁:並發、限速與站点侧的容量准备

蜘蛛抓取不是一次只取一個頁面,並發连接數與請求速率共同决定了它能在站点上走多深。本文從 429/503、Crawl-delay、控制台限速三類信号说起,给出估算服務器容量的简單方法,並說明哪些情况下應主動降速、日誌里如何判断並發是否正常。

搜尋抓取

蜘蛛一次抓多少頁:並發、限速與站点侧的容量准备

很多站長把注意力放在“蜘蛛来没来”,却很少關心“蜘蛛一次来多少”。實际上,同一時間發起的請求數量(並發)和單位時間内的請求總量(速率),直接决定了蜘蛛能在你的站点上走多深。理解這两件事,才能明白為什么有些站点抓取顺畅,有些站点總是被轻轻点一下就走了。

蜘蛛的並發不是無限的

抓取程序通常會對同一個域名维持一個连接池,同时保持若干條连接。這個數字没有公開的固定值,它和站点整体健康状况、歷史响應速度,以及抓取程序当时的资源調度都有關系。表現到日誌上,就是同一個時間段里,来自蜘蛛的請求是交织出現的,而不是一條接一條。

由此可以得出两個结论:

  • 頁面响應越慢,同样的连接數能完成的抓取量越少;
  • 站点一旦出現大量超时,蜘蛛會主動收窄並發,而恢复起来比降下来慢得多。

限速信号從哪里来

站点能施加的限速手段大致有三類,優先級和效果並不相同:

  1. 服務端返回 429 或 503。這是最直接的反馈。429 表示請求過多,503 表示服務暂时不可用。两者都會让抓取节奏明顯放缓,区別在于 503 通常會被理解為站点整体故障,影响面更大。
  2. robots.txt 里的 Crawl-delay。它對部分蜘蛛有效,但並非所有抓取程序都會嚴格执行,把它当作唯一手段並不稳妥。
  3. 控制台里的抓取速度設定。多數搜尋引擎提供了限速選項,作用范围是本站,适合在压测或大促期間临时下調。

容量准备:先算清楚能扛多少

與其被動限速,不如先算一筆帳。假设日誌里观察到蜘蛛峰值是每秒若干次請求,而這個峰值恰好出現在你最慢的一批動態頁面上,那么真實的资源消耗要按最慢那類頁面来估。一個粗略但實用的做法是:

  • 挑出抓取量占比最高的 10 個 URL 模板;
  • 测出它們各自的平均响應時間;
  • 用峰值請求數乘以平均响應時間,估算需要的並發處理能力。

如果算出来的數字已经接近服務器上限,那就不该等蜘蛛自己撞墙,而應提前對慢頁面做缓存或静態化。

响應時間的波動比平均值更值得關注

平均值好看不代表稳定。日誌里如果出現“大部分請求 50 毫秒,少數請求 8 秒”這样的分布,說明存在慢查询或鎖竞争。這類毛刺對抓取节奏的伤害,往往比整体偏慢更大——蜘蛛遇到几次超时,就可能降低整站的抓取频率。

什么时候该主動降速

以下几種情况,主動降低抓取速度是合理選擇:

  1. 站点正在做資料库迁移、索引重建等重运维操作;
  2. 新上线的功能還没经過压测,响應時間不可预期;
  3. 日誌顯示磁盘 IO 或資料库连接數已经接近上限。

降速期間不要顺手把 robots.txt 改成全站 Disallow,那样會让蜘蛛彻底停止訪問,恢复後重新爬也需要時間。更温和的做法是保留抓取、只放缓频率。

限速解决的是“別把我压垮”,不解决“该抓的没抓到”。如果頁面本身長期無人訪問、内鏈稀疏,再宽的配額也用不到它身上。

日誌里怎么讀並發

把日誌按時間排序,看相邻請求的時間間隔:間隔稳定且密集,說明並發正常;如果出現成片的間隔拉長,再配合当时的响應碼分布,基本可以判断是站点侧變慢,還是抓取侧主動退避。建议按小时聚合,观察是否存在固定时段的規律性波動,比如备份任務占满 IO 的那一小时。

抓取速度是站点和抓取程序之間的一個動態平衡点。站点稳定、响應快,蜘蛛自然愿意多待一會儿;站点忽快忽慢,蜘蛛就會保守行事。與其研究怎么“催”,不如先把响應時間和可用性做扎實。