使用 Pandas 分析网站访问日志
来源:互联网 发布:傲剑洞箫升级数据大全 编辑:程序博客网 时间:2024/05/16 04:47
通过一个例子向大家演示如何运用 Pandas 来进行 Apache 访问日志分析。本文内容其实也是原作者对 Pandas 库的一次尝试。
1、载入并解析数据
在解析网站日志时需要用到 apachelog 模块 ,因此我们首先需要了解一下 Apache 配置中的日志相关格式,这里并不打算在这方面详细展开,如果你对此感兴趣的话,可以详细查阅一下 官方提供的格式描述。在此,我们对 Apache 配置格式进行一个简单的说明,其中的所有元素可以被归纳为下述语句:
format = r’%V %h %l %u %t \”%r\” %>s %b \”%i\” \”%{User-Agent}i\” %T’
其中,各个符号组合具体含义如下(详情可见这里):
%V - 由 UseCanonicalName 设置的服务器名称
%h - 远程主机(即客户端IP)
%l - 由 identd 决定的用户身份(这并不常用因为不可靠)
%u - 通过 HTTP 认证决定的用户名
%t - 服务器完成处理请求的次数
%r - 客户端请求行(”GET / HTTP/1.0”)
%>s - 从服务器发送到客户端的状态代码 (200, 404 等)
%b - 对客户端的响应的大小(以字节为单位)
\”%i\” - 引用对应的URL
User-agent - 浏览器的标识字符串
%T - Apache 请求时间
%matplotlib inlineimport sysimport apachelog
设置格式:
fformat = r'%V %h %l %u %t\"%r\"%>s %b \"%i\" \"%{User-Agent}i\" %T'
创建解析器:
p = apachelog.parser(fformat)
示例字符串:
koldunov.net 85.26.235.202 - - [16/Mar/2013:00:19:43 +0400] “GET /?p=364 HTTP/1.0” 200 65237 “http://koldunov.net/?p=364” “Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11” 0
sample_string = 'koldunov.net 85.26.235.202\- -[16/Mar/2013:00:19:43 +0400] \"GET /?p=364 HTTP/1.0" \200 65237 "http://koldunov.net/?p=364" \"Mozilla/5.0 (Windows NT 5.1) \AppleWebKit/537.11 (KHTML, like Gecko) \Chrome/23.0.1271.64 Safari/537.11" 0'
data = p.parse(sample_string)
data
看来我们的解析器工作正常,那么接下来就让我们载入更多的真实数据吧(示例文件下载地址:地址1 地址2):
log = open('access_log_for_pandas').readlines()
对目标文件的每一行进行解析,并将它保存为一个由很多字典构成的列表:
log_list = []for line in log: try: data = p.parse(line) except: sys.stderr.write("Unable to parse %s" % line) data['%t'] = data['%t'][1:12]+' '+data['%t'][13:21]+' '+data['%t'][22:27] log_list.append(data)
需要注意的是,在这个案例中我们需要对时间的格式进行稍微地调整,否则 Pandas 无法对其进行正确解析。
2、数据框构建与调整
经过上述步骤,我们得到了一个由字典构成的列表,接下来我们将它转化为数据框:
import pandas as pdimport numpy as npfrom pandas import Series, DataFrame, Panel
df = DataFrame(log_list)
如下便是我们得到的数据框,看一下这个数据框的前两行:
df[0:2]
并不需要在分析中用到数据中的所有字段,所以接下来删除其中用不到的列:
del df['%T']; del df['%V']; del df['%i']; del df['%l']; del df['%u']; del df['%{User-Agent}i']
并且修改剩下列的列名,使其更加容易被人理解:
df = df.rename(columns={'%>s': 'Status', '%b':'b', '%h':'IP', '%r':'Request', '%t': 'Time'})
现在我们再来看一下这个数据框的前五行,已然清晰干净许多:
df.head()
接下来我们需要先将时间列 Time 转换为 datetime 格式并且为其加上序号(下面我们要调用的 pop 函数将删掉原始的 Time 列):
df.index = pd.to_datetime(df.pop('Time'))
变量 Status 应该为一个字符串型的数据,我们来对其进行转换:
df['Status'] = df['Status'].astype('int')
变量 b 这一列中有时候会出现字符串 ‘-’ ,所以在处理这一列的时候我们不能用 astype:
df['b'][93]
‘-‘
我们可以自己构建一个函数,来将所有的横杠都转换为 NaN,只留下浮点数,并将其单位由字节转换为兆字节:
def dash2nan(x): if x == '-': x = np.nan else: x = float(x)/1048576. return x
df['b'] = df['b'].apply(dash2nan)
肯定有人能够用一些更酷炫的方式来实现上文中的格式调整 :)
以上是数据载入和预处理的过程,原文较长,先搬运到这里,后续还有 流量分析、服务器状态分析等可视化过程,有时间继续分享,感兴趣的同学也可以直接去 数析学院 查看 原文,在 pandas 基础进阶课程包
- 使用 Pandas 分析网站访问日志
- 使用 Pandas 分析 Apache 日志
- 使用pandas进行SEO日志分析
- 分析网站原始访问日志
- 学会分析网站原始访问日志
- 使用Hadoop分析网站日志
- python+pandas分析nginx日志
- Windows下使用awstats6.5来分析Tomcat5.x的网站访问日志
- 使用 awstats 分析 Nginx 的访问日志
- 使用 awstats 分析 Nginx 的访问日志
- 使用 awstats 分析 Nginx 的访问日志
- 使用webalizer分析nginx 访问日志
- 使用AWStats分析Nginx的访问日志
- 使用awstat分析Nginx的访问日志
- 使用AWStats做IIS网站日志分析
- 使用LogParser分析IIS网站日志
- Awk使用及网站日志分析
- 网站运维工具使用iis日志分析工具分析iis日志(iis日志的配置)
- Android异步消息处理机制完全解析,带你从源码的角度彻底理解
- iOS 判断输入框内容是否是数字,并可以时时判断输入内容是否符合金额形势
- 虚拟机中使用host-only方式连接外网
- Hive扩展功能(一)--Parquet
- UITextView 设置行间距
- 使用 Pandas 分析网站访问日志
- 13个人围成一圈,链表,谭浩强那个答案有点问题,仔细看我的
- sudo指令
- cloudbase-init 自动扩盘的副作用
- 自动适配Label高度
- 2017-AspNet-MVC4-技术教学-备课总目录
- 《阿里巴巴Java开发手册(正式版)》--异常日志
- Bootstrap流式网格系统如何使用及注意事项
- Trafodion Troubleshooting-server handle not available