爬虫识别与封禁,区分搜索引擎和恶意爬虫:爬虫识别与封禁
网站跑了一段时间后,日志里出现大量陌生 IP 疯狂抓取,CPU 飙升、带宽跑满,但你又不敢乱封,怕把百度、必应这些搜索引擎蜘蛛一起挡在门外。
这篇文章帮你解决的就是这个矛盾:用可验证的方法区分搜索引擎和恶意爬虫,只封该封的,保住正常收录。
先判断:你是被正常抓取还是恶意爬虫盯上了
打开网站访问日志,路径通常在 /www/wwwlogs/(宝塔)或 /var/log/nginx/。
用下面命令快速看谁在频繁访问:
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -20
输出里如果某个 IP 请求量远超其他,且访问的 URL 杂乱(比如批量扫描 .env、wp-login.php、admin),基本可以判定为恶意爬虫。
正常搜索引擎蜘蛛的请求 URL 通常集中在文章页、列表页,且有规律。
判断条件一:请求频率异常且 URL 无规律,优先怀疑恶意爬虫;
请求集中在内容页且频率平稳,更可能是搜索引擎。
第二步:验证是不是真正的搜索引擎蜘蛛
恶意爬虫最常用的手段是伪造 User-Agent,把自己伪装成 Baiduspider 或 Googlebot。
所以光看 UA 不可信,必须做 IP 反查。
以百度为例,官方蜘蛛的 IP 段是公开的。
用 host 或 nslookup 反查:
host 116.179.32.1
如果返回结果里包含 baidu.com,说明是百度官方 IP;
如果什么都查不到或指向陌生域名,那这个 UA 就是伪造的。
必应、谷歌同理,可以查它们的官方 IP 列表做比对。
判断条件二:UA 声明是搜索引擎,但反查 IP 不属于该搜索引擎官方段,一律按恶意爬虫处理。
第三步:用 Nginx 配置精准封禁
最稳妥的方式是在 Nginx 里做两层控制:先放行验证过的搜索引擎 IP,再对恶意 UA 和异常 IP 做拦截。
在站点配置的 server 块内加入:
# 封禁常见恶意 UA
if ($http_user_agent ~* (SemrushBot|AhrefsBot|MJ12bot|DotBot)) {
return 403;
}
# 封禁指定恶意 IP
deny 45.xx.xx.xx;
改完执行 nginx -t 测试语法,再 nginx -s reload 重载。
宝塔用户可以在「网站」→「设置」→「配置文件」里直接编辑,保存后点「重载配置」。
判断条件三:封禁规则上线后,先观察 24 小时,确认目标 IP 请求返回 403 且搜索引擎蜘蛛访问正常,再考虑长期保留。
避坑指南:这些操作容易误伤
- 不要直接封整个 C 段:云服务商和 CDN 的 IP 经常共享,封段可能误伤真实用户。
- 不要只依赖 UA 黑名单:恶意爬虫随时换 UA,黑名单要配合频率限制使用。
- 慎用
robots.txt防恶意爬虫:它只对守规矩的爬虫有效,恶意爬虫根本不看。 - 封禁前先备份配置:改错 Nginx 配置会导致整站 502,保留一份原始文件再动手。
验证效果:确认封禁生效且没误伤
封禁后重新统计日志:
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10
对比封禁前的数据,如果目标 IP 请求量归零或大幅下降,说明规则生效。
同时用 curl -I 模拟被封锁的 UA 访问,应返回 403:
curl -I -A "SemrushBot" http://你的域名/
如果返回 HTTP/1.1 403 Forbidden,配置正确。
最后别忘了检查百度搜索资源平台的「抓取诊断」,确认蜘蛛仍能正常访问。
常见疑问
封禁恶意爬虫会影响网站 SEO 吗?
只要不误封搜索引擎官方 IP,就不影响。关键在于用 IP 反查确认身份,而不是看到 UA 里有 spider 就封。
没有宝塔面板,纯命令行怎么操作?
直接编辑 /etc/nginx/conf.d/ 下对应站点的 .conf 文件,加完规则后 nginx -t && nginx -s reload 即可。
恶意爬虫换 IP 继续抓怎么办?
可以考虑接入 CDN 或 WAF,在边缘层做频率限制和 UA 校验,比在源站逐条封 IP 更省力。
区分搜索引擎和恶意爬虫的核心不是看 UA,而是看 IP 归属和访问行为。
先分析日志锁定异常来源,再反查 IP 验证身份,最后用 Nginx 规则精准拦截并验证效果,这样既能挡住恶意抓取,也不会影响正规搜索引擎的收录。