网站怎么防爬虫采集?Nginx+宝塔拦截恶意 Bot 完整实战教程

导语

打开后台一看,文章一夜之间被采集站扒得干干净净;接口被脚本疯狂请求,数据库连接直接打满;辛苦积累的内容权重被垃圾站复制得一文不值。这是很多站长都遇到过的事。

爬虫本身不是坏事,百度、谷歌等搜索引擎的蜘蛛是你的流量入口,但恶意 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 规则与防火墙封禁

如果你用的是宝塔面板,操作更直观:

  1. 打开”网站 → 对应站点 → WAF”,开启”恶意 User-Agent”过滤规则,宝塔内置了主流采集器和扫描器特征库;
  2. 在”WAF → 自定义规则”中把上面的正则直接粘贴为规则,命中即拦截;
  3. 在”安全 → 防火墙”中按地区、IP 段封禁,采集站 IP 往往集中在少数地区,可针对性处理;
  4. 开启宝塔防火墙的”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。记住两个原则:白名单优先,搜索引擎蜘蛛永远放行;先观察后拦截,避免误伤真实用户。本文由速度网络技术团队整理,希望对各位站长有帮助。

给TA打赏
共{{data.count}}人
人已打赏
0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
在线客服
在线客服
热线电话
QQ客服
电子邮箱
suduwangluo