核心是“日志解析→特征筛选→ip提取→封禁执行”四步闭环,用python或bash脚本实现:解析access.log,按短时请求量、404占比、敏感路径、异常ua等特征识别可疑ip,写入黑名单并重载服务,辅以日志记录与解封机制。

用脚本自动识别并封禁异常高频爬虫 IP,核心是“日志解析 → 特征筛选 → IP提取 → 封禁执行”四步闭环。不依赖复杂平台,纯 Python 或 Bash 即可落地,关键是把规则写准、阈值设合理、执行够轻量。
一、从 access_log 提取可疑 IP 的关键特征
高频爬虫在日志里有明显痕迹,优先筛这几类行为:
- 单 IP 短时请求密集:例如 5 分钟内超过 150 次请求(正常用户极少连续刷)
-
大量 404 + 非常规路径:如反复访问
/phpmyadmin/、/wp-admin/、/.git/config -
空 Referer + 异常 UA:UA 含
python-requests、scrapy、headlesschrome或为空("-") -
固定路径规律性访问:如
/product/1001→/product/1002→ …… 这类递增或枚举型请求
二、Python 脚本快速实现识别与封禁
写一个 ban_crawler.py,每天定时运行即可。示例逻辑如下:
- 读取最近 1 小时的
/var/log/httpd/access_log(可用tail -n 10000管道输入,避免全量扫描) - 用正则匹配每行:IP(
$1)、时间($4)、状态码($9)、路径($7)、UA($12) - 按 IP 分组统计:总请求数、404 数、含敏感词路径数、异常 UA 出现次数
- 满足任一条件即标记为可疑:
• 总请求数 > 200
• 404 数 > 80 且含phpmyadmin|wp-login
• UA 包含scrapy|python-requests且无 Referer - 将 IP 写入
/etc/httpd/conf.d/blacklist.conf,格式为:Deny from 192.168.1.100 - 最后执行
systemctl reload httpd生效
三、Bash 方案:轻量、免依赖、适合定时任务
若服务器没装 Python 或想更简单,直接用 shell 脚本:
- 查最近 10 分钟高频 IP:
awk -v t="$(date -d '10 minutes ago' '+%d/%b/%Y:%H:%M')" '$4 ~ t {print $1}' /var/log/httpd/access_log | sort | uniq -c | awk '$1 > 120 {print $2}' - 结合 UA 过滤:
awk '$12 ~ /scrapy|python-requests/ && $11 == "\"-\"" {print $1}' /var/log/httpd/access_log | sort | uniq -c | awk '$1 > 10 {print $2}' - 输出结果追加到
/etc/httpd/conf.d/blacklist.conf,再重载服务
四、封禁后要做的事
封 IP 不是终点,而是运维闭环的开始:
-
记录封禁日志:把 IP、触发规则、时间写入
/var/log/httpd/ban.log,方便回溯 - 设置解封机制:比如 24 小时后自动清理黑名单文件中过期条目(用时间戳标记)
-
避免误伤:先用
mod_rewrite返回 403,观察半天再加入Deny from;或配合mod_evasive先限速再拦截 -
定期清理配置:防止
blacklist.conf膨胀过大影响 Apache 启动速度











