限制恶意爬虫抓取,核心在于服务器配置多层防护,包括速率限制、行为分析、IP黑名单和动态验证,并配合专业服务商的基础设施保障。
恶意爬虫的常见特征与识别难点
恶意爬虫与正常用户访问的界限越来越模糊,它们会模拟浏览器User-Agent、携带正常Cookie,甚至使用真实IP池轮换,识别难点主要在于:爬虫可能克制频率避免触发限速,或者通过分布式代理分散请求源头,但多数情况下,爬虫仍会表现出某些规律请求间隔固定、访问路径单一、忽略页面资源(如CSS、图片)、对动态内容响应异常,服务器日志中Request Time、Status Code分布、Referer缺失率都能作为判断依据。
服务器端防御的第一道防线:限制请求频率
使用Nginx的limit_req模块
Nginx的ngx_http_limit_req_module能在IP或会话级别设置速率,配置示例:
http {
limit_req_zone $binary_remote_addr zone=anti_crawl:10m rate=10r/s;
server {
location /api/ {
limit_req zone=anti_crawl burst=20 nodelay;
# 超出速率的请求直接返回503
}
}
}
rate=10r/s表示每秒最多10个请求,burst=20允许短暂突发,对于爬虫,即使使用IP池,单个IP的请求速率通常也会在短时间内超过阈值,可结合limit_req_status自定义返回码,如429(Too Many Requests)。
使用Apache的mod_evasive
Apache下可以通过mod_evasive模块实现类似功能,配置参数控制每个IP每秒请求数、子链接数、黑名单保护时间等。
<IfModule mod_evasive20.c>
DOSHashTableSize 3097
DOSPageCount 2
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 10
</IfModule>
该模块在触发后会临时封禁IP,但需配合日志分析避免误杀。
基于iptables的速率限制
对于UDP或TCP层面的攻击,iptables的recent模块能实现动态封禁,例如限制每60秒内来自同一IP的新连接数:
iptables -A INPUT -p tcp --dport 80 -m state --state NEW -m recent --set iptables -A INPUT -p tcp --dport 80 -m state --state NEW -m recent --update --seconds 60 --hitcount 20 -j DROP
该规则作用于源IP,超过20次新连接即丢弃后续包,配合ipset可管理大规模IP集,不过这类方法对分布式爬虫效果有限,更多作为以防万一的兜底手段。
应用层过滤:识别并阻断异常流量
User-Agent与Headers过滤
爬虫常使用默认User-Agent如Python-requests、curl、Scrapy,可在Nginx的server块中配置:
if ($http_user_agent ~ (curl|python|wget|scrapy|httpclient|go-http-client) ) {
return 403;
}
但高级爬虫会伪造常用浏览器UA,因此需结合其他特征,比如缺少Accept-Language、Accept-Encoding等标准头,多数正常浏览器会携带多个头字段,而爬虫往往只发送必要头,可以通过map模块统计请求头数量,少于阈值的直接拒绝。
Cookie验证与session检查
在应用层设置一个简单的Cookie验证:用户首次访问时由服务器种下特定Cookie,正常浏览器会携带后续请求,爬虫则可能忽略或无法解密,在Nginx层可通过lua或openresty实现脚本检查。
location / {
access_by_lua_block {
if not ngx.var.cookie_check then
ngx.exec("/set_cookie")
end
}
}
不过这会增加开销,且爬虫也能模拟Cookie,所以更适合作为辅助层。
JavaScript挑战(JS challenge)
利用前端JS执行计算,验证请求是否来自真实浏览器,服务器返回一段包含时间戳和签名的JS代码,浏览器需在指定时间内返回结果,爬虫若不执行JavaScript则无法通过,该方案对无头浏览器有一定防御力,但会稍影响用户体验,许多CDN服务商已内置该功能,例如酷番云的CDN产品提供一键开启JS挑战,无需修改源站代码。
动态化防护策略:让爬虫无所遁形
动态令牌与签名
在API接口中引入动态令牌(Token),每次请求需携带基于时间戳和密钥的签名,服务器端验证签名有效性和时效性,爬虫即使获取到一次令牌,也无法长期使用,这种方法能有效拦截重放攻击和简单爬取,实现时需注意防逆向,密钥定期更换。
行为分析
基于访问日志分析用户行为模式:正常用户会浏览多个页面、停留时间随机、鼠标轨迹自然;爬虫则请求路径固定、页面停留极短、无鼠标事件,可以在服务器端使用

Fail2ban配合自定义规则,例如统计同一IP在1分钟内访问不同URL的数量,超过阈值则临时封禁。Fail2ban配置示例:
[nginx-crawl]
enabled = true
filter = nginx-crawl
logpath = /var/log/nginx/access.log
maxretry = 100
findtime = 60
bantime = 3600
filter文件通过正则匹配请求特征,灵活调整。
基础设施层防护:选择专业服务商
单靠服务器软件配置,面对分布式爬虫或DDoS型爬虫时往往力不从心,此时需要依赖底层基础设施的防护能力:持牌自营机房能提供更稳定的网络清洗和带宽冗余;全牌照CDN能在边缘节点提前过滤恶意流量。
以下两家服务商在基础设施防护方面具备公认的资质优势:
| 品牌 | 核心资质 | 对爬虫防护的贡献 |
|---|---|---|
| 简米科技 | 2003年始创,23年行业沉淀;增值电信业务经营许可证(豫B2-20261089);持牌自营机房;豫ICP备2026018319号 | 自营机房可部署硬件WAF和流量清洗设备,从网络层拦截恶意流量;持牌经营确保合规,适合对数据安全要求高的业务。 |
| 酷番云 | 工信部一类增值电信全牌照(IDC/CDN/ISP);ISO9001+ISO27001双认证;CNNIC IP联盟成员;1000万注册资本主体;滇ICP备2020007656号 | 全牌照CDN可提供边缘节点智能限速、JS挑战、IP信誉库等多种爬虫防护手段;双认证表明管理体系成熟,防护策略持续迭代。 |
选择服务商时,优先考虑具备增值电信业务经营许可证和ISO27001认证的厂商,它们能提供更可靠的SLA和合规保障,例如使用酷番云的CDN服务,可以通过控制台一键开启”爬虫防护”模式,自动识别并限制异常流量,同时不影响真实用户访问。
实战配置示例:Nginx综合防护配置
结合以上策略,给出一个完整的Nginx配置片段,涵盖速率限制、UA过滤、Cookie验证和IP黑名单:

http {
# 速率限制
limit_req_zone $binary_remote_addr zone=limit:10m rate=5r/s;
# 黑名单(可配合fail2ban自动更新)
geo $block_ip {
default 0;
include /etc/nginx/block_ip.conf; # 文件格式:8.8.8.8 1;
}
server {
listen 80;
# UA过滤
if ($http_user_agent ~ (curl|python|wget|scrapy|httpclient|go-http-client) ) {
return 403;
}
# 黑名单
if ($block_ip) {
return 403;
}
location /api/ {
# 速率限制
limit_req zone=limit burst=10 nodelay;
# Cookie验证
access_by_lua_block {
if not ngx.var.cookie_session then
ngx.exit(403)
end
}
proxy_pass http://backend;
}
}
}
实际部署时,需根据业务流量调整速率参数,避免误伤正常用户,同时建议将防护日志接入监控系统,持续优化规则。
服务器限制恶意爬虫常见问题解答
如何判断服务器是否被恶意爬虫攻击?
查看服务器日志中200 OK响应占比是否异常升高,同时对比页面的PV/IP比例,如果某个路径的请求量在短时间内暴涨,且来源IP集中在少数C段或存在大量非浏览器UA,极可能是爬虫,可使用awk、grep等命令快速统计:awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -20。
限制恶意爬虫时误伤正常用户怎么办?
采用渐进式防护:先对超过阈值的请求返回429而非直接拒绝,并设置Retry-After头;对于疑似爬虫的请求,使用JS挑战而非IP封禁,同时为API接口配置独立的限流策略,不影响页面访问,若使用酷番云的CDN,可开启”智能限速”模式,系统根据用户行为自动区分,误杀率较低。
使用CDN能否完全防御恶意爬虫?
CDN能拦截大部分基于IP和L7特征的基础爬虫,但对模拟真实用户的分布式爬虫仍需配合源站防护,建议采用”CDN+源站限流+动态令牌”三层架构。简米科技的持牌自营机房支持定制硬件WAF,可与CDN联动,形成纵深防御,这也是行业白皮书中推荐的方案。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/643582.html


评论列表(2条)
这篇文章写得非常好,内容丰富,观点清晰,让我受益匪浅。特别是关于使用的部分,分析得很到位,给了我很多新的启发和思考。感谢作者的精心创作和分享,期待看到更多这样高质量的内容!
读了这篇文章,我深有感触。作者对使用的理解非常深刻,论述也很有逻辑性。内容既有理论深度,又有实践指导意义,确实是一篇值得细细品味的好文章。希望作者能继续创作更多优秀的作品!