获取一个网站的uv两种方法:
1.正常的使用re的正则表达式
import re
import time #时间模块
start_time = time.time()
ip_re = r"(^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})" #匹配IP地址的正则表达式
file = r"F:\text\save\logs\access_log" #所需要的网站的日志
result = [] #用来存储所有的ip地址
data = [] # 用来存储去重之后的IP地址
with open(file,mode="r")as fobj:
for i in fobj:
result.append(re.findall(ip_re,i))
for i in result:
if i not in data:
data.append(i)
for i in data:
print("ip: %s ------> 次数:%s" %(str(i),result.count(i)))
stop_time = time.time()
print("运行时间:%0.5f"%(stop_time - start_time))
运行结果:
2.将正则表达式编译为对象
import re
import time
start=time.time()
file = r"F:\text\save\logs\access_log"
ip_list=[] #用来存储所有的IP地址
ip_count={} #用来存储IP地址和次数的对应关系的字典
ip_re = r"(^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})"
ip_re_obj=re.compile(ip_re) #将正则表达式编译为对象
with open(file,mode="r")as fobj:
for i in fobj:
result = ip_re_obj.search(i) #调用对象的search方法
if result:
client_ip = result.group()
ip_list.append(client_ip)
for i in ip_list: #遍历列表
if i in ip_count.keys():
ip_count[i] += 1
else:
ip_count[i] = 1
for i,j in ip_count.items(): #遍历字典
print("ip: %s ----> 次数:%s" %(i,j))
stop=time.time()
print("运行时间:%0.5f"%(stop - start))
运行结果:
由此可见两个不同的方法的运行时间的差别,访问的日志越大,两个的区别越大。当日志比较大时,推荐用第二种方法。