当前位置: 首页 > news >正文

Python IP解析器 ip2region使用

说明:最近需要在python项目内使用IP定位所在城市的需求,没有采用向外部ISP服务商API请求获取信息的方案,则翻了翻,在搞Java时很多的方案,在Python端反而可选择范围很小。

# 示例查询
ips = ["106.38.188.214", "203.93.215.16", "106.38.188.100", 
"221.130.191.216", "47.98.14.174"]

一:geoip2 定位五个IP效果


二:ip2region 定位五个IP效果

问题说明:本文除了对比这两个IP解释器,同时还是为了使用当前的ip2region在Python环境的使用,因为ip2region在Python项目内无法安装模块,导致我花不少时间才搞定,大家走这个路线就好了,避免大家遇到同样当不必要的其他阻碍

1. 下载 ip2region 项目资源

我们主要采用的是离线模式的ip2region,首先手动从 GitHub 下载 ip2region 解析器

  • ip2region.xdb 数据库文件: 点击下载
  • xdb_searcher.py(官方解析器):点击下载

 2. 创建ip2region工具类

工具类名称大家自定义即可,我的类目:ip_utils_ip2region.py

import os
from utils.ip.xdbSearcher import XdbSearcher
from loguru import logger


class IP2RegionInfo:
    """
    todo 存储 IP 解析出来的相关信息
    """
    def __init__(self, country=None, province=None, city=None, isp=None):
        self.country = country
        self.province = province
        self.city = city
        self.isp = isp

    def __str__(self):
        return f"{self.country},{self.province},{self.city},{self.isp}"

class IP2RegionLoader:
    """
    todo ip2region数据加载器-单例模式
    """
    _searcher = None

    @classmethod
    def get_searcher(cls):
        if cls._searcher is None:
            # 获得指定文件的绝对路径-本次模式使用的当前python函数所在文件夹的目录
            db_path = os.path.join(os.path.dirname(__file__), "ip2region.xdb")
            if not os.path.exists(db_path):
                raise FileNotFoundError("请下载 ip2region.xdb 并修改路径!")
            try:
                # 加载 xdb 数据库
                cls._searcher = xdbSearcher.XdbSearcher(dbfile=db_path)
                logger.info("成功加载 ip2region.xdb 数据库")
            except Exception as e:
                logger.error(f"加载数据库时出错: {e}")
                raise
        return cls._searcher

    @classmethod
    def close_searcher(cls):
        if cls._searcher is not None:
            cls._searcher.close()
            cls._searcher = None
            logger.info("已关闭 ip2region 数据库搜索器")


# 查询 IP 地址的具体信息
def ip2region_location_ip(ip):
    try:
        searcher = IP2RegionLoader.get_searcher()
        result = searcher.search(ip)

        # 解析查询结果:ip2region 返回的格式类似于 "国家|省份|城市|ISP"
        region_info = result.split('|')
        if len(region_info) < 4:
            logger.warning(f"IP {ip} 查询结果格式异常: {result}")
            return IP2RegionInfo()

        # 构造 IP2RegionInfo 对象
        ip_info = IP2RegionInfo(country=region_info[0], province=region_info[2], city=region_info[3],
                                isp=region_info[4])
        return ip_info
    except Exception as e:
        logger.error(f"查询 IP {ip} 时发生错误: {e}")
        return None


if __name__ == '__main__':
    # 示例查询
    ips = ["106.38.188.214", "203.93.215.16", "106.38.188.100", "221.130.191.216", "47.98.14.174"]
    for ip in ips:
        result = ip2region_location_ip(ip)
        if result:
            logger.info(f"IP {ip} 归属地信息: {result}")
        else:
            logger.error(f"IP {ip} 查询失败!")

    # 关闭搜索器
    IP2RegionLoader.close_searcher()

3. 资源文件关系目录

三个文件的文件关系目录,先跑起来,然后大家做自己的自定义哈,如图所示:

OK,这样就搞定了,直接运行即可,可以直接当成一个工具函数使用,祝各位编程顺利

这是近一年来转人工智能方向后,今年开始第三篇文章!

资源上传到了这儿

我用夸克网盘分享了「python_ip2Region_code.rar」,点击链接即可保存。打开「夸克APP」,无需下载在线播放视频,畅享原画5倍速,支持电视投屏。
链接:https://pan.quark.cn/s/25b5dbb70fff
提取码:VJQT

相关文章:

  • Hessian矩阵详解与应用
  • VBA常见的知识都有哪些,让AI编写的VBA经常 报错,所以VBA的基础还是要学习的
  • Java 代理模式详解
  • 嵌入式GPRS协议面试题及参考答案
  • 自动驾驶背后的数学:特征提取中的线性变换与非线性激活
  • GenICam GenTL 标准 ver1.5(1)GenICam简介与框架
  • 设计模式(创建型)-抽象工厂模式
  • 每日一题:动态规划
  • AI自动生成数据
  • idea 编译打包nacos2.0.3源码,生成可执行jar 包常见问题
  • 【算法】力扣 713题:乘积小于 K 的子数组之深入思考
  • E902基于bash与VCS的仿真环境建立
  • 1~2 课程简介+ESP32-IDF环境搭建、存储结构、启动流程(虚拟机Linux环境下)
  • 【C语言】:学生管理系统(多文件版)
  • Python使用总结之Flask构建文件服务器,通过网络地址访问本地文件
  • 蓝桥杯新手算法练习题单|冲击国一(三)
  • Java高频面试之集合-14
  • 【WEB APIs】正则表达式
  • AI小白的第六天:必要的数学知识(一)
  • 解决 Nginx 访问 /root/下 403 Forbidden 问题
  • 西南大学教授、重庆健美运动奠基人之一李启圣逝世
  • 东亚社会的“苦难诗学”:从《苦尽柑来遇见你》说起
  • 用社群活动维系“不开发”古镇的生命力
  • 马上评|比起奇葩论文,更可怕的是“水刊”灰产
  • 躺着玩手机真有意思,我“瞎”之前最喜欢了
  • 马丽称不会与沈腾终止合作,“他是我的恩人,也是我的贵人”