搜索引擎蜘蛛抓太猛把服务器拖慢?合规限速实战

搜索引擎蜘蛛是网站收录的贵客,但抓取过于频繁时,同样会把服务器拖慢。本文用 9 个问答讲清怎么区分真蜘蛛与假爬虫、怎么在 Nginx 层给合规蜘蛛单独限速、robots.txt 与站长后台能做什么设置,以及在不误伤 SEO 的前提下降低抓取压力的实战做法。

Q:搜索引擎蜘蛛抓太猛,真的会把服务器拖慢吗?

  • 会。合规蜘蛛的 IP 可信、行为正常,但量可以非常大,尤其三类站点最容易中招:图片与视频等资源密集型站点、列表页总页数上万的站点、动态页面完全没有缓存的站点。
  • 与恶意爬虫的区别在「身份可信」,但并发拉高时,它对 CPU、数据库、带宽的消耗和攻击在实际效果上并没有本质区别。
  • 判断原则:不确定是恶意时,先按「流量压力」处理(限速),而不是按「攻击」处理(封禁)。
  • 另外要留一个心眼:很多「蜘蛛抓取过频」其实是假蜘蛛在冒充,识别方法见下一问。

Q:怎么确认这些请求确实是搜索引擎蜘蛛,而不是伪装的?

# 1) 反向解析:反解出来的域名必须是搜索引擎官方域名
dig +short -x 66.249.66.1
# 期望类似 crawl-66-249-66-1.googlebot.com

# 2) 正向解析:把域名解回来,必须与原 IP 完全一致
dig +short crawl-66-249-66-1.googlebot.com

# 3) 官方 IP 段(Google 提供公开列表,可用于生成白名单)
curl -s https://developers.google.com/search/apis/ipranges/googlebot.json \
  | grep -o '"ipv4Prefix": "[^"]*"' | cut -d'"' -f4 | head
  • 只做反向解析是可以被伪造的:攻击者只要在自己控制的 DNS 里把 IP 反解成搜索引擎域名就能骗过简单的校验,必须先反解、再正解、且正解结果与原 IP 一致三件套一起做。
  • 行为特征上,真蜘蛛会同时抓 HTML 与静态资源,且活动范围在 robots.txt 声明之内;只反复刷接口、几乎不拉任何静态资源的,基本都是伪装。
  • 自建反向校验时务必加缓存,否则每次请求都触发一次 DNS 查询,等于变相给对方提供 DNS 放大能力。

Q:能不能直接把过于频繁的搜索引擎蜘蛛封掉?

  • 不建议。封禁合规蜘蛛会直接影响收录与排名:短期表现为新页面不收录、抓取配额下降,长期会出现旧页面掉出索引。
  • 正确姿势是限速而不是封禁:让它抓得到,但抓得慢一点。
  • 返回码很关键:对搜索引擎要用 429 或 503(带 Retry-After),不要用 403。403 会被理解为「禁止抓取」,可能触发降权;429 与 503 表示「暂时忙不过来」,蜘蛛会自动退避并稍后重试。
  • 同一个道理,也不要用 404 去回应蜘蛛的正常抓取,那会让它以为页面已经不存在。

Q:怎么在 Nginx 层给搜索引擎蜘蛛单独限速?

# 1) 用 UA 识别主流搜索引擎蜘蛛
map $http_user_agent $is_spider {
    default 0;
    ~*(Googlebot|bingbot|Baiduspider|YandexBot|Sogou|360Spider|Bytespider) 1;
}

# 2) 蜘蛛流量共用一个独立令牌桶,不占用真实用户额度
map $is_spider $cc_key {
    1  "spider";
    0  $binary_remote_addr;
}
limit_req_zone $cc_key zone=crawler:10m rate=20r/s;

server {
    limit_req  zone=crawler burst=50 nodelay;
    limit_req_status 429;
    add_header Retry-After 10 always;
}
  • 关键点一:所有蜘蛛共用一个桶(key 是固定字符串 spider),这样蜘蛛的抓取量再大也只吃这一份额度,不会挤占真实用户的令牌桶。
  • 关键点二:burst 要给够。蜘蛛是批量抓取,burst 太小会让正常抓取也被拒,反而拖慢收录。
  • 关键点三:如果只想在业务高峰对蜘蛛限速,把蜘蛛桶的 rate 设高一些,再配合定时任务在高峰时段切换配置文件,比一刀切更友好。
  • rate 的取值不要拍脑袋,先统计平峰时段蜘蛛的 QPS 峰值,把阈值放在它之上,只削尖峰不压常态。

Q:robots.txt 的 Crawl-delay 有用吗?

User-agent: Baiduspider
Crawl-delay: 2

User-agent: *
Crawl-delay: 1
  • 分爬虫看:百度、Yandex、必应等支持 Crawl-delay;Google 明确不支持,会直接忽略这一行。
  • 对 Google 而言,官方的思路是把服务器响应速度保持在正常范围,Googlebot 会自动调节抓取速率,响应慢它就自动降速。
  • 所以 robots.txt 只是「君子协定」,只能管守规矩的爬虫;管不住的还得靠上面的 UA 与 IP 层限速来兜底。

Q:怎么从日志看出是哪只蜘蛛在过度抓取?

# 1) 按蜘蛛 UA 统计请求量(combined 日志用双引号作分隔,第 6 段是 UA)
awk -F'"' '{print $6}' /var/log/nginx/access.log \
  | grep -Ei 'bot|spider|crawler' | sort | uniq -c | sort -rn | head -20

# 2) 单个蜘蛛的分钟级抓取峰值
grep -i 'Baiduspider' /var/log/nginx/access.log \
  | awk -F'[][]' '{print $2}' | cut -d: -f1-3 | sort | uniq -c | sort -rn | head

# 3) 是否在反复抓同一个 URL(说明该页更新频繁或没有缓存)
grep -i 'Googlebot' /var/log/nginx/access.log \
  | awk '{print $7}' | sort | uniq -c | sort -rn | head -20

# 4) 是否也抓静态资源(数量明显偏低就要警惕是假蜘蛛)
grep -i 'Baiduspider' /var/log/nginx/access.log \
  | grep -Ec '\.(js|css|png|jpg|jpeg|gif|webp)'
  • 重点看三个量:总请求量、分钟级峰值、重复抓取的 URL 数量。
  • 如果某只蜘蛛的请求峰值与业务高峰完全重合,那它就是在和真实用户抢资源,必须限速。
  • 把蜘蛛请求单独落盘(用 map 打标记 + 条件日志),出问题时才能一眼看出是蜘蛛吃掉了资源,还是被攻击。

Q:除了限速,架构层还能怎么降低抓取压力?

# fastcgi_cache:命中缓存的动态页面不再执行 PHP、不查数据库
fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=page:100m inactive=1h max_size=2g;
location ~ \.php$ {
    fastcgi_cache page;
    fastcgi_cache_valid 200 10m;
    fastcgi_cache_use_stale error timeout updating;
    fastcgi_cache_lock on;   # 同一 URL 并发只回源一次,防缓存击穿
}
  • 三个最有效的动作:给蜘蛛也走上缓存、把图片与静态资源全部交给 CDN、精简 sitemap 并保证 lastmod 准确。
  • 图片站、图库站被蜘蛛拖慢,八成是因为图片直接回源,把图片走 CDN 往往能立竿见影。
  • sitemap 里的 URL 越多越乱,蜘蛛越容易反复全站爬;更新频繁但内容没变化的页面会让蜘蛛反复回访,白白消耗资源。
  • 让蜘蛛抓到的大多数是缓存命中,源站压力自然就下来了,这比单纯限速更治本。

Q:站长后台能设置抓取频次吗?

  • 百度搜索资源平台:可在「抓取频次」里设置抓取频次上限,还能查看抓取压力与抓取异常,这是国内站点最直接的一招。
  • Bing Webmaster Tools:提供 Crawl Control,可以设置抓取速率档位。
  • Google:已在 2019 年移除手动抓取速率设置,改为自动调节。能干预的是服务器响应速度,Search Console 里可以查看抓取统计。
  • 不要为了省资源就把上限压得过低,抓取受限会直接影响新内容的收录速度。

Q:有哪些坑必须避开?

  • 不要做 UA 定向的内容差异化(对蜘蛛与用户返回不同内容),这属于 cloaking,会被判定作弊,风险远大于省下的资源。正确做法是让蜘蛛也走缓存,而不是给它另准备一份内容。
  • 不要用 403 或 404 回应蜘蛛的过度抓取,会伤害收录;用 429 或 503 加 Retry-After。
  • 限速规则上线前先做一遍反向 DNS 验证,别把 CDN 回源请求(部分回源会携带蜘蛛 UA)误判进去。
  • 限速阈值要先看自己平峰的蜘蛛 QPS,放在正常峰值之上,只削尖峰。

Q:还有什么补充建议?

  • 先量后调:把每只蜘蛛的分钟级峰值记下来形成基线,限速阈值才有依据。
  • 把蜘蛛与用户分开计量:日志里给蜘蛛打标记,才能分清资源是被蜘蛛吃掉还是被攻击吃掉。
  • 别只在出事时看日志:把「蜘蛛请求量突增」「缓存命中率下降」做成日常告警,蜘蛛抓取的异常往往也是收录即将变化的先兆。
  • 一句话总结:对搜索引擎蜘蛛,原则是「限速不限流、给缓存不给差异内容」——让它抓得慢一点、活得轻一点,但绝不封、不用 403,也不要递给它另一份内容。