用 Python 分析网站蜘蛛日志的完整方法。
学完这篇你能用 Python 读取网站访问日志,自动识别搜索引擎蜘蛛,统计它们的抓取频率、访问页面和错误情况,并生成一份可下载的 CSV 分析报告。
第一步:准备日志文件,得到可分析的原始数据
这一步要拿到网站真实访问日志,并确认它包含请求时间、IP、URL、状态码和 User-Agent。如果你用宝塔面板 Linux版 7.9,进入左侧菜单「网站」,点击目标站点名称,进入「日志」,在「访问日志 access.log」右侧点击「下载」;如果你用 Nginx,日志通常在 /var/log/nginx/access.log;如果你用 Apache,日志通常在 /var/log/apache2/access.log 或 /etc/httpd/logs/access_log。把文件下载到本地,例如命名为 access.log。
注意:日志格式可能是 combined 格式,也可能是自定义格式。如果缺少 User-Agent,就无法准确识别蜘蛛。
第二步:安装 Python 依赖,得到能解析日志的运行环境
这一步要安装 pandas 和 regex,用于处理表格和正则匹配。打开终端或命令行,进入你存放日志的目录,执行:
python -m pip install --upgrade pip
python -m pip install pandas regex
执行完成后,输入下面命令确认版本:
python -c "import pandas; print(pandas.__version__)"
如果能看到版本号,说明环境可用。
第三步:用 Python 读取日志,得到结构化表格
这一步要把文本日志转换成可统计的表格。新建文件 analyze_spider.py,粘贴以下代码:
import re
import pandas as pd
LOG_FILE = "access.log"
OUT_FILE = "spider_report.csv"
pattern = re.compile(
r'(?P<ip>\S+) - - \[(?P<time>[^\]]+)\] '
r'"(?P<method>\S+) (?P<url>\S+) (?P<proto>\S+)" '
r'(?P<status>\d+) (?P<size>\S+) '
r'"(?P<referer>[^"]*)" "(?P<user_agent>[^"]*)"'
)
rows = []
with open(LOG_FILE, "r", encoding="utf-8", errors="ignore") as f:
for line in f:
m = pattern.search(line)
if m:
rows.append(m.groupdict())
df = pd.DataFrame(rows)
df["time"] = pd.to_datetime(df["time"], format="%d/%b/%Y:%H:%M:%S %z", errors="coerce")
df["status"] = pd.to_numeric(df["status"], errors="coerce")
运行后,你会得到变量 df,里面每行是一条请求记录,包含 ip、time、url、status、user_agent 等字段。
注意:如果你的 Nginx 日志不是默认 combined 格式,需要修改
pattern。可以先打开access.log看前 3 行,确认字段顺序。
第四步:识别蜘蛛 User-Agent,得到蜘蛛访问记录
这一步要从 user_agent 中筛出搜索引擎蜘蛛。继续在同一脚本中加入:
spider_keywords = [
"Googlebot",
"Bingbot",
"Baiduspider",
"YandexBot",
"Sogou web spider",
"360Spider",
"Bytespider",
"Slurp",
"DuckDuckBot"
]
df["spider"] = "普通用户"
for keyword in spider_keywords:
mask = df["user_agent"].str.contains(keyword, case=False, na=False)
df.loc[mask, "spider"] = keyword
spider_df = df[df["spider"] != "普通用户"].copy()
执行完成后,spider_df 就是所有蜘蛛访问数据。你可以先打印前 10 行确认:
print(spider_df.head(10))
注意:有些蜘蛛会伪装成普通浏览器 UA。单靠关键词识别只能作为日志分析,不能当作严格反爬判断。
第五步:统计蜘蛛行为,得到关键指标
这一步要计算每个蜘蛛的抓取次数、访问页面、状态码分布和访问时间段。继续加入:
summary = (
spider_df.groupby("spider")
.agg(
请求次数=("url", "size"),
访问IP数=("ip", "nunique"),
访问页面数=("url", "nunique"),
最早时间=("time", "min"),
最晚时间=("time", "max")
)
.reset_index()
)
status = (
spider_df.groupby(["spider", "status"])
.size()
.reset_index(name="次数")
.sort_values(["spider", "次数"], ascending=[True, False])
)
top_pages = (
spider_df.groupby(["spider", "url"])
.size()
.reset_index(name="次数")
.sort_values("次数", ascending=False)
.head(100)
)
hourly = (
spider_df.assign(hour=spider_df["time"].dt.hour)
.groupby(["spider", "hour"])
.size()
.reset_index(name="次数")
.sort_values(["spider", "hour"])
)
运行后,你会得到四个统计表:summary 是总览,status 是状态码分布,top_pages 是热门页面,hourly 是按小时抓取分布。
第六步:导出 CSV 报告,得到可交给运营或 SEO 的文件
这一步要把结果保存成表格。继续加入:
with pd.ExcelWriter(OUT_FILE, engine="openpyxl") as writer:
summary.to_excel(writer, sheet_name="总览", index=False)
status.to_excel(writer, sheet_name="状态码", index=False)
top_pages.to_excel(writer, sheet_name="热门页面", index=False)
hourly.to_excel(writer, sheet_name="按小时", index=False)
如果你没有安装 openpyxl,先执行:
python -m pip install openpyxl
然后运行脚本:
python analyze_spider.py
完成后,当前目录会生成 spider_report.xlsx。你可以打开它,重点看三个问题:哪个蜘蛛请求最多、哪些页面返回 404 或 500、抓取是否集中在某几个时段。
注意:如果日志很大,比如超过 1GB,建议先用
grep或awk按天拆分,再逐文件分析,避免一次性读入内存。
小结
- 分析蜘蛛日志的核心字段是:时间、URL、状态码、User-Agent。
- Python 用正则读取日志,用 pandas 做统计,效率比人工看日志高很多。
- 识别蜘蛛主要靠 User-Agent 关键词,但要接受误判和伪装。
- 最有价值的指标是:请求次数、错误状态码、热门页面、按小时分布。
- 导出成 Excel 或 CSV 后,才能继续给 SEO、运维或开发排查问题。
原文链接:https://www.gj0.com/thread-1611.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。