Nginx、Cloudflare、雷池WAF、宝塔防火墙,四个工具配好了能拦住90%的采集,但得先知道爬虫长什么样
上个月帮一个朋友排查问题,他手里管着17个企业站,某天突然发现服务器带宽全天跑满,CPU常年85%以上,网站打开速度从1.2秒掉到了8秒多。日志一拉,一天之内同一个IP访问了4万多个页面,User-Agent写的是"Mozilla/5.0 (compatible; Baiduspider/2.0)"——但IP段是阿里云杭州的ECS。假百度蜘蛛,真采集器。
这种情况比很多人想象的更普遍。站点数量一多,被采集的概率就是几何级增长——一个站可能几个月没人盯上,但十几个站总有那么一两个被人顺手薅走。问题的关键不在于"会不会被采",而在于被采的时候你能不能第一时间发现、能不能快速反制、能不能批量管住所有站点。
防采集四层防线,一层比一层狠
| 1 | 先发现——日志分析、流量监控,知道谁在采、采了多少、什么时候开始的 |
| 2 | 再拦截——Nginx层、WAF层、CDN层三道关卡,能拦多少拦多少 |
| 3 | 然后污染——给采集器喂假数据、乱码、超长字符串,让它采回去也没法用 |
| 4 | 最后批量管——十几个站、几十个站的防护配置不能一个一个手动改 |
一、先搞清楚是谁在采你——日志里藏着的真相

很多人一上来就装WAF、开五秒盾,但连攻击者长什么样都不知道,结果就是正常蜘蛛被你误伤了,采集器倒是绕过去了。防采集的第一步永远是先看日志。
打开你的Nginx access.log,按IP聚合请求数:
# 统计每个IP的请求次数,取前20awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20# 统计每个User-Agent的请求量awk -F'"' '{print $6}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20# 找出同一秒内请求超过5次的IP(高频采集特征)awk '{print $1, $4}' /var/log/nginx/access.log | cut -d: -f1-3 | sort | uniq -c | awk '$1>5' | head -20这三条命令跑完,你基本就能看到谁在薅你的站了。常见的异常模式有这几种:
| 异常特征 | 日志里的表现 | 基本可以判定 |
|---|---|---|
| 单一IP高频访问 | 同一个IP 1分钟内请求200+次,间隔极短 | 采集器 |
| UA伪装蜘蛛 | UA写"Baiduspider"但IP来自云厂商机房 | 假蜘蛛 |
| 只GET不请求静态资源 | 只访问HTML页面,从不加载CSS/JS/图片 | 采集器 |
| URL遍历式访问 | 按ID递增 /article/1 → /article/2 → /article/3… | 批量采集 |
| Referer为空或固定 | 所有请求都没有Referer,或者全是同一个 | 可疑 |
一个关键认知:真百度蜘蛛的IP可以反向DNS解析到 *.baidu.com 或 *.baidu.jp,而且它会正常请求CSS/JS/图片。如果你的日志里"Baiduspider"只GET了HTML页面、IP反解出来是阿里云/腾讯云/华为云,那100%是采集器在冒充。
二、Nginx层——第一道防线,免费但最灵活
Nginx是你最直接能控制的一层,不需要装任何额外软件,改几行配置就能拦住一大半低端采集器。
先说UA黑名单。在nginx.conf的server块里加这段:
# 阻断常见采集工具UAif ($http_user_agent ~* (Scrapy|HttpClient|okhttp|Python-urllib|Go-http-client|curl|wget|WinHttp|Java|Apache-HttpClient)) {return 403;}再配频率限制。用limit_req模块限制单IP请求速率:
# http块中定义限流区域:10MB内存,每秒10个请求limit_req_zone $binary_remote_addr zone=antiscrape:10m rate=10r/s;# server块中应用location / {limit_req zone=antiscrape burst=20 nodelay;# burst=20:允许瞬间20个突发请求# nodelay:超出rate的请求直接返回503,不排队}rate设多少合适?
正常用户浏览网页,一秒最多点2-3个页面。设10r/s已经很宽容了——如果一个IP一秒请求10个以上不同页面,它一定不是人在操作。如果你的站页面比较多,可以放宽到20r/s,但不要低于5r/s,否则移动端快速滑动可能会误触发。
最后是防盗链。如果采集器直接引用你的图片URL,等于你出带宽帮别人展示内容:
location ~* \.(jpg|jpeg|png|gif|webp|svg)$ {valid_referers none blocked *.yourdomain.com *.baidu.com *.google.com;if ($invalid_referer) {return 403;}}Nginx方案的优点:零成本、不占额外资源、配置直接生效。缺点也很明显:对分布式IP采集(代理池轮换)效果有限,而且十几个站一个一个去改Nginx配置,改完还要reload,想想就头疼。
三、Cloudflare——免费用到位的CDN层防护
如果你的站已经套了Cloudflare,免费版自带的Bot管理功能其实已经很能打了,只是很多人只开了DNS解析,压根没去配置。

Bot Fight Mode(免费)
一键开启,Cloudflare自动识别并拦截已知爬虫。基于全球请求指纹库,准确率高,对正常用户几乎无影响。在Security → Bots页面直接打开即可。
WAF自定义规则(免费)
免费版有5条自定义WAF规则。可以设:特定UA→JS挑战、特定国家IP→阻止、特定URL路径→频率限制。5条够一个站精打细算地用。
Rate Limiting(免费)
免费版包含1条速率限制规则。设"同一IP 10秒内请求超过50次→JS挑战",成本几乎为零的防CC/防采集手段。
Cloudflare真正狠的地方是它的五秒盾(JS Challenge)。当一个请求被标记为可疑时,CF会给客户端注入一段JS,浏览器必须执行完这段JS才能拿到真实页面内容。采集器通常是一个简单的HTTP客户端(Python requests、curl等),没有JS执行能力,直接卡死在五秒盾上。
不过有一个关键问题:五秒盾会误伤搜索引擎蜘蛛。Googlebot和百度蜘蛛虽然能执行部分JS,但五秒盾会显著拖慢它们的抓取速度,甚至导致抓取失败。所以五秒盾的正确用法不是全局开,而是配合WAF规则按条件触发——比如UA包含"Python"或请求频率异常的IP才弹出JS挑战,正常用户和搜索蜘蛛走绿色通道。
多站管理提示:Cloudflare免费版一个账号可以添加不限数量的域名,但免费版每个域名的WAF规则是独立的。如果你有10个站,每个站都要单独配5条规则,工作量不小。Cloudflare的API可以批量操作,但需要一定的脚本能力。或者直接用它的Terraform Provider,一个配置文件批量下发到所有域名。
四、雷池WAF——开源免费的应用层深度检测
Nginx和Cloudflare解决的是网络层和CDN层的防护,但有些采集器的行为伪装得非常好——UA正常、IP分散、频率不高,就是慢慢悠悠地把你全站内容全部拖走。这时候需要应用层的深度检测。
长亭科技的雷池(SafeLine)是目前社区口碑最好的开源WAF之一,社区版完全免费,Docker一键部署。它的反爬虫模块有几个独特能力:
| 能力 | 原理 | 对付什么类型的采集 |
|---|---|---|
| 动态JS挑战 | 注入动态加密JS,要求客户端计算后返回token | Python脚本、火车头、各类采集器 |
| 人机识别 | 分析鼠标轨迹、键盘事件、页面停留时间 | Headless浏览器采集 |
| 频率限制 | 按IP/UA/路径多维度的速率控制 | 代理池轮换的分布式采集 |
| 语义分析 | 分析请求序列模式,识别自动化行为特征 | 高级定制爬虫 |
雷池的部署方式是把WAF放在用户和源站之间做反向代理,流量先经过雷池检测,合法的才转发给后端。对源站零侵入,不需要改任何代码。
雷池的一个隐藏用法——污染采集数据
当你确认某个IP或IP段在采集你之后,不一定要直接封禁(封了它会换IP)。可以在雷池里配置:对这个IP段返回随机乱序的内容——把文章段落打乱、插入无意义字符、替换关键数据。采集器会把垃圾内容采回去,对方网站展示的就是一堆没法看的东西。这比单纯封IP有效得多,因为对方往往不会立刻发现内容有问题,等到发现的时候已经采了几千条了。
五、宝塔Nginx防火墙——最省事的单站/少量站方案
如果你用的是宝塔面板,直接装Nginx防火墙插件是最快的路径。虽然官方版收费(月付几十块),但第三方免费版(软件商店搜"Nginx免费防火墙")对个人站长和中小站点来说足够用了。

宝塔防火墙的核心优势是图形化管理——不用手写Nginx配置,不用SSH连服务器,直接在面板里点几下就能配好:
CC攻击防护
设置单IP在指定周期内的最大请求数,超出自动封禁。支持设置封禁时长(1分钟到永久),自动解封。
UA黑白名单
可视化管理UA规则,支持正则匹配。可以批量导入常见的采集器UA库,一键启用。
恶意IP封锁
自动同步恶意IP库,也支持手动添加。封锁记录一目了然,哪个IP被封、封了多久、因为什么被封。
防盗链
设置允许的Referer域名白名单,防止图片、视频、文件被外部直接引用消耗带宽。
宝塔方案的局限在于跨服务器管理。如果你多个站在同一台服务器上,宝塔防火墙可以统一管理;但如果分布在多台服务器上,就需要每台都装一遍,每台都单独配置。站点多了之后,维护成本会成倍上升。
六、四层防线怎么搭,看站点数量和预算
工具都介绍完了,具体怎么组合,取决于你管了多少个站、愿意花多少钱、有多少技术人手。
| 场景 | 推荐组合 | 月成本 | 防护效果 |
|---|---|---|---|
| 1-3个站,个人博客/小企业站 | 宝塔Nginx防火墙 + Nginx limit_req | 0元(用免费版) | ★★★★☆ |
| 3-10个站,有预算 | Cloudflare(免费版)+ 雷池WAF | 服务器费用(跑雷池Docker) | ★★★★★ |
| 10-30个站,需要批量管理 | Cloudflare(Pro/API批量)+ 雷池WAF + Nginx统一配置 | CF Pro $20/月 + 服务器 | ★★★★★ |
| 30个站以上 | 统一WAF集群 + 自动化运维脚本 + 集中日志分析 | 视规模而定 | ★★★★★ |
批量管理的核心思路:
不管是10个站还是100个站,防采集的配置逻辑是一样的——UA黑名单、频率限制、防盗链、蜘蛛白名单。区别在于手工改一个站的配置和批量下发到所有站。如果用的是UC建站系统这种统一管理平台,多站看板里可以直接看到每个站的异常流量告警,哪个站被采集了第一时间知道,不用每天翻日志。独立部署的架构也让每个站的防护配置互不影响——一个站被盯上了,其他站不会受牵连。
七、五个容易踩的坑,绕过去了才算真防住
工具配好了不代表万事大吉,有些坑踩过一次才知道有多难受。
| 坑 | 现象 | 怎么避免 |
|---|---|---|
| 误封搜索引擎蜘蛛 | 百度/Google抓取失败,收录暴跌 | 所有规则里把真蜘蛛IP白名单放在最前面 |
| 频率限制设太狠 | 正常用户打开多页面被503 | rate不要低于5r/s,burst留20-50的缓冲 |
| 五秒盾全局开启 | 移动端用户体验极差,跳出率飙升 | 只对可疑IP/UA触发,不要全局开 |
| 只封IP不分析日志 | 采集器换IP继续采,你一直在打地鼠 | 封IP之前先分析:哪个页面被采最多、什么时间段、什么UA |
| 多个站配置不一致 | 有的站防了有的没防,被采的那个拖垮整台服务器 | 用配置管理工具统一分发,或者用一个看板统一监控 |
还有一点很多人忽略:采集器和你的防护措施永远在猫鼠游戏。你今天封了Scrapy的UA,他明天换个requests库;你今天加了五秒盾,他后天换个带JS引擎的Playwright。所以防采集不是一次性配置完就完事了,要定期看日志、定期更新规则、定期调整策略。
一个实用的节奏:每周拉一次Nginx access.log的TOP20 IP和TOP20 UA,花5分钟扫一眼。你会发现有些IP慢慢在试探你的底线——先是一分钟几个请求,然后是十几个,然后是上百个。在它火力全开之前发现并封掉,比等它采了几万条再封,效果好一百倍。
说穿了,防采集这件事不复杂。日志看清谁在搞你→Nginx设好基本规则→CF/CDN挡住大批量→WAF做深度检测→统一管理所有站点。四层防线搭好,90%的采集器在第二层之前就倒下了。剩下的10%是高级货,它们会用代理池、会模拟真人行为、会慢慢磨——但那需要极高的成本,一个普通的内容站不值得对方投入这么多。所以大多数情况下,把基础的做好就足够了。
不过有一点别忘了:防采集的同时别把自己也防了。蜘蛛白名单、频率限制别太狠、五秒盾别乱开——每一条规则上线之前,先拿百度站长平台的抓取诊断跑一遍,确认没把真蜘蛛挡住,再把规则正式生效。
