AI分析网站访问日志,自动识别爬虫来源
网站访问日志里混着真实用户和大量爬虫,人工翻看效率很低。
本文教你用AI自动分析访问日志,识别爬虫来源并生成可读报告,适合零基础运维和站长,照着做就能得到一份按爬虫类型、频率、来源IP分类的清单。
先确认日志格式和采集范围
Nginx默认的访问日志格式通常包含IP、时间、请求方法、URL、状态码和User-Agent。
先用命令看一眼日志长什么样:
tail -n 5 /var/log/nginx/access.log
如果日志被切割过,路径可能是/var/log/nginx/access.log-20250101。
确认日志里有User-Agent字段,这是识别爬虫的关键。
没有的话,需要在Nginx配置里加上$http_user_agent,然后重载Nginx:
nginx -t && systemctl reload nginx
准备一个工作目录,把要分析的日志复制进去,避免直接操作原日志:
mkdir -p /opt/log-ai && cp /var/log/nginx/access.log /opt/log-ai/
清洗日志并提取关键字段
AI接口不适合直接吞几百MB原始日志。
先用awk提取IP、时间、URL和User-Agent,输出成CSV或JSON行格式。
下面这条命令提取最近1000行并生成JSON行文件:
tail -n 1000 /opt/log-ai/access.log | awk '{print "{\"ip\":\""$1"\",\"time\":\""$4$5"\",\"url\":\""$7"\",\"ua\":\""$12"\"}"}' > /opt/log-ai/cleaned.jsonl
检查生成的文件是否正常:
head -n 3 /opt/log-ai/cleaned.jsonl
关键点: 如果User-Agent里包含空格,$12可能截断,建议改用$http_user_agent对应的完整字段,或者用Python脚本按正则提取,更稳妥。
调用AI接口做爬虫分类
这里以通用大模型API为例,其他厂商接口思路类似。
先安装Python依赖:
pip install openai
写一个脚本analyze_log.py,读取清洗后的日志,分批发送给AI,让它判断每条记录是正常用户、搜索引擎爬虫、恶意爬虫还是未知。
import json, openai
openai.api_key = "你的API_KEY"
openai.base_url = "https://api.openai.com/v1" # 按实际服务商修改
with open("/opt/log-ai/cleaned.jsonl") as f:
lines = f.readlines()[:50] # 先测试50条
prompt = """你是一个日志分析助手。对下面每条日志,判断类型:
- 正常用户
- 搜索引擎爬虫(Googlebot/Baiduspider等)
- 恶意爬虫(扫描器、采集器)
- 未知
只返回JSON数组,每项包含ip、type、reason。
日志:
""" + "".join(lines)
resp = openai.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": prompt}],
temperature=0
)
print(resp.choices[0].message.content)
运行脚本:
python3 /opt/log-ai/analyze_log.py
如果返回的是JSON数组,说明流程通了。注意: 不要一次发送全部日志,按50到100条分批,避免超token限制。
把AI结果落成可读报告
在脚本里把AI返回的JSON写入文件,并统计各类型数量:
import json
result = json.loads(resp.choices[0].message.content)
with open("/opt/log-ai/report.json", "w") as f:
json.dump(result, f, ensure_ascii=False, indent=2)
from collections import Counter
c = Counter(item["type"] for item in result)
print(c)
输出类似:Counter({'正常用户': 30, '搜索引擎爬虫': 12, '恶意爬虫': 8})。
这时你已经得到了一份可核验的爬虫来源统计。
常见报错和避坑提醒
- API返回超时或429:降低每批条数,或加
time.sleep(2)限速。 - User-Agent字段错位:用Python正则重新解析,不要硬编码
$12。 - AI误判:对标记为恶意爬虫的IP,人工抽查几条,确认不是误伤。
- 日志含敏感信息:清洗时去掉Cookie、Authorization头,避免泄露。
- 成本控制:先抽样分析,确认效果后再跑全量,不要一上来就分析整个月日志。
验证识别效果是否可用
拿一份已知包含Googlebot和扫描器的日志做测试,看AI是否能正确分类。
检查报告里“搜索引擎爬虫”的IP是否与官方IP段匹配,可以用whois或在线反查工具核对。
如果准确率能接受,再把脚本接入定时任务:
crontab -e
# 每天凌晨3点分析前一天的日志
0 3 * * * /usr/bin/python3 /opt/log-ai/analyze_log.py >> /opt/log-ai/cron.log 2>&1
运行几天后,对比报告中的爬虫趋势,如果恶意爬虫IP持续增加,可以考虑在Nginx层加deny规则或启用WAF。
几个容易卡住的疑问
日志量太大,AI接口费用会不会很高?
先抽样分析,比如每天只分析访问量最高的1000条,或只分析返回404和403的请求,成本可控。
没有编程基础能操作吗?
可以。把本文命令复制到服务器执行,脚本里的API_KEY换成自己的即可。遇到报错优先检查日志路径和字段位置。
AI识别结果可以直接用于封IP吗?
不建议直接自动封禁。先人工确认,再写Nginx规则,避免误封正常用户或搜索引擎爬虫。
除了Nginx日志,其他日志能用吗?
可以。Apache、Caddy或CDN回源日志,只要包含IP和User-Agent,清洗后同样能分析。
如果你正在处理网站访问日志里的爬虫识别问题,建议先按本文步骤跑通一条日志,再逐步扩大范围;
遇到异常时优先回看避坑部分。