搜尋抓取

抓取速率與並發:站点该给搜尋蜘蛛留多少余量

抓取速率不是站点能單方面设定的開關,它由蜘蛛根據响應時間、错誤率和站点容量動態調整。本文說明响應速度、5xx 比例、缓存與日誌分析如何影响抓取並發,以及怎样让有限的抓取量優先消耗在真正需要被發現的 URL 上。

搜尋抓取

抓取速率與並發:站点该给搜尋蜘蛛留多少余量

抓取速率不是站点單方面能定的

不少站長以為在 robots.txt 里寫一句 Crawl-delay,或者在服務端设定好抓取速度,蜘蛛就會照着执行。實际情况是:抓取速率是搜尋引擎根據站点表現動態調整的结果,站点能做的更多是创造條件,而不是下命令。Crawl-delay 只有部分爬虫支持,主流搜尋引擎更看重自己测到的响應時間和错誤率。

這件事和 URL 發現直接相關:蜘蛛愿意開多少並發、多久跑一轮,决定了队列里那些已经被發現、但還没被抓取的 URL 要等多久。

响應時間决定了蜘蛛愿意開多大並發

調度逻辑並不复杂。如果每次請求都很快返回,蜘蛛會認為站点還有余力,于是提高並發、缩短回訪間隔;如果請求经常要等两三秒,它會主動降速,既不把站点压垮,也不浪費自己的资源。

所以優化抓取速率的第一件事不是催,而是让頁面變便宜:

  • 静態资源和入口頁尽量走 CDN 或反向代理缓存;
  • 列表頁、分類頁這類被抓取最频繁的模板,做好資料缓存;
  • 避免頁面渲染时同步調用外部接口,尤其是容易超时的接口;
  • 資料库慢查询單獨排查,列表頁的首字节時間通常卡在這里。

错誤率是速率的刹车

比慢更糟的是错。5xx 和连接超时會被记為失敗,失敗比例一高,抓取速率會被明顯压低,而且恢复需要一段時間。几個常见坑:

  • 限流誤伤:站点自己的防護規則把蜘蛛当成異常流量拦掉,返回 429 或 403;
  • 發布时短暂宕机:批量生成静態頁或重建缓存时,站点整体不可用;
  • 個別頁面拖垮整体:某個頁面查询极慢,蜘蛛的並發請求都堵在這類 URL 上。

如果确實需要临时维護,返回 503 並带上 Retry-After,比直接返回 404 或 500 更合适。前者表示暂时不可用,後者容易被理解成頁面消失或站点故障。

用日誌估算站点能承受的量

與其猜,不如看日誌。把最近一段時間的蜘蛛請求按小时統計,重点看:

  1. 峰值时段每小时来了多少請求;
  2. 這些請求的平均响應時間與 P95 响應時間;
  3. 其中有多少是 5xx、429 和超时;
  4. 被抓取的 URL 里,有多少是你真正希望被發現的。

如果峰值时段响應時間明顯抬升,說明目前速率已经接近上限,再提高只會带来更多失敗;反過来,如果响應時間平稳、错誤率极低,說明還有余量。

让值得抓的 URL 優先被消耗

速率提升之後,真正被消耗的是抓取队列。队列里的 URL 越多、越杂,有效頁面分到的時間就越少。所以速率和 URL 质量要一起看:

  • 參數頁、篩選组合、無内容的空结果頁尽量挡住,別让它們占队列;
  • Sitemap 只放需要被抓的規范地址,不要把全部歷史 URL 都塞進去;
  • 重要栏目放在浅层,靠稳定的内鏈让它們持續被回訪。

這几点做好之後,同样的抓取速率能覆盖更多有效頁面。

几個實际取舍

與其追求蜘蛛来得越多越好,不如追求每次来都能顺畅抓完该抓的頁面。

大促、上线、發布會這類流量高峰,不要同时做全站重建和大規模 URL 變更,容易把响應時間和错誤率一起推高。日常則可以持續观察首字节時間、5xx 比例和蜘蛛請求量三者的關系,提前發現容量問题。

最後提醒一点:抓取速率是结果,不是開關。站点响應快、错誤少、结构清晰,蜘蛛自然會来得更勤;反過来,任何單点優化都很难長期奏效。