结论先放这儿:中小网站防采集,性价比最高的做法不是买商业反爬服务,而是「Nginx 限流 + UA/IP 黑名单 + 蜜罐陷阱 + 动态签名链接 + 关键数据字体混淆」这套组合拳,全部用免费开源组件实现,月成本 0~100 元,能挡掉 90% 以上的通用爬虫。
Nginx 层面怎么做基础限流和拦截?
结论:Nginx 的 limit_req 和 limit_conn 是零成本防线,配置 10 行就能拦下大部分无脑采集。在 nginx.conf 的 http 块里定义限流区:
limit_req_zone $binary_remote_addr zone=req:10m rate=10r/s;
limit_conn_zone $binary_remote_addr zone=conn:10m;
map $http_user_agent $bad_ua {
default 0;
"" 1;
~*python-requests 1;
~*scrapy 1;
~*curl 1;
~*wget 1;
~*Go-http-client 1;
~*okhttp 1;
}
然后在 server 块里生效:
if ($bad_ua) { return 403; }
limit_req zone=req burst=20 nodelay;
limit_conn conn 10;
含义解释:rate=10r/s 表示单 IP 每秒最多 10 个请求,burst=20 允许突发 20 个,超出直接返回 503;limit_conn 10 限制单 IP 并发连接数。正常用户浏览详情页不会触发,采集器一路 requests.get 循环就会被打回。注意 if 指令放在 server 层安全,放进 location 里有已知陷阱,UA 判断建议统一用 map。
怎么用日志找出正在采集你的 IP?
结论:不用买任何分析工具,一条 awk 命令就能定位异常 IP。执行:
awk '{print $1}' /www/wwwlogs/access.log | sort | uniq -c | sort -rn | head -20
输出前 20 个请求量最大的 IP。判断标准写实一点:单个 IP 在 1 小时内请求超过 3000 次、访问路径集中在 /article/1 到 /article/9999 这类连续 ID、日志里几乎没有 .css/.js/.jpg 请求,基本可以判定为采集器。把结果写进 Nginx 黑名单:
deny 47.98.0.0/16; # 云厂商 IDC 段
阿里云、腾讯云、AWS 的机房 IP 段可以整段限速而非全封——正常用户也可能用云服务器代理,但整段 limit_req 调低到 1r/s 影响很小。
内容侧怎么提高采集成本?
结论:让每个页面 URL 带上 5 分钟过期的签名,采集器复制的链接很快就失效。具体做法是页面里的详情链接不写死 /article/123,而写成 /article/123?ts=1735689600&sign=ab12cd,其中 sign = HMAC-SHA256(secret, path + ts)。服务端校验时间戳与当前时间差不超过 300 秒,超时返回 403。
第二招是字体反爬:把价格、电话、下载量这类关键数字用自定义字体渲染,<span> 里存的是乱码 Unicode,比如显示「¥199」但源码是 。采集方拿到的是无意义字符,要还原必须逆向字体文件——成本陡增。这套方案猫眼、大众点评都在用。
第三招是蜜罐链接:在页面里塞一个 <a href="/trap-9f3a" style="display:none">,正常用户用鼠标点不到,只有解析 HTML 的爬虫会跟进。命中一次就把该 IP 写入封禁列表 24 小时。
有没有现成的免费工具可以直接用?
结论:有三类免费方案可以省掉自研成本。Cloudflare 免费计划就能开启 Bot Fight Mode 和 Under Attack Mode(5 秒盾),前者自动挑战可疑 JS 请求,后者在被打时一键开启;国内服务器用 Cloudflare 需要域名 NS 接入且会走海外节点,考虑访问速度要权衡。开源 WAF 里,雷池(SafeLine)社区版免费,Docker 一条命令部署,自带 CC 防护和 IP 封禁;宝塔面板的 Nginx 防火墙免费版也提供 UA 黑名单和频率限制的可视化配置。
需要注意一点:所有基于 UA 和 IP 的规则都能被伪造绕过,User-Agent: Mozilla/5.0 加代理池就能突破。所以防线要分层——限流拦量、签名拦爬、字体混淆拦数据价值,三层叠起来才有效。
总结:小网站防采集的优先级是「先限流止血,再日志定位,然后上签名和字体反爬,最后用免费 WAF 兜底」。单靠任何一层都防不住,但四层组合起来,采集成本会高到多数人放弃。