Apache access_log是排查恶意爬虫最直接有效的原始数据源,需通过IP频次统计、时间窗口筛选、状态码与User-Agent分析、URL路径规律识别、UA/Referer组合校验及Java日志交叉验证等多维度快速定位异常行为。

Apache的access_log是排查恶意爬虫最直接、最有效的原始数据源之一,关键在于快速识别异常请求模式,而非逐行翻查。
识别高频访问特征
恶意爬虫通常表现为单位时间内对同一路径(尤其是敏感接口或目录)发起大量请求。可通过以下方式快速筛查:
- 用awk + sort + uniq统计IP访问频次:
awk '{print $1}' access_log | sort | uniq -c | sort -nr | head -20 - 结合时间窗口筛选(如最近1小时):
awk -v start="24/Jul/2024:14:" '$4 ~ start {print $1}' access_log | sort | uniq -c | sort -nr - 关注状态码为200但User-Agent为空、含“-”或明显伪造(如“python-requests”, “curl/7.68”)的请求
分析请求路径与参数异常
真实用户行为具有路径多样性与语义连贯性,爬虫则常暴露规律性痕迹:
- 大量请求含相似URL结构,如
/product?id=123、/product?id=124连续递增 - 频繁访问不存在资源(404)但仍持续尝试,例如反复扫
/admin.php、/wp-config.php - URL中携带可疑参数:如
?s=keyword(站内搜索暴力遍历)、?page=9999(分页探测) - 使用grep -E快速定位:
grep -E '\?page=[0-9]{4,}|\/wp-config\.php|\/admin\.php' access_log
关联User-Agent与Referer行为
单一字段不可靠,但组合分析可显著提升判断准确率:
立即学习“Java免费学习笔记(深入)”;
- 常见恶意UA如
Mozila/5.0 (compatible; BlekkoBot; ...)或极简UA(仅“-”或“-”+空格)需重点标记 - UA声称是Chrome但Referer为空,且请求头缺失Accept-Language、Accept-Encoding等常规字段,大概率是脚本伪造
- 同一IP在短时间内切换多个UA(如先用Firefox,再用Safari,再用curl),基本可判定为自动化工具
- 用awk提取并去重统计:
awk '{print $1,$12,$13}' access_log | sort | uniq -c | sort -nr | head -15
结合Java应用日志交叉验证
Apache日志只反映HTTP层,需联动Java后端日志确认是否造成实际影响:
- 将access_log中可疑IP和时间戳,匹配Spring Boot的application.log中对应时段的WARN/ERROR日志(如SQL注入尝试、参数校验失败)
- 若某IP在access_log中高频请求
/api/user/profile,而Java日志中同时出现大量MissingServletRequestParameterException,说明其在试探参数规则 - 通过Logback的%X{X-Forwarded-For}或Nginx透传的$remote_addr确保IP来源一致,避免代理干扰










