【Python3】利用geoip2实现IP定位(离线版)

初步构想:

    通过IP地址来获取定位信息,并通过Python可视化界面显示出来。

准备工作:

    如果没有tkinter,请安装pip install tkinter

    安装geoip2模块(pip install geoip2)

    下载离线IP解析数据库GeoLite2 City,放在你的项目根目录。

    https://dev.maxmind.com/geoip/geoip2/geolite2/(注意MaxMind DB格式)

  代码实现:

#! python3
# @Project:  pythondemo - LocateFromIP.py
# @Info   :  根据IP定位(离线版),并用tkinter创建GUI界面
# 文档:https://geoip2.readthedocs.io/en/latest/#database-example

import tkinter.messagebox,geoip2.database,re

class FindLocation(object):
    def __init__(self):
        # 加载数据库(官网上免费数据库),数据库文件在根目录
        self.reader = geoip2.database.Reader('.\GeoLite2-City.mmdb')
        # 创建主窗口,即为根窗口
        self.root = tkinter.Tk(className='全球定位IP位置(离线版)')
        # 创建一个输入框并设置尺寸
        self.input_ip = tkinter.Entry(self.root,width=30)
        # 创建一个回显列表
        self.display_info = tkinter.Listbox(self.root,width=50)
        # 创建一个查询结果按钮
        self.rs_btn = tkinter.Button(self.root,command=self.find_position,text='查询')

    # UI布局
    def gui_arrange(self):
        self.input_ip.pack()
        self.display_info.pack()
        self.rs_btn.pack()

    def find_position(self):
        input = self.input_ip.get()

        # 利用正则检验
        if re.search(r'\d{1,3}.\d{1,3}.\d{1,3}',input) == None:
            tkinter.messagebox.showerror('出错了','非有效IP地址',parent=self.root)
            return

        try:
            data = self.reader.city(input)
            city = data.city.name
            country = data.country.name
            postal_code = data.postal.code           # 邮编
            longitude = data.location.longitude      # 经度
            latitude = data.location.latitude        # 纬度
        except geoip2.errors.AddressNotFoundError:
            tkinter.messagebox.showerror('出错了','此IP不在数据库中',parent=self.root)
            return
        except RuntimeError as e:
            tkinter.messagebox.showerror('出错了', Exception,parent=self.root)
            return

        # 创建回显列表
        info = ['城市:'+str(city),'国家:'+str(country),'邮编:'+str(postal_code),'经度:'+str(longitude),'纬度:'+str(latitude)]
        # 清空回显列表,类似于clear
        for i in range(10):
            self.display_info.insert(0,'')
        # 为回显列表赋值
        for i in range(len(info)):
            self.display_info.insert(i,info[i])


if __name__ == '__main__':
    fl = FindLocation()
    fl.gui_arrange()
    tkinter.mainloop()



实现效果:

【Python3】利用geoip2实现IP定位(离线版)_第1张图片

你可能感兴趣的:(Python)