导语
打开后台一看,文章一夜之间被采集站扒得干干净净;接口被脚本疯狂请求,数据库连接直接打满;辛苦积累的内容权重被垃圾站复制得一文不值。这是很多站长都遇到过的事。
爬虫本身不是坏事,百度、谷歌等搜索引擎的蜘蛛是你的流量入口,但恶意 Bot——采集器、刷量脚本、漏洞扫描器——消耗带宽、拖垮性能、窃取内容,必须拦。本文从 Nginx 层、宝塔面板到 CDN 联动,给出三层防爬虫方案,全部配置可以直接复制使用。
一、先认清敌人:恶意爬虫的几种典型形态
防护之前先分清哪些是”朋友”哪些是”敌人”:
- 搜索引擎蜘蛛:Baiduspider、Googlebot 等,应当放行甚至优先对待;
- 内容采集器:基于 Python-requests、Scrapy、curl、wget 等工具批量抓取,UA 特征明显;
- SEO 垃圾爬虫:MJ12bot、AhrefsBot、SemrushBot 等,疯狂爬取页面白耗流量;
- 漏洞扫描器:sqlmap、Nikto 等,UA 特征固定,常伴随大量 404 探测;
- 伪装 UA 的脚本:特征不明显,只能靠频率限制和行为判断。
针对前四类,用 UA 黑名单就能解决一大半;针对最后一类,必须上频率限制。
二、Nginx 层三层拦截:UA 黑名单 + 空 UA 拒绝 + 频率限制
1. 恶意 UA 黑名单(map 方式,性能最好)
在 nginx.conf 的 http 块中定义 UA 匹配规则,注意用 map 而不是 if 正则,worker 进程在启动时一次性编译规则,性能差异巨大:
http {
map $http_user_agent $bad_bot {
default 0;
~*python-requests 1;
~*scrapy 1;
~*curl 1;
~*wget 1;
~*java/ 1;
~*go-http-client 1;
~*libwww-perl 1;
~*MJ12bot 1;
~*AhrefsBot 1;
~*SemrushBot 1;
~*nikto 1;
~*sqlmap 1;
}
}
然后在 server 块中引用:
server {
# 命中黑名单 UA,直接返回 403,不消耗后端资源
if ($bad_bot) { return 403; }
# 拒绝空 UA 的请求(绝大多数脚本采集器不携带 UA)
if ($http_user_agent = "") { return 403; }
}
2. 请求频率限制(防刷接口、防 CC 式采集)
UA 可以伪造,但频率骗不了人。用 limit_req 限制单 IP 的请求速率:
http {
# 定义限流区:单 IP 每秒最多 5 个请求,突发放宽到 10 个
limit_req_zone $binary_remote_addr zone=anti_bot:10m rate=5r/s;
}
server {
location / {
limit_req zone=anti_bot burst=10 nodelay;
}
# 对文章列表、标签页等采集重点页面单独收紧
location ~* ^/(category|tag|list)/ {
limit_req zone=anti_bot burst=5 nodelay;
}
# 对搜索接口做更严格限制,防止被刷
location /api/search {
limit_req zone=anti_bot burst=3 nodelay;
}
}
配置完成后执行 nginx -t 检查语法,再 nginx -s reload 生效。
三、宝塔面板配合:WAF 规则与防火墙封禁
如果你用的是宝塔面板,操作更直观:
- 打开”网站 → 对应站点 → WAF”,开启”恶意 User-Agent”过滤规则,宝塔内置了主流采集器和扫描器特征库;
- 在”WAF → 自定义规则”中把上面的正则直接粘贴为规则,命中即拦截;
- 在”安全 → 防火墙”中按地区、IP 段封禁,采集站 IP 往往集中在少数地区,可针对性处理;
- 开启宝塔防火墙的”CC 防护”模块,设置单 IP 请求阈值,超出自动封禁。
注意:宝塔 WAF 默认强度过高可能误伤真实用户,建议先跑一周”观察模式”,根据日志再调整阈值。
四、进阶:人机验证与 CDN 联动
到这一步能拦住 90% 的普通爬虫。剩下的”高级爬虫”会模拟真实浏览器、随机切换 UA,必须上行为检测:
- JS 挑战:正常浏览器会执行 JS,脚本不会,可在 CDN 边缘层开启 JS 质询;
- 验证码:对高频访问 IP 弹出验证码,成本最低但影响体验;
- Cookie 会话标记:首次访问种下带签名的 Cookie,后续请求校验。
如果你没有专职运维,最省心的做法是把这些交给 CDN 厂商。比如速度网络的高防 CDN 就内置了 Bot 管理能力,可以一键开启”人机验证”和”爬虫拦截”,配合 WAF 规则实现边缘层防护,源站只放行 CDN 回源 IP,恶意流量根本到不了你的服务器。
五、总结
防爬虫不是一步到位,而是持续对抗:先用 Nginx UA 黑名单和空 UA 拒绝挡住 80% 的脚本,再用 limit_req 限流挡住高频采集,最后叠加宝塔 WAF 与 CDN 人机验证处理高级 Bot。记住两个原则:白名单优先,搜索引擎蜘蛛永远放行;先观察后拦截,避免误伤真实用户。本文由速度网络技术团队整理,希望对各位站长有帮助。
