网站防爬虫与反采集: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(免费套餐可用)

  1. 登录 Cloudflare Dashboard → Security → Bots
  2. 开启 Bot Fight Mode:自动识别并挑战已知的自动化爬虫流量
  3. 开启 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 的香港边缘节点,在离用户最近的地方拦截恶意爬虫流量,有效保护服务器资源和网站内容。

THE END