网站防爬虫与反采集:Nginx + Cloudflare规则实战配置指南
网站内容被竞争对手批量采集是很多独立站、内容平台、电商网站的痛点。恶意爬虫不仅侵占知识产权,还会消耗大量服务器带宽和计算资源,导致正常用户访问变慢。本文从服务器层(Nginx)到 CDN 层(Cloudflare)提供多层次的反爬虫实战配置方案。
一、识别恶意爬虫的特征
在配置防御规则之前,先了解恶意爬虫的典型特征,有助于制定更精准的过滤策略:
- 请求频率异常高:单个 IP 每秒发出数十到数百次请求,远超正常浏览行为
- User-Agent 异常:使用明显的爬虫标识(如
python-requests、scrapy、curl)或伪造成浏览器但行为模式与真实浏览器不符 - 访问路径规律性强:按顺序访问所有产品页或文章页,没有随机性
- 不加载 JS/CSS 等静态资源:只请求 HTML 页面,不请求图片、样式表
- 不设置 Referer 或 Cookie:直接请求深层页面,没有正常的浏览导航路径
- IP 来自数据中心段:大量来自 AWS、GCP、Azure 等云服务 IP 段的请求
二、Nginx 层防爬虫配置
1. 请求频率限制(限速)
在 /etc/nginx/nginx.conf 的 http 块中添加限速区域定义:
http {
# 按 IP 定义限速区域,每个 IP 最多 10 个请求/秒
limit_req_zone $binary_remote_addr zone=general:10m rate=10r/s;
# 针对搜索/API 接口更严格的限速
limit_req_zone $binary_remote_addr zone=api:10m rate=2r/s;
# 并发连接数限制
limit_conn_zone $binary_remote_addr zone=addr:10m;
}在站点配置的 server 块中应用限速规则:
server {
# 全站限速:允许瞬间突发20个请求,超过后按 10r/s 限速
limit_req zone=general burst=20 nodelay;
limit_conn addr 20;
# 对爬虫常访问的路径单独加严
location ~* \.(json|xml)$ {
limit_req zone=api burst=5 nodelay;
}
# 返回 429 而非默认的 503(语义更准确)
limit_req_status 429;
limit_conn_status 429;
}2. 过滤已知恶意 User-Agent
# 在 /etc/nginx/conf.d/block_bots.conf 中创建黑名单
map $http_user_agent $block_ua {
default 0;
# 常见爬虫工具特征
~*scrapy 1;
~*python-requests 1;
~*Go-http-client 1;
~*libwww-perl 1;
~*wget 1;
~*nikto 1;
~*sqlmap 1;
~*masscan 1;
~*zgrab 1;
# 空 User-Agent(正常浏览器不会发空 UA)
"" 1;
}在站点配置中引用:
server {
# 引入 UA 黑名单
if ($block_ua) {
return 403;
}
}3. 限制单 IP 并发连接数
# 限制单个 IP 最多同时保持 10 个连接
limit_conn addr 10;4. 封禁数据中心 IP 段(针对云服务爬虫)
# 使用 GeoIP2 模块(需要额外安装)封禁特定 ASN
# 或者直接在 Nginx 中封禁已知的爬虫 IP 段
# 示例(实际部署时使用真实的云服务 IP 段)
deny 1.2.3.0/24;
deny 5.6.7.0/24;5. robots.txt 规范声明
虽然恶意爬虫不遵守 robots.txt,但合规爬虫(如 Google、Bing)会遵守。正确配置可保护核心页面不被过度抓取:
# /var/www/html/robots.txt
User-agent: *
Disallow: /admin/
Disallow: /checkout/
Disallow: /account/
Disallow: /cart/
Disallow: /api/
# 允许 Google 抓取
User-agent: Googlebot
Allow: /
# Sitemap 位置
Sitemap: https://yourdomain.com/sitemap.xml三、Cloudflare 层防爬虫配置(效果更强)
Cloudflare 在 CDN 边缘层拦截爬虫,比 Nginx 更早,不消耗源站资源。
1. 开启 Bot Fight Mode(免费套餐可用)
- 登录 Cloudflare Dashboard → Security → Bots
- 开启 Bot Fight Mode:自动识别并挑战已知的自动化爬虫流量
- 开启 Block AI Scrapers and Crawlers:阻止 AI 训练数据采集爬虫(2024 年新增)
2. 创建自定义防火墙规则(WAF Rules)
进入 Security → WAF → Custom Rules → Create Rule:
规则一:封禁空 User-Agent
表达式:(http.user_agent eq "")
操作:Block规则二:封禁已知爬虫 UA
表达式:(http.user_agent contains "python-requests") or
(http.user_agent contains "scrapy") or
(http.user_agent contains "Go-http-client") or
(http.user_agent contains "libwww-perl")
操作:Block规则三:高频请求触发 JS 挑战
表达式:(http.request.uri.path contains "/products") and
(cf.threat_score gt 10)
操作:Managed Challenge(JS 挑战,真实浏览器可通过,爬虫无法通过)规则四:保护 API 端点
表达式:(http.request.uri.path contains "/api/") and
(not cf.client.bot)
操作:Rate Limit(每分钟超过 60 次请求则封禁)3. Cloudflare Rate Limiting(Pro 套餐,更精细控制)
进入 Security → WAF → Rate Limiting Rules → Create:
- 匹配条件:来自同一 IP,针对
/products/*路径,60 秒内超过 100 次请求 - 操作:Block 1 小时
4. Turnstile 验证码(替代传统 CAPTCHA)
对于登录页、注册页、价格查询等高价值页面,在 Cloudflare 中配置 Turnstile(Cloudflare 自研的无感知人机验证):
<!-- 在前端表单中嵌入 Turnstile -->
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
<div class="cf-turnstile" data-sitekey="你的SiteKey"></div>Turnstile 对真实用户几乎是无感知的(不需要勾选或识别图片),而自动化爬虫无法通过 JS 挑战。
四、蜜罐(Honeypot)陷阱:识别并记录爬虫
蜜罐是一种主动发现爬虫的技术:在页面中放置对真实用户不可见(通过 CSS 隐藏)但爬虫会访问的链接,一旦有请求访问这些链接,即可确认是爬虫行为。
<!-- 在 HTML 中加入隐藏链接(真实用户看不到,爬虫会跟随链接) -->
<a href="/honeypot-trap" style="display:none" aria-hidden="true"></a># Nginx 中处理蜜罐请求:记录并封禁访问者 IP
location /honeypot-trap {
access_log /var/log/nginx/honeypot.log; # 记录爬虫 IP
return 403;
}结合 Fail2ban 自动封禁访问蜜罐的 IP:
# /etc/fail2ban/filter.d/nginx-honeypot.conf
[Definition]
failregex = ^ .* "GET /honeypot-trap
# /etc/fail2ban/jail.local 中添加:
[nginx-honeypot]
enabled = true
filter = nginx-honeypot
logpath = /var/log/nginx/honeypot.log
maxretry = 1
bantime = 86400 # 封禁24小时 五、内容层保护:增加采集成本
除了技术封禁,还可以通过提高采集成本来降低被采集的价值:
- 关键内容延迟加载:价格、联系方式等关键信息通过 AJAX 动态加载,静态 HTML 中不包含,简单爬虫无法获取
- 图片文字化保护:电话号码、邮箱等信息用图片而非文本显示(会影响 SEO,权衡使用)
- 水印版权声明:在文章和图片中嵌入版权水印,被采集后仍能追溯来源
- 内容唯一化:为不同请求返回略有差异的内容(如添加随机不可见字符),便于追踪采集来源
六、保护 Google 爬虫不受影响
反爬虫配置最重要的原则是:不要误伤合法的搜索引擎爬虫,否则会严重损害 SEO。
# Nginx 中为 Googlebot 开白名单(通过 UA 识别)
map $http_user_agent $is_search_bot {
default 0;
~*Googlebot 1;
~*Bingbot 1;
~*Slurp 1; # Yahoo
~*DuckDuckBot 1;
}
server {
# 搜索引擎爬虫跳过限速
limit_req zone=general burst=20 nodelay;
# 如果是搜索引擎,跳过所有限制
if ($is_search_bot) {
set $block_ua 0;
}
}在 Cloudflare 的防火墙规则中,同样需要为 Verified Bots(已验证的合法爬虫)添加例外。
总结
有效的反爬虫体系需要多层防御,单一手段容易被绕过:
- 🔧 Nginx 层:限速、UA 过滤——成本低,效果对简单爬虫好
- ☁️ Cloudflare 层:Bot Fight Mode、WAF 规则——在 CDN 边缘拦截,不消耗源站资源
- 🍯 蜜罐:主动识别并记录爬虫 IP
- 📄 内容保护:动态加载关键信息、水印版权——提高采集成本
部署在后浪云香港云服务器上的网站,可以配合 Cloudflare 的香港边缘节点,在离用户最近的地方拦截恶意爬虫流量,有效保护服务器资源和网站内容。
