用博客的访问日志来练习了下Python的文件读取、正则表达式以及列表:
import fileinput
import re
from collections import Counter
import pandas as pd
file_path = r'日志存放路径'
file_path2 = r'保存分析结果的excel表存放路径'
# 从日志中提取ip地址
ip_lists = []
for line in fileinput.input(file_path):
#通过正则表达式逐行提取ip地址
ip = re.match(r'(\d){1,3}\.(\d){1,3}\.(\d){1,3}\.(\d){1,3}', line).group()
# 提取访问时间的正则表达式: time = re.search('(?<=\[)(.*?)(?=])', rest).group()
ip_lists.append(ip)
# 访问次数前100位,生成的列表格式为[(ip, 次数), ..., (ip, 次数)]
top_100 = Counter(ip_lists).most_common(100)
# 利用上一步生成的前100访问记录的ip地址和访问次数分别生成列表。
ips = []
visit_times = []
for element in top_100:
ips.append(element[0])
visit_times.append(element[1])
"""
更新,之前用的方法如上,但是一直记得有另外的方法生成ips和visit_times列表,
当时想不起来,新的方法如下:ips, visit_times = zip(*top_100)
"""
# 将生成的列表导出为Excel表
df = pd.DataFrame(data=zip(ips, visit_times), columns=['ip', '访问次数'])
df.to_excel(excel_writer=file_path2)
打印df的结果如下:
from pprint import pprint
pprint(df)
ip 访问次数
0 20.188.62.14 863703
1 120.25.226.167 78964
2 20.203.240.227 18591
3 20.121.13.154 13968
4 159.75.134.110 9756
.. ... ...
95 150.158.47.78 3182
96 150.158.135.88 3182
97 150.158.133.157 3182
98 150.158.136.41 3182
99 150.158.93.27 3182
[100 rows x 2 columns]