准备全球ip地址合集,大约12M,采用-cacheFile分发 ip.lib.txt数据格式大致如下:
0.0.0.0 0.255.255.255 NULL IANA保留地址 NULL 1.0.0.0 1.0.0.255 亚洲 亚太地区 NULL 1.0.1.0 1.0.1.255 亚洲 中国 福建 1.0.2.0 1.0.3.255 亚洲 中国 福建 1.0.4.0 1.0.7.255 大洋洲 澳大利亚 NULL 1.0.8.0 1.0.15.255 亚洲 中国 广东 1.0.16.0 1.0.31.255 亚洲 日本 NULL 1.0.32.0 1.0.63.255 亚洲 中国 广东输入数据cookie_ip.txt:
ECEE8FBBBB 113.224.76.226 ED38780B1D 106.36.217.145 120BB4FB44 113.109.42.83 9D4EC87B4B 219.153.212.31 AF0E43C785 111.77.229.40 4AAAEB560B 60.13.190.132 53BAABADD8 124.167.254.130第一步用lambda将ip地址转换成数字,enumerate把一个字符串按“.”分隔,返回拆分后的索引+拆分后的值得集合,[::1]是把集合倒序,然后遍历倒序后的集合,256**j*int(i),求256的j次方乘i,然后把求出来的值累加。
#!/usr/local/bin/python # coding = utf-8 import sys ip_convert = lambda x:sum([256**j*int(i) for j,i in enumerate(x.split(".")[::-1])]) def load_ip_lib_func(ip_lib_fd): ip_lib_list = [] file_ip = open(ip_lib_fd,"r") for line in file_ip: ss = line.strip().split(' ') if len(ss) !=5: continue start_ip = ss[0] end_ip = ss[1] area = ss[2] country = ss[3] province = ss[4] ip_lib_list.append((ip_convert(start_ip),ip_convert(end_ip),area,country,province)) return ip_lib_list def get_addr(ip_lib_list,ip_str): ip_num = ip_convert(ip_str) low = 0 middle = 0 high = len(ip_lib_list)- 1 while low < high: middle = (low+high)/2 sss = ip_lib_list[middle] start_ip = sss[0] province = sss[4].strip() if ip_num < start_ip: high = middle - 1 elif ip_num > start_ip: low = middle + 1 if ip_num < start_ip: province = ip_lib_list[middle-1][4] else: province = ip_lib_list[middle][4] return province def mapper_func(ip_lib_fd): ip_lib_list = load_ip_lib_func(ip_lib_fd) #file_in = open('cookie_ip.txt','r') for line in sys.stdin: ss = line.strip().split('\t') ip_str = ss[1] usr_addr = get_addr(ip_lib_list,ip_str) print "\t".join([ip_str,usr_addr]) if __name__ == "__main__": module = sys.modules[__name__] func = getattr(module, sys.argv[1]) args = None if len(sys.argv) > 1: args = sys.argv[2:] func(*args)