python 通过ip获取城市_使用python根据ip获取目标地理位置信息

这是一个Python脚本,使用geoip2库从GeoLite2-City.mmdb数据库查询IP地址以获取其对应的城市、国家代码、省份等地理位置信息。脚本包含了ip_get_location函数,用于解析IP并打印相关信息,以及seperate_ip函数,用于处理单个IP或IP范围。
摘要由CSDN通过智能技术生成

1 #! /usr/bin/env python

2 #-*- coding:utf-8 -*-

3

4 '''

5 Created on 2019年12月8日6

7 @author: Admin8 '''

9

10 from copy importcopy11 importoptparse12 importre13

14 importgeoip2.database15

16

17 reader = geoip2.database.Reader('GeoLite2-City.mmdb')18

19 #查询IP地址对应的物理地址

20 defip_get_location(ip_address):21 #载入指定IP相关数据

22 response =reader.city(ip_address)23

24 #读取国家代码

25 Country_IsoCode =response.country.iso_code26 #读取国家名称

27 Country_Name =response.country.name28 #读取国家名称(中文显示)

29 Country_NameCN = response.country.names['zh-CN']30 #读取州(国外)/省(国内)名称

31 Country_SpecificName =response.subdivisions.most_specific.name32 #读取州(国外)/省(国内)代码

33 Country_SpecificIsoCode =response.subdivisions.most_specific.iso_code34 #读取城市名称

35 City_Name =response.city.name36 #读取邮政编码

37 City_PostalCode =response.postal.code38 #获取纬度

39 Location_Latitude =response.location.latitude40 #获取经度

41 Location_Longitude =response.location.longitude42

43 if(Country_IsoCode ==None):44 Country_IsoCode = "None"

45 if(Country_Name ==None):46 Country_Name = "None"

47 if(Country_NameCN ==None):48 Country_NameCN = "None"

49 if(Country_SpecificName ==None):50 Country_SpecificName = "None"

51 if(Country_SpecificIsoCode ==None):52 Country_SpecificIsoCode = "None"

53 if(City_Name ==None):54 City_Name = "None"

55 if(City_PostalCode ==None):56 City_PostalCode = "None"

57 if(Location_Latitude ==None):58 Location_Latitude = "None"

59 if(Location_Longitude ==None):60 Location_Longitude = "None"

61

62 print('================Start===================')63 print('[*] Target:' + ip_address + 'GeoLite2-Located')64 print(u'[+] 国家编码:' +Country_IsoCode)65 print(u'[+] 国家名称:' +Country_Name)66 print(u'[+] 国家中文名称:' +Country_NameCN)67 print(u'[+] 省份或州名称:' +Country_SpecificName)68 print(u'[+] 省份或州编码:' +Country_SpecificIsoCode)69 print(u'[+] 城市名称 :' +City_Name)70 print(u'[+] 城市邮编 :' +City_PostalCode)71 print(u'[+] 纬度:' +str(Location_Latitude))72 print(u'[+] 经度 :' +str(Location_Longitude))73 print('===============End======================')74

75 #检验和处理ip地址

76 defseperate_ip(ip_address):77 ip_match = r"^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|0?[0-9]?[1-9]|0?[1-9]0)\.)(?:(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){2}(?:25[0-4]|2[0-4][0-9]|1[0-9][0-9]|0?[0-9]?[1-9]|0?[1-9]0)$"

78 ip_match_list = r"^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|0?[0-9]?[1-9]|0?[1-9]0)\.)(?:(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){2}(?:25[0-4]|2[0-4][0-9]|1[0-9][0-9]|0?[0-9]?[1-9])-(?:25[0-4]|2[0-4][0-9]|1[0-9][0-9]|0?[0-9]?[1-9]|0?[1-9]0)$"

79

80 ifre.match(ip_match, ip_address):81 try:82 ip_get_location(ip_address)83 exceptException as e:84 printe85 elifre.match(ip_match_list, ip_address):86 ip_start = ip_address.split('-')[0].split('.')[3]87 ip_end = ip_address.split('-')[1]88 #如果ip地址范围一样,则直接执行

89 if(ip_start ==ip_end):90 try:91 seperate_ip(ip_address.split('-')[0])92 exceptException as e:93 printe94 elif ip_start >ip_end:95 print 'the value of ip, that you input, has been wrong! try again!'

96 exit(0)97 else:98 ip_num_list = ip_address.split('-')[0].split('.')99 ip_num_list.pop()100 for ip_last in range(int(ip_start), int(ip_end)+1):101 ip_add = '.'.join(ip_num_list)+'.'+str(ip_last)102 try:103 ip_get_location(ip_add)104 exceptException as e:105 printe106 else:107 print 'Wrong type of ip address!'

108 print '100.8.11.58 100.8.11.58-100 alike!'

109

110 #主方法数体

111 defmain():112 parser = optparse.OptionParser('Usage%prog -i -I \n \n{ Egg: python getIpLocation.py -i(I) 100.8.11.58(100.8.11.58-100) }')113 parser.add_option('-i', dest='SIp',type='string', help='specify pcap filename')114 parser.add_option('-I', dest='MIp',type='string', help='specify pcap filename')115 (options, args) =parser.parse_args()116 if options.SIp == None and options.MIp ==None:117 print(parser.usage)118 exit(0)119 ip_address =options.SIp120 ip_address_multi =options.MIp121 if ip_address==None:122 seperate_ip(ip_address_multi)123 else:124 seperate_ip(ip_address)125

126 if __name__ == '__main__':127 main()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值