import re
import geoip2.database
from tabulate import tabulate
from matplotlib import pyplot as plt
reader = geoip2.database.Reader('GeoLite2-Country.mmdb')
res = []
# 查询IP地址对应的物理地址
def ip_get_location(ip_address):
try:
response = reader.country(ip_address)
except:
Country_Code = 'Null'
else:
Country_Code = response.country.iso_code
res.append(Country_Code)
# 检验和处理ip地址
def seperate_ip(ip):
compile_ip=re.compile('^(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|[1-9])\.(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d)\.(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d)\.(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d)$')
if compile_ip.match(ip):
ip_get_location(ip)
else:
print(ip)
print('Wrong type of ip address!')
def get_counts(sequence):
counts = {}
for x in sequence:
if x in counts:
counts[x] += 1
else:
counts[x] = 1
return counts
logfile = ''
filepath = ''
suffix = ['apk','AppImage','deb','dmg','exe','msi','zip']
with open(logfile,'r') as file:
while True:
line = file.readline()
if line == '':
break
# 判断是否为下载
for x in suffix:
if line.find(filepath) != -1 and line.find(x) != -1 and line.find('blockmap') == -1:
# 过滤出源IP
ip = str(line.split()[0].strip())
# 解析IP位置
seperate_ip(ip)
Country_Map_Continent = {'AE': 'APAC', 'AF': 'EU', 'AU': 'APAC', 'AZ': 'APAC', 'BD': 'APAC', 'BH': 'APAC', 'BN': 'APAC', 'BT': 'APAC', 'CC': 'APAC', 'CK': 'APAC', 'CN': 'APAC', 'CX': 'APAC', 'FJ': 'APAC', 'FM': 'APAC', 'GE': 'APAC', 'GU': 'APAC', 'HK': 'APAC', 'ID': 'APAC', 'IL': 'APAC', 'IN': 'APAC', 'IO': 'APAC', 'IQ': 'APAC', 'IR': 'APAC', 'JO': 'APAC', 'JP': 'APAC', 'KG': 'APAC', 'KH': 'APAC', 'KI': 'APAC', 'KP': 'APAC', 'KR': 'APAC', 'KW': 'APAC', 'KZ': 'APAC', 'LA': 'APAC', 'LB': 'APAC', 'LK': 'APAC', 'MH': 'APAC', 'MM': 'APAC', 'MN': 'APAC', 'MO': 'APAC', 'MP': 'APAC', 'MV': 'APAC', 'MY': 'APAC', 'NC': 'APAC', 'NF': 'APAC', 'NP': 'APAC', 'NR': 'APAC', 'NU': 'APAC', 'NZ': 'APAC', 'OM': 'APAC', 'PF': 'APAC', 'PG': 'APAC', 'PH': 'APAC', 'PK': 'APAC', 'PN': 'APAC', 'PS': 'APAC', 'PW': 'APAC', 'QA': 'APAC', 'RU': 'APAC', 'SB': 'APAC', 'SG': 'APAC', 'SY': 'APAC', 'TH': 'APAC', 'TJ': 'APAC', 'TK': 'APAC', 'TL': 'APAC', 'TM': 'APAC', 'TO': 'APAC', 'TR': 'APAC', 'TV': 'APAC', 'TW': 'APAC', 'UM': 'APAC', 'UZ': 'APAC', 'VN': 'APAC', 'VU': 'APAC', 'WF': 'APAC', 'WS': 'APAC', 'YE': 'APAC', 'AG': 'US', 'AI': 'US', 'AW': 'US', 'BB': 'US', 'BL': 'US', 'BM': 'US', 'BQ': 'US', 'BS': 'US', 'BZ': 'US', 'CA': 'US', 'CR': 'US', 'CU': 'US', 'CW': 'US', 'DM': 'US', 'DO': 'US', 'GD': 'US', 'GL': 'US', 'GP': 'US', 'GT': 'US', 'HN': 'US', 'HT': 'US', 'JM': 'US', 'KN': 'US', 'KY': 'US', 'LC': 'US', 'MF': 'US', 'MQ': 'US', 'MS': 'US', 'MX': 'US', 'NI': 'US', 'PA': 'US', 'PM': 'US', 'PR': 'US', 'SV': 'US', 'SX': 'US', 'TC': 'US', 'TT': 'US', 'US': 'US', 'VC': 'US', 'VG': 'US', 'VI': 'US', 'AD': 'EU', 'AL': 'EU', 'AM': 'EU', 'AO': 'EU', 'AT': 'EU', 'AX': 'EU', 'BA': 'EU', 'BE': 'EU', 'BF': 'EU', 'BG': 'EU', 'BI': 'EU', 'BJ': 'EU', 'BW': 'EU', 'BY': 'EU', 'CD': 'EU', 'CF': 'EU', 'CG': 'EU', 'CH': 'EU', 'CI': 'EU', 'CM': 'EU', 'CV': 'EU', 'CY': 'EU', 'CZ': 'EU', 'DE': 'EU', 'DJ': 'EU', 'DK': 'EU', 'DZ': 'EU', 'EE': 'EU', 'EG': 'EU', 'EH': 'EU', 'ER': 'EU', 'ES': 'EU', 'ET': 'EU', 'FI': 'EU', 'FO': 'EU', 'FR': 'EU', 'GA': 'EU', 'GB': 'EU', 'GG': 'EU', 'GH': 'EU', 'GI': 'EU', 'GM': 'EU', 'GN': 'EU', 'GQ': 'EU', 'GR': 'EU', 'GW': 'EU', 'HR': 'EU', 'HU': 'EU', 'IE': 'EU', 'IM': 'EU', 'IS': 'EU', 'IT': 'EU', 'JE': 'EU', 'KE': 'EU', 'KM': 'EU', 'LI': 'EU', 'LR': 'EU', 'LS': 'EU', 'LT': 'EU', 'LU': 'EU', 'LV': 'EU', 'LY': 'EU', 'MA': 'EU', 'MC': 'EU', 'MD': 'EU', 'ME': 'EU', 'MG': 'EU', 'MK': 'EU', 'ML': 'EU', 'MR': 'EU', 'MT': 'EU', 'MU': 'EU', 'MW': 'EU', 'MZ': 'EU', 'NE': 'EU', 'NG': 'EU', 'NL': 'EU', 'NO': 'EU', 'PL': 'EU', 'PT': 'EU', 'RE': 'EU', 'RO': 'EU', 'RS': 'EU', 'RW': 'EU', 'SA':'APAC','SC': 'EU', 'SD': 'EU', 'SE': 'EU', 'SH': 'EU', 'SI': 'EU', 'SJ': 'EU', 'SK': 'EU', 'SL': 'EU', 'SM': 'EU', 'SN': 'EU', 'SO': 'EU', 'SS': 'EU', 'ST': 'EU', 'SZ': 'EU', 'TD': 'EU', 'TG': 'EU', 'TN': 'EU', 'TZ': 'EU', 'UA': 'EU', 'UG': 'EU', 'VA': 'EU', 'YT': 'EU', 'ZA': 'EU', 'ZM': 'EU', 'ZW': 'EU', 'AQ': 'LATAM', 'AR': 'LATAM', 'BO': 'LATAM', 'BR': 'LATAM', 'BV': 'LATAM', 'CL': 'LATAM', 'CO': 'LATAM', 'EC': 'LATAM', 'FK': 'LATAM', 'GF': 'LATAM', 'GS': 'LATAM', 'GY': 'LATAM', 'HM': 'LATAM', 'PE': 'LATAM', 'PY': 'LATAM', 'SR': 'LATAM', 'TF': 'LATAM', 'UY': 'LATAM', 'VE': 'LATAM','XK':'APAC'}
ret = [Country_Map_Continent[i] if i in Country_Map_Continent else i for i in res]
d = get_counts(ret)
l = []
for k,v in d.items():
l.append([k,v])
#print(tabulate(l, headers=["区域","下载量 "]))
f = open('result','w+')
print(tabulate(l, headers=["区域","下载量 "]),file = f)
f.close()
# 画一张饼图
#调节图形大小,宽,高
plt.figure(figsize=(6,9))
#定义饼状图的标签,标签是列表
labels = [u'亚太地区',u'北美地区',u'欧非洲地区',u'拉美地区']
#每个标签占多大,会自动去算百分比
sizes = [d['APAC'],d['US'],d['EU'],d['LATAM']]
colors = ['r','g','b','y']
#将某部分爆炸出来, 使用括号,将第一块分割出来,数值的大小是分割出来的与其他两块的间隙
#explode = (0.05,0,0,0)
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
patches,l_text,p_text = plt.pie(sizes,labels=labels,colors=colors,
labeldistance = 1.1,autopct = '%3.1f%%',shadow = False,
startangle = 90,pctdistance = 0.6)
#labeldistance,文本的位置离远点有多远,1.1指1.1倍半径的位置
#autopct,圆里面的文本格式,%3.1f%%表示小数有三位,整数有一位的浮点数
#shadow,饼是否有阴影
#startangle,起始角度,0,表示从0开始逆时针转,为第一块。一般选择从90度开始比较好看
#pctdistance,百分比的text离圆心的距离
#patches, l_texts, p_texts,为了得到饼图的返回值,p_texts饼图内部文本的,l_texts饼图外label的文本
#改变文本的大小
#方法是把每一个text遍历。调用set_size方法设置它的属性
for t in l_text:
t.set_size=(30)
for t in p_text:
t.set_size=(20)
# 设置x,y轴刻度一致,这样饼图才能是圆的
plt.axis('equal')
plt.legend()
plt.savefig('pieChart.jpg')
#plt.show()
标签:plt,ip,py,ip2location,US,APAC,LATAM,EU
From: https://www.cnblogs.com/dewan/p/16598242.html