搜索引擎蜘蛛是网站收录的贵客,但抓取过于频繁时,同样会把服务器拖慢。本文用 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,也不要递给它另一份内容。