Skip to main content
 首页 » 编程设计

python之Apache日志文件数据分析与python pandas

2025年05月04日47lyhabc

我的问题有点难以解释。我正在分析一个 Apache 日志文件,以下是其中的一行。

112.135.128.20 - [13/May/2013:23:55:04 +0530] "GET /SVRClientWeb/ActionController HTTP/1.1" 302 2 "https://www.example.com/sample" "Mozilla/5.0 (iPhone; CPU iPhone OS 6_1_3 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10B329" GET /SVRClientWeb/ActionController - HTTP/1.1 www.example.com 

我的代码中的一些部分:

df = df.rename(columns={'%>s': 'Status', '%b':'Bytes Returned',  
                        '%h':'IP', '%l':'Username', '%r': 'Request', '%t': 'Time', '%u': 'Userid', '%{Referer}i': 'Referer', '%{User-Agent}i': 'Agent'}) 
df.index = pd.to_datetime(df.pop('Time')) 
test = df.groupby(['IP', 'Agent']).size() 
test.sort() 
print test[-20:] 

我将日志文件读取到数据框,并获得以下输出以及命中计数和用户代理。

IP               Agent                                                                                                  
74.86.158.106    Mozilla/5.0+(compatible; UptimeRobot/2.0; http://www.uptimerobot.com/)                                     369 
203.81.107.103   Mozilla/5.0 (Windows NT 6.1; rv:21.0) Gecko/20100101 Firefox/21.0                                          388 
173.199.120.155  Mozilla/5.0 (compatible; AhrefsBot/4.0; +http://ahrefs.com/robot/)                                         417 
124.43.84.242    Mozilla/5.0 (Windows NT 6.2) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31      448 
112.135.196.223  Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36      454 
124.43.155.138   Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0                                   461 
124.43.104.198   Mozilla/5.0 (Windows NT 5.1; rv:21.0) Gecko/20100101 Firefox/21.0                                          467 

然后我想得到

  1. 最高的 3 个命中计数(它们的 IP)并找出它们出现的频率?(比如每次命中发生之间的时间差 知识产权)
  2. 如何判断同一个IP是否有不同的代理?

至少请解释一下如何解决上述问题?

请您参考如下方法:

要完成第一部分,您只需对 DataFrame 进行排序(按计数)并取前三行:

In [11]: df.sort('Count', ascending=False).head(3) 
Out[11]: 
                IP                                              Agent  Count 
6   124.43.104.198  Mozilla/5.0 (Windows NT 5.1; rv:21.0) Gecko/20...    467 
5   124.43.155.138  Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) G...    461 
4  112.135.196.223  Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.3...    454 

要测试单个 IP 是否有多个行(代理),您可以使用 groupby:

In [12]: g = df.groupby('IP') 
 
In [13]: repeated = g.count().Count != 1 
 
In [14]: repeated 
Out[14]: 
IP 
112.135.196.223    False 
124.43.104.198     False 
124.43.155.138     False 
124.43.84.242      False 
173.199.120.155    False 
203.81.107.103     False 
74.86.158.106      False 
Name: Count, dtype: bool 
 
In [15]: repeated[repeated] 
Out[15]: Series([], dtype: bool) 

这个例子中没有。

为了避免对整个 DataFrame 进行排序, 使用 heapq 可能会更有效率(更新:不是) (我不认为 pandas 中有 nlargest):

In [21]: from heapq import nlargest 
 
In [22]: top_3 = nlargest(3, df.iterrows(), key=lambda x: x[1]['Count']) 
 
In [23]: pd.DataFrame.from_items(top_3).T 
Out[23]: 
                IP                                              Agent Count 
6   124.43.104.198  Mozilla/5.0 (Windows NT 5.1; rv:21.0) Gecko/20...   467 
5   124.43.155.138  Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) G...   461 
4  112.135.196.223  Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.3...   454