Python离线解析IP地址
创始人
2025-05-29 16:21:10
0

首先要介绍一家公司,总部位于波士顿和马萨诸塞州的 MaxMind 公司成立于2002年,在提供几何定位和在线欺诈工具方面处于领先地位,主要提供以下两项服务:

  • minFraud:帮助企业防止网上信用卡交易中的欺诈行为,通过其全面的欺诈检测系统,企业可以准确地检测并自动对欺诈性质的 “卡不在场交易” 进行标注。
  • GeoIP:可以按国家、地域位置甚至精确到城市,对企业用户和网站的访客进行精准实时的定位。

为啥要介绍这家公司呢?因为他们除了 GeoIP 这个付费服务,另外还提供可以 免费本地部署 的 GeoLite2 离线 数据库,可以让我们在不使用第三方接口的情况,解析 IP 地址的地理位置数据。

下载数据库

需要一个注册 MaxMind 账户才能下载 GeoLite2 免费地理位置数据文件。注册时除了 “邮箱” 需要认真填写(登录时使用 “邮箱” 作为账户名称)之外,其它可以随意,提交注册后 MaxMind 会给你的邮箱发一封邮件,需要点击邮件里的链接以完成注册。

登录后可以打开 GeoLite2 离线数据库下载页面 找到需要的数据库文件:

Database包含信息数据库格式
GeoLite2 ASN自治域 AS 或者运营商 ISPMaxMind DB 格式
GeoLite2 ASN: CSV FormatIP 地址所属的自治域 AS 或者运营商 ISPCSV 文件格式
GeoLite2 CityIP 地址所在的国家、地区、城市、经纬度和邮政编码等信息MaxMind DB 格式
GeoLite2 City: CSV FormatIP 地址所在的国家、地区、城市、经纬度和邮政编码等信息CSV 文件格式
GeoLite2 CountryIP 地址所在的国家和洲MaxMind DB 格式
GeoLite2 Country: CSV FormatIP 地址所在的国家和洲CSV 文件格式

两种数据库格式的差别:

  • CSV 文件格式:需要自己实现掩码解析和 ID 查询。
  • MaxMind DB 格式:借助 GeoIP2 库提供的方法,输入 IP 地址就可以进行本地 IP 信息查询。

下面的例子里,需要下载 GeoLite2 City 数据文件,因为它较其他两者而言,包含的信息更丰富。

安装 GeoIP2 库

使用下面的命令直接安装,或者到 PyPI geoip2 下载文件安装。

pip install geoip2

使用 GeoIP2 数据库

把下载好的 MaxMind DB 格式 数据库压缩文件解压到项目目录下面,并将数据库的文件路径配置到 geoip2.database.Reader 对象中,再向其传递我们要查询的 IP 地址,如果查询成功,变量 response 将会是一个 geoip2.models.City 类型的数据:

import geoip2.database# 这里只是演示,实际应用时,数据库 Reader 对象应该要重用, 因为它的创建成本很高
with geoip2.database.Reader('GeoLite2-City_20230314/GeoLite2-City.mmdb') as reader:response = reader.city('128.101.101.101')print(f'城市 = {response.city.names["zh-CN"]}')print(f'大洲 = {response.continent.names["zh-CN"]}')print(f'国家 = {response.country.names["zh-CN"]}')print('位置:')print(f'---- 精度半径 = {response.location.accuracy_radius}')print(f'---- 纬度 = {response.location.latitude}')print(f'---- 经度 = {response.location.longitude}')print(f'---- 时区 = {response.location.time_zone}')print(f'邮政编码 = {response.postal.code}')print(f'注册国家 = {response.registered_country.names["zh-CN"]}')print('地区细分:')for subdivision in response.subdivisions:print(f'.... {subdivision.names["zh-CN"]}')

执行上面的代码,会输出下面的内容:

城市 = 明尼阿波利斯
大洲 = 北美洲
国家 = 美国
位置:
---- 精度半径 = 10
---- 纬度 = 44.9402
---- 经度 = -93.2188
---- 时区 = America/Chicago
邮政编码 = 55406
注册国家 = 美国
地区细分:
.... 明尼苏达州

跑通之后可以全面的看一下 geoip2.models.City 类型的 response 变量中,包含哪些数据:

geoip2.models.City({'city': {'geoname_id': 5037649,'names': {'de': 'Minneapolis','en': 'Minneapolis','es': 'Mineápolis','fr': 'Minneapolis','ja': 'ミネアポリス','pt-BR': 'Minneapolis','ru': 'Миннеаполис','zh-CN': '明尼阿波利斯'}},'continent': {'code': 'NA','geoname_id': 6255149,'names': {'de': 'Nordamerika','en': 'North America','es': 'Norteamérica','fr': 'Amérique du Nord','ja': '北アメリカ','pt-BR': 'América do Norte','ru': 'Северная Америка','zh-CN': '北美洲'}},'country': {'geoname_id': 6252001,'iso_code': 'US','names': {'de': 'Vereinigte Staaten','en': 'United States','es': 'Estados Unidos','fr': 'États Unis','ja': 'アメリカ','pt-BR': 'EUA','ru': 'США','zh-CN': '美国'}},'location': {'accuracy_radius': 10,'latitude': 44.9402,'longitude': -93.2188,'metro_code': 613,'time_zone': 'America/Chicago'},'postal': {'code': '55406'},'registered_country': {'geoname_id': 6252001,'iso_code': 'US','names': {'de': 'Vereinigte Staaten','en': 'United States','es': 'Estados Unidos','fr': 'États Unis','ja': 'アメリカ','pt-BR': 'EUA','ru': 'США','zh-CN': '美国'}},'subdivisions': [{'geoname_id': 5037779,'iso_code': 'MN','names': {'en': 'Minnesota','es': 'Minnesota','fr': 'Minnesota','ja': 'ミネソタ州','pt-BR': 'Minesota','ru': 'Миннесота','zh-CN': '明尼苏达州'}}],'traits': {'ip_address': '128.101.101.101','prefix_len': 21}},['en'],
)

然后我们还可以利用返回的经纬度信息,去定位 IP 的相对地理位置:

在这里插入图片描述

如果遇到错误和异常,可以查看 官方客户端接口 文档。

更新 GeoIP2 数据库

由于 IP 信息的新增和修改申请每天都在进行,所以免费的 GeoLite2 离线数据库平均每月更新两次,为了保证 IP 查询的准确性,定期更新离线数据库是有必要的(虽然这并不能保证 IP 地址的信息 100% 准确,毕竟这中间有半个月左右的更新延迟)。

最简单但不长久的方式是 手动下载文件 来完成同步更新,所以建议使用 MaxMind 提供的 GeoIP 更新程序 进行自动更新,详情查看 更新 GeoIP 和 GeoLite 数据库 文档。

以 Windows 版本的 GeoIP 更新程序 为例,我们需要提前创建好 C:\ProgramData\MaxMind\GeoIPUpdate 目录,并把下载好的压缩包解压到这个目录下,并同时新建一个 GeoIP 目录:

在这里插入图片描述

然后打开 GeoIP.conf 文件,编辑一下自动更新相关的配置:

在这里插入图片描述

主要是三个配置:

  • AccountID

    • 在这里插入图片描述
  • LicenseKey

    • 在这里插入图片描述
  • EditionIDs GeoLite2-City GeoLite2-Country

    • 要更新的数据库版本 ID
    • 多个版本 ID 用空格分隔

编辑完成后保存 GeoIP.conf 文件,然后我们就可以运行 geoipupdate.exe 文件,它会执行一段时间,执行完成后,在 GeoIP 目录下,会出现它帮我们下载好的最新版本的数据库文件:

在这里插入图片描述

在 Windows 版本下,需要手动执行,而在 Linux 或 Unix 版本上则可以实现自动化更新过程,例如:每周运行两次,每次更新都会通过电子邮件将结果发送给您。具体的实现方式可以查看 运行 GeoIP 更新 文档。

相关内容

热门资讯

linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
C++ 机房预约系统(六):学... 8、 学生模块 8.1 学生子菜单、登录和注销 实现步骤: 在Student.cpp的...
JAVA多线程知识整理 Java多线程基础 线程的创建和启动 继承Thread类来创建并启动 自定义Thread类的子类&#...
【洛谷 P1090】[NOIP... [NOIP2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G ...
国民技术LPUART介绍 低功耗通用异步接收器(LPUART) 简介 低功耗通用异步收发器...
城乡供水一体化平台-助力乡村振... 城乡供水一体化管理系统建设方案 城乡供水一体化管理系统是运用云计算、大数据等信息化手段࿰...
程序的循环结构和random库...   第三个参数就是步长     引入文件时记得指明字符格式,否则读入不了 ...
中国版ChatGPT在哪些方面... 目录 一、中国巨大的市场需求 二、中国企业加速创新 三、中国的人工智能发展 四、企业愿景的推进 五、...
报名开启 | 共赴一场 Flu... 2023 年 1 月 25 日,Flutter Forward 大会在肯尼亚首都内罗毕...
汇编00-MASM 和 Vis... Qt源码解析 索引 汇编逆向--- MASM 和 Visual Studio入门 前提知识ÿ...
【简陋Web应用3】实现人脸比... 文章目录🍉 前情提要🌷 效果演示🥝 实现过程1. u...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
windows安装JDK步骤 一、 下载JDK安装包 下载地址:https://www.oracle.com/jav...
分治法实现合并排序(归并排序)... 🎊【数据结构与算法】专题正在持续更新中,各种数据结构的创建原理与运用✨...
在linux上安装配置node... 目录前言1,关于nodejs2,配置环境变量3,总结 前言...
Linux学习之端口、网络协议... 端口:设备与外界通讯交流的出口 网络协议:   网络协议是指计算机通信网...
Linux内核进程管理并发同步... 并发同步并发 是指在某一时间段内能够处理多个任务的能力,而 并行 是指同一时间能够处理...
opencv学习-HOG LO... 目录1. HOG(Histogram of Oriented Gradients,方向梯度直方图)1...
EEG微状态的功能意义 导读大脑的瞬时全局功能状态反映在其电场结构上。聚类分析方法一致地提取了四种头表面脑电场结构ÿ...
【Unity 手写PBR】Bu... 写在前面 前期积累: GAMES101作业7提高-实现微表面模型你需要了解的知识 【技...