Python 2.7 - 查找Web服务器命中数

时间:2015-04-03 06:33:14

标签: python

我正在尝试计算每台网络服务器的点击次数 日历月(12月,1月,2月,...)按年份。

我是Python的新手,所以我甚至不知道从哪里开始。我想你必须使用一些字符串拆分或正则表达式。

我获得了一个包含以下输出的日志文件:

[31/Dec/1994:23:55:08 -0700] "GET 45.html HTTP/1.0" 200 5489  
remote - - [31/Dec/1994:23:56:55 -0700] "GET 2195.ps HTTP/1.0" 200 522318 
remote - - [31/Dec/1994:23:59:37 -0700] "GET 957.ps HTTP/1.0" 200 122146 
remote - - [01/Jan/1995:00:31:54 -0700] "GET index.html HTTP/1.0" 200 2797 
remote - - [01/Jan/1995:00:31:58 -0700] "GET 2.gif HTTP/1.0" 200 2555
remote - - [01/Jan/1995:00:32:33 -0700] "GET 3.gif HTTP/1.0" 200 36403
remote - - [01/Jan/1995:01:39:21 -0700] "GET 20.html HTTP/1.0" 200 378
local - - [01/Jan/1995:01:47:41 -0700] "GET index.html HTTP/1.0" 200 2797
local - - [01/Jan/1995:01:47:49 -0700] "GET 39.html HTTP/1.0" 200 669
local - - 

1 个答案:

答案 0 :(得分:0)

分割比应用正则表达式更容易(IMO)。您可以通过传入日志行来使用以下函数提取这些值:

def year_month(s):
     try:
         discard, month, rest = s.split('/', 2)  # split twice on '/' 
     except ValueError:
         return None  # for last line without /
     year = rest.split(':', 1)[0]
     year = int(year)  # optional
     return year, month

您可以使用此函数返回的元组作为某些字典的键:

d = {}
for line in open('yourfile'):
    ym = year_month(line)
    if ym is None:
         continue
    x = d.setdefault(ym, [0])
    x[0] += 1
for ym in sorted(d):
    print('Year: {0}, Month: {1}, Hits: {2}'.format(ym[0], ym[1], d[ym][0]))

如果您想使用正则表达式,可以将year_month()部分替换为:

import re

# see https://docs.python.org/2/howto/regex.html
year_month_pattern = re.compile(r"""
.*/
(?P<month>.*)
/
(?P<year>\d*)
:.*
""", re.VERBOSE)

def year_month(s):
    res = year_month_pattern.match(s)
    if res is None:
        return None
    try:
        return int(res.group('year')), res.group('month')
    except ValueError:
        pass