网站访问日志分析,识别恶意爬虫IP段:网站访问日志分析
网站访问日志分析是服务器运维中排查异常流量的基础工作。
如果你发现网站响应变慢、带宽跑满,或者后台出现大量异常请求,通常意味着有恶意爬虫在抓取内容。
本文面向零基础用户,从日志格式确认开始,逐步讲解如何通过命令行统计高频IP、筛选异常User-Agent,最终定位并封禁恶意爬虫IP段。
确认日志文件位置与格式
开始分析前,先找到Nginx或Apache的访问日志路径。
默认情况下,宝塔面板的Nginx日志在 /www/wwwlogs/ 目录下,以站点域名命名的 .log 文件就是访问日志。
如果你使用的是原生Nginx,通常在 /var/log/nginx/access.log。
用 tail 命令查看最后几行,确认日志格式:
tail -n 5 /www/wwwlogs/你的域名.log
典型的Nginx默认格式如下,第一段是访客IP,后面依次是时间、请求方法、URL、状态码和User-Agent:
192.168.1.100 - - [10/Oct/2023:14:22:01 +0800] "GET /article/123 HTTP/1.1" 200 3456 "-" "Mozilla/5.0 ..."
如果日志格式不同,后续的 awk 字段编号需要相应调整。默认格式下,IP在第1列,User-Agent在第12列(包含空格时可能需要特殊处理)。
统计高频访问IP并排序
恶意爬虫最明显的特征是短时间内产生大量请求。
用下面这条命令统计访问量最高的前20个IP:
awk '{print $1}' /www/wwwlogs/你的域名.log | sort | uniq -c | sort -nr | head -20
输出结果类似:
4523 203.0.113.45
3210 198.51.100.22
890 192.0.2.10
正常访客的IP访问量通常是个位数或几十次,如果某个IP出现几千次,基本可以判定为爬虫。此时不要急着封禁,先结合请求的URL和User-Agent进一步确认。
结合User-Agent识别伪装爬虫
有些爬虫会伪造User-Agent,但大多数低成本爬虫会暴露特征。
统计访问量最高的User-Agent:
awk -F'"' '{print $6}' /www/wwwlogs/你的域名.log | sort | uniq -c | sort -nr | head -20
常见恶意爬虫的User-Agent包括 python-requests、Scrapy、Go-http-client、curl 等。
如果某个IP的请求全部来自这些User-Agent,且请求频率极高,就可以确认是恶意爬虫。
另一种情况是爬虫完全不发送User-Agent,或者发送空值。
这时可以用 grep 筛选:
grep -E '""$|"-"' /www/wwwlogs/你的域名.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -10
通过宝塔面板或防火墙封禁IP段
确认恶意IP后,如果它们来自同一个C段(例如 203.0.113.0/24),可以直接封禁整个IP段,避免逐个添加。
宝塔面板操作路径: 登录宝塔后台 → 安全 → IP规则 → 添加IP段黑名单,输入 203.0.113.0/24,备注写“恶意爬虫”,然后保存。
如果你习惯用命令行,在CentOS 7/8上可以使用 firewall-cmd:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.0/24" reject'
firewall-cmd --reload
在Ubuntu/Debian上,使用 ufw 更简单:
ufw deny from 203.0.113.0/24
如果服务器前端有CDN或WAF,建议优先在CDN控制台配置IP黑名单,这样拦截更彻底,也不消耗源站资源。
验证封禁效果与持续监控
封禁后,用以下命令实时观察日志,确认恶意IP不再出现:
tail -f /www/wwwlogs/你的域名.log | awk '{print $1}'
如果之前的高频IP消失了,说明封禁生效。
但恶意爬虫可能会更换IP继续抓取,因此建议定期执行高频IP统计命令,或者配置日志分析工具(如GoAccess)做自动化监控。
避坑提醒: 不要直接封禁大范围IP段(如 /16),容易误伤正常用户;
封禁前先确认该IP段没有你的真实访客。
另外,部分搜索引擎的官方爬虫(如百度蜘蛛、Googlebot)也可能产生高频请求,但它们的User-Agent包含 Baiduspider 或 Googlebot,可以通过反向DNS验证真伪,不要误封。
常见问题
问:日志文件太大,awk 命令执行很慢怎么办?
可以先用 split 命令按天切割日志,或者只分析最近一天的日志:awk '{print $1}' /www/wwwlogs/你的域名.log | tail -10000 | sort | uniq -c | sort -nr | head -20。
问:封禁IP后网站被CDN回源IP影响怎么办?
如果使用了CDN,源站日志里的IP是CDN节点IP,不是真实访客IP。此时需要查看Nginx的 X-Forwarded-For 头,或者在CDN控制台配置IP黑名单。
问:如何区分恶意爬虫和正常搜索引擎蜘蛛?
正常搜索引擎蜘蛛的User-Agent包含明确标识(如 Baiduspider、Googlebot),且请求频率相对稳定。你可以用 host 命令反向解析IP,验证是否属于搜索引擎官方IP段。
问:有没有自动化工具推荐?
GoAccess可以实时分析日志并生成HTML报告,安装后运行 goaccess /www/wwwlogs/你的域名.log --log-format=COMBINED -o report.html 即可。对于零基础用户,宝塔面板的“网站监控报表”插件也提供了可视化流量统计。
完成以上步骤后,你应该已经能够独立完成一次网站访问日志分析,并识别出恶意爬虫IP段。
建议每周检查一次日志,把封禁规则整理成脚本,后续维护会轻松很多。