首页 > 其他分享 >ip2location.py

ip2location.py

时间:2022-08-18 12:11:16浏览次数:45  
标签:plt ip py ip2location US APAC LATAM EU

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

相关文章

  • windows定时任务执行python爬虫
    有一些定时爬取的操作,适合用定时任务去执行。个人单独用的项目不适合放在工作所用的服务器上,也没必要单独买个服务器,我们windows电脑本身就有这项功能。接下来是一个wi......
  • Python第三方库arrow
    Python第三方库arrowhttps://pypi.org/project/arrow/简介处理时间日期的一个第三方库ArrowisaPythonlibrarythatoffersasensibleandhuman-friendly......
  • python数据处理基础
    1基础要素1.1数值1.1.1整数1.1.2浮点数 额外知识点tpye函数   1、可以对对象调用这个函数,用来获得这个对象的更多信息2、可以对python中所有......
  • 自动化脚本如何切换环境?Pytest这些功能你必须要掌握
     测试人员每天都跟不同的环境打交道,比如线上环境,测试环境,预上线环境等等,那么作为自动化测试人员写的代码,我们也要具备能自由切换环境的能力,那么今天小编就给大家聊一下,......
  • PYTHON错误——”赋值“ 和 ”拷贝“
    #关于自己写的代码有个逻辑没有问题,但是代码有问题的错误。本质上是关于“拷贝”和“赋值”的错误。#我想将每次大循环后x["x1"]的结果保存到a中。#即:a:[[0,1],[0......
  • python 中如何将列表中的数值转换为字符串
     001、>>>test1=["aaa",100,200]>>>test1['aaa',100,200]>>>test2=[str(k)forkintest1]##将列表test1中的数值转换为字符串>>>test2['aaa......
  • python 中统计不同scafflod的GC含量并输出GC含量最高的scafflod
     001、方法1root@PC1:/home/test#lsa.fastatest.pyroot@PC1:/home/test#cata.fasta##测试fasta文件>Rosalind_6404CCTG......
  • python 中输出字典中的键、值最小、最大的项
     001、输出最小、最大的键或者值>>>dict1={"c":800,"d":600,"a":900,"b":700}>>>dict1{'c':800,'d':600,'a':900,'b':700}>>>min(dict1)......
  • python中生成指定序列的反向互补序列
     001、方法1:root@PC1:/home/test#lstest.pyroot@PC1:/home/test#cattest.py##测试程序#!/usr/bin/pythonout_file=open("result.txt","w")......
  • Python学习
    常用快捷键ctrl+alt+s:打开软件设置ctrl+d:复制当前行代码shift+alt+上\下:将当前行代码上移或下移ctrl+shift+F10:运行当前代码文件shift+......