? ? 利用纯真库,可以方便地定位,这个功能用python3也不难实现,在实际数据中,可能还会遇到脏数据的情况,因此,还需要解决两个问题,一个是对ip地址合法性的判断,合规合法的ip地址字符串才能进行查询,另一个如果再遇到特殊情况,还要能够跳过,不影响程序继续进行。chunzhenDB.txt是纯真库数据文件
#coding=utf8 import socket import struct
#用于判断ip地址合法性
def is_ipv4(ip:str)->bool: ? ? return ([True]*4 == [(True) if (x.isdigit() and 0 <= int(x) <=255) else (False) for x in ip.split('.')])
def ip2long(ip): ? ? return struct.unpack('!I',socket.inet_aton(ip))[0]
def long2ip(longip): ? ? return socket.inet_ntoa(struct.pack('!I', longip))
class ChunzhenDB: ? ? quick_chunzhen={} ? ? chunzhen_dic={} ? ? ipList=[] ? ? def init(self): ? ? ? ? self.quick_chunzhen={} ? ? ? ? self.chunzhen_dic={} ? ? ? ? self.ipList=[]
? ? def loadChunzhenDB(self, filename='chunzhenDB.txt', encoding='utf8'): ? ? ? ? f = open(filename, 'r', encoding=encoding) ? ? ? ? lines = f.readlines() ? ? ? ? f.close() ? ? ? ? firstLine=True ? ? ? ? for line in lines: ? ? ? ? ? ? line=line.strip() ? ? ? ? ? ? if firstLine: ? ? ? ? ? ? ? ? firstLine=False ? ? ? ? ? ? ? ? continue ? ? ? ? ? ? start = line[:15].strip() ? ? ? ? ? ? self.chunzhen_dic[int(ip2long(start))] = line[32:].strip() ? ? ? ? self.ipList=list(self.chunzhen_dic.keys()) ? ? ? ? self.ipList.sort()
? ? def GetChunzhenInfo(self, ip): ? ? ? ? if ip in self.quick_chunzhen: ? ? ? ? ? ? return self.quick_chunzhen[ip] ? ? ? ? else: ? ? ? ? ? ? longip = ip2long(ip) ? ? ? ? ? ? x=0 ? ? ? ? ? ? y=len(self.chunzhen_dic)-1 ? ? ? ? ? ? while(x!=y-1): ? ? ? ? ? ? ? ? mid = int((x+y)/2) ? ? ? ? ? ? ? ? if self.ipList[mid]==longip: ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? elif self.ipList[mid]<longip: ? ? ? ? ? ? ? ? ? ? x=mid ? ? ? ? ? ? ? ? else: ? ? ? ? ? ? ? ? ? ? y=mid ? ? ? ? ? ? self.quick_chunzhen[ip]=self.chunzhen_dic[self.ipList[x]] ? ? ? ? ? ? return self.chunzhen_dic[self.ipList[x]]
chunzhendb = ChunzhenDB() chunzhendb.loadChunzhenDB() infile = open('./iplist_info.txt','r') lines = infile.readlines() for line in lines: ? ? ipstr = line.split(',')[1]#用于提取ip地址字符串,要根据实际情况进行调整 ? ? #print(is_ipv4(ipstr)) ? ? if is_ipv4(ipstr): ? ? ? ? try: ? ? ? ? ? ? #print(chunzhendb.GetChunzhenInfo(ipstr)) ? ? ? ? ? ? chunzheninfo = chunzhendb.GetChunzhenInfo(ipstr) ? ? ? ? ? ? line=line.replace(ipstr,ipstr+','+chunzheninfo) ? ? ? ? ? ? print(line,end='') ? ? ? ? except Exception:#跳过,让程序继续执行,不要退出 ? ? ? ? ? ? pass
|