Python IP解析器 ip2region使用

news2025/3/20 23:16:34

说明:最近需要在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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2318636.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

labview与西门子1500plc进行S7通讯(仿真效果)

环境&#xff1a; 1.博图V16 2.S7-PLCSIM Advanced V3.0 3.labview2020 4.HslCommunication的dll文件 运行效果图 通过使用HslCommunication的库文件来对西门子plc进行通讯 labview代码 代码打包 通过网盘分享的文件&#xff1a;labview进行s7通讯测试.rar 链接: https:/…

Oracle 公布 Java 的五大新功能

Java 增强提案包括语言增强和性能优化&#xff0c;从 JDK 25 中的稳定值 API 开始。 随着JDK&#xff08;Java 开发工具包&#xff09;24刚刚全面上市&#xff0c;Oracle 提前透露了不久的将来即将推出的 Java 功能&#xff0c;包括增强原始装箱到空限制值类类型。 3 月 18 日…

台式机电脑组装---电脑机箱与主板接线

台式机电脑组装—电脑机箱与主板接线 1、机箱连接主板的跳线一般主要有USB 2.0、USB 3.0、前置音频接口(HD_AUDIO)以及POWER SW、RESET SW、POWER LED、HDD LED四个主板跳线&#xff0c;这些跳线分别的含义如下。 RESET SW&#xff1a;机箱重启按键&#xff1b;注&#xff1a…

动作捕捉手套如何让虚拟现实人机交互 “触手可及”?

在虚拟与现实逐渐交融的当下&#xff0c;动作捕捉技术正以前所未有的速度革新着多个领域。 动作捕捉技术&#xff0c;简称“动捕”&#xff0c;已经从早期的影视特效制作&#xff0c;逐步拓展到游戏开发、虚拟现实、机器人控制等多个领域。 而mHandPrO数据手套作为这一领域的…

笔记本电脑关不了机是怎么回事 这有解决方法

在快节奏的现代生活中&#xff0c;笔记本电脑已成为我们工作、学习和娱乐的得力助手。在使用电脑的过程中&#xff0c;笔记本电脑突然关不了机了&#xff0c;怎么回事&#xff1f;下面驱动人生就来讲一讲笔记本电脑不能正常关机的解决方法&#xff0c;有需要的可以来看看。 一、…

给管理商场消防安全搭建消防安全培训小程序全过程

一、需求沟通 “我是管理商场消防安全的嘛&#xff0c;做这个的作用呢&#xff0c;1是商场的所有商户员工可以看平面或者视频随时自学&#xff0c; 2是我们定期培训必修课程、考试&#xff0c;这个需要留存他们的手签字的签到表确认我们讲给他们听了&#xff08;免责很重要&am…

Flutter:页面滚动,导航栏背景颜色过渡动画

记录&#xff1a;导航默认透明&#xff0c;页面发生滚动后&#xff0c;导航背景色由0-1&#xff0c;过渡到白色背景。 view import package:ducafe_ui_core/ducafe_ui_core.dart; import package:flutter/material.dart; import package:get/get.dart; import package:redo…

VSCode + CMake

参考文献&#xff1a; 如何用 GCC, CMake 和 Make 编译C/C代码Windows 上的 Linux 子系统&#xff1a;WSLWSL&#xff1a;桌面 UI 远程连接 RDP 配置 VScode 文章目录 CMake 配置VSCode 配置launch.jsontask.jsonc_cpp_properties.json CMake 配置 编写如下的 CmakeLists.t…

Docker进阶篇1:什么是Docker数据卷?为什么需要Docker数据卷?Docker数据卷3种类型介绍

大家好我是木木&#xff0c;在当今快速发展的云计算与云原生时代&#xff0c;容器化技术蓬勃兴起&#xff0c;Docker 作为实现容器化的主流工具之一&#xff0c;为开发者和运维人员带来了极大的便捷 。下面我们一起开始进阶第1篇&#xff1a;什么是Docker数据卷&#xff1f;为什…

(2025|ICLR|华南理工,任务对齐,缓解灾难性遗忘,底层模型冻结和训练早停)语言模型持续学习中的虚假遗忘

Spurious Forgetting in Continual Learning of Language Models 目录 1. 引言 2. 动机&#xff1a;关于虚假遗忘的初步实验 3. 深入探讨虚假遗忘 3.1 受控实验设置 3.2 从性能角度分析 3.3 从损失景观角度分析 3.4 从模型权重角度分析 3.5 从特征角度分析 3.6 结论 …

从两指到三指:Robotiq机器人自适应夹持器技术解析

工业自动化离不开高效工具的支持。Robotiq机器人工具凭借其模块化设计和智能化编程技术&#xff0c;提升了设备的灵活性和操作效率。Robotiq机器人工具精准的传感器和自适应夹持器技术&#xff0c;能够满足多样化的应用需求&#xff0c;为制造业、物流和科研等领域提供可靠的解…

【css酷炫效果】纯CSS实现悬浮弹性按钮

【css酷炫效果】纯CSS实现悬浮弹性按钮 缘创作背景html结构css样式完整代码效果图 想直接拿走的老板&#xff0c;链接放在这里&#xff1a;https://download.csdn.net/download/u011561335/90492020 缘 创作随缘&#xff0c;不定时更新。 创作背景 刚看到csdn出活动了&…

力扣222. 完全二叉树的节点个数(Java实现)

222. 完全二叉树的节点个数 1. 思路 这个题最简单的做法就是暴力遍历&#xff0c;时间复杂度为O(n)。 我们现在用低于O(n)的做法解决问题。 对于一棵满二叉树&#xff0c;它的节点数 2 h - 1 (h 是指树一共有多少层) 头节点不断遍历左孩子直至为null&#xff0c;得到树高…

element-ui pagination 组件源码分享

pagination 分页组件源码分享&#xff0c;主要从以下三个方面&#xff1a; 1、pagination 组件页面结构。 2、pagination 组件属性。 3、pagination 组件方法。 一、组件页面结构。 二、组件属性。 2.1 small 是否使用小型分页样式&#xff0c;类型为 boolean&#xff0c;…

【css酷炫效果】纯CSS实现火焰文字特效

【css酷炫效果】纯CSS实现火焰文字特效 缘创作背景html结构css样式完整代码基础版进阶版(冰霜版) 效果图 想直接拿走的老板&#xff0c;链接放在这里&#xff1a;https://download.csdn.net/download/u011561335/90492005 缘 创作随缘&#xff0c;不定时更新。 创作背景 刚…

【java面型对象进阶】------继承实例

继承结构下的标准Javabean 代码如下&#xff1a; package demo10;//定义员工父类 public class Employee {private String id;private String name;private double salary;//构造方法public Employee(){}public Employee(String id,String name,double salary){this.idid;thi…

【数据分享】1999—2023年地级市固定资产投资和对外经济贸易数据(Shp/Excel格式)

在之前的文章中&#xff0c;我们分享过基于2000-2024年《中国城市统计年鉴》整理的1999-2023年地级市的人口相关数据、染物排放和环境治理相关数据、房地产投资情况和商品房销售面积相关指标数据、社会消费品零售总额和年末金融机构存贷款余额、各类用地面积、地方一般公共预算…

数据结构——串、数组和广义表

串、数组和广义表 1. 串 1.1 串的定义 串(string)是由零个或多个字符组成的有限序列。一般记为 S a 1 a 2 . . . a n ( n ≥ 0 ) Sa_1a_2...a_n(n\geq0) Sa1​a2​...an​(n≥0) 其中&#xff0c;S是串名&#xff0c;单引号括起来的字符序列是串的值&#xff0c; a i a_i a…

【Java代码审计 | 第十四篇】MVC模型、项目结构、依赖管理及配置文件概念详解

未经许可&#xff0c;不得转载。 文章目录 MVC模型模型&#xff08;Model&#xff09;视图&#xff08;View&#xff09;控制器&#xff08;controller&#xff09;MVC工作流程 项目结构java目录resources目录webapp目录 依赖管理配置文件 MVC模型 MVC&#xff08;Model-View-…

单片机ADC+NTC温度采集电路学习

文章目录 前言一、NTC是什么&#xff1f;二、NTC重要参数三、实际应用举例四、NTC和PTC的区别总结 前言 NTC常用来检测外部环境或者电池温度&#xff0c;及汽车水温传感器。 有时候电池并不内置NTC&#xff0c;所以需要外置NTC来采集电池温度&#xff0c;注意要紧贴电池&#…