【GitHub精选项目】IP 地址转地理位置:ip2region 完全指南

在这里插入图片描述

前言

本文为大家带来的是 lionsoul2014 开发的 ip2region 项目,一种高效的离线 IP 地址定位库。ip2region 提供了10微秒级别的查询效率,支持多种主流编程语言,是一种理想的 IP 定位解决方案。

这个开源项目可以实现 IP 地址到地理位置的精确映射,包括国家、省份、城市、运营商等信息,对于需要地理定位功能的应用程序来说,它是非常有用的。
别的不说,最近在项目中就运用上了它!!!

项目地址:https://github.com/lionsoul2014/ip2region


项目概览

ip2region 是一个跨语言的 IP 定位库,它提供了一个紧凑、高效的数据结构来存储 IP 定位数据,并且支持快速查询。这使得 ip2region 在需要快速准确获取 IP 地址地理位置信息的场合中,如网络分析、广告定向、内容定制等领域,显得尤为重要。

在这里插入图片描述

可以看到项目支持多种编程语言去查询。

在这里插入图片描述

克隆项目

git clone

最简单的,在命令行工具数据以下命令即可,如下图所示:

git clone https://github.com/lionsoul2014/ip2region.git

在这里插入图片描述

Download ZIP

当然,使用 Download ZIP 也是个不错的下载方式。

在这里插入图片描述

使用指南

为了展示 ip2region 的使用方法,下面将使用 Python 语言进行演示。Python 版本的 ip2region 使用方法可以在下面的链接中找到:
Python 文档:https://github.com/lionsoul2014/ip2region/tree/master/binding/python

我们将通过一个实例演示如何将大量 IP 地址转换为地理位置信息,并将结果保存为 Excel 文件,以便于测试它的速度有多快。


我准备了一份 19万+ 的 IP 用于测试。

在这里插入图片描述


实现代码

以下使用代码来自官方的 Python 文档,但

  • 我添加了一个计时器的装饰器
  • 从 CSV 文件中读取 IP 地址。
  • 将查询结果保存为 Excel 文件。
# -*- coding: utf-8 -*-
# @Author : Frica01
# @Time   : 2023-12-20 22:32
# @Name   : demo.py

import time
from collections import defaultdict

import pandas as pd

from binding.python.xdbSearcher import XdbSearcher

output_dict = defaultdict(list)


def timer(func):
    """任务计时装饰器,用于测量函数执行时间"""

    def wrapper(*args, **kwargs):
        start_time = time.time()  # 开始时间
        result = func(*args, **kwargs)  # 执行函数
        end_time = time.time()  # 结束时间
        print(f"{func.__name__}任务执行耗时 {end_time - start_time:.4f} 秒.")
        return result

    return wrapper


@timer
def searchWithFile():
	"""完全基于文件的查询"""
    # 1. 创建查询对象
    dbPath = "./data/ip2region.xdb"
    searcher = XdbSearcher(dbfile=dbPath)

    # 2. 执行查询
    df = pd.read_csv('test_ip.csv')
    for idx, item in df.iterrows():
        ip = item['ip']
        output_dict['ip'].append(ip)
        output_dict['region'].append(searcher.searchByIPStr(ip))

    # 3. 关闭searcher
    searcher.close()

    # 4. 保存为excel文件
    pd.DataFrame(data=output_dict).to_excel('result.xlsx', index=False)


@timer
def searchWithVectorIndex():
	"""缓存 VectorIndex 索引"""
    # 1. 预先加载整个 xdb
    dbPath = "./data/ip2region.xdb"
    vi = XdbSearcher.loadVectorIndexFromFile(dbfile=dbPath)

    # 2. 使用上面的缓存创建查询对象, 同时也要加载 xdb 文件
    searcher = XdbSearcher(dbfile=dbPath, vectorIndex=vi)

    # 3. 执行查询
    df = pd.read_csv('test_ip.csv')
    for idx, item in df.iterrows():
        ip = item['ip']
        output_dict['ip'].append(ip)
        output_dict['region'].append(searcher.search(ip))

    # 4. 关闭searcher
    searcher.close()

    # 5. 保存为excel文件
    pd.DataFrame(data=output_dict).to_excel('result.xlsx', index=False)


@timer
def searchWithContent():
	"""缓存整个 xdb 数据"""
    # 1. 预先加载整个 xdb
    dbPath = "./data/ip2region.xdb"
    cb = XdbSearcher.loadContentFromFile(dbfile=dbPath)

    # 2. 仅需要使用上面的全文件缓存创建查询对象, 不需要传源 xdb 文件
    searcher = XdbSearcher(contentBuff=cb)

    # 3. 执行查询
    df = pd.read_csv('test_ip.csv')
    for idx, item in df.iterrows():
        ip = item['ip']
        output_dict['ip'].append(ip)
        output_dict['region'].append(searcher.search(ip))

    # 4. 关闭searcher
    searcher.close()

    # 5. 保存为excel文件
    pd.DataFrame(data=output_dict).to_excel('result.xlsx', index=False)


if __name__ == '__main__':
    searchWithFile()
    # searchWithVectorIndex()
    # searchWithContent()

测试

不同模式的执行速度如下表所示:

  • 它们分别转换了 19万+IP ,并将结果保存为 excel 文件。
模式耗时/秒速度
完全基于文件的查询10.2
缓存 VectorIndex 索引9.6⭐⭐
缓存整个 xdb 数据6.0⭐⭐⭐

影响速度的原因

在项目 README.md 的末尾,有关于 VectorIndexxdb 等原理的介绍,有需要的读者可以进一步查阅。

VectorIndexxdb 文件是 ip2region 项目中用于存储 IP 地址数据和加速查询的关键组件:

  • 索引效率VectorIndex 提供了一种高效的查找方法,减少了查询时需要扫描的数据量。这种优化的索引方法可以快速定位到数据库中的特定区域,从而加快查询速度。
  • xdb数据访问方式:当数据直接从内存中读取时,查询速度要快于从硬盘读取。因此,将整个 xdb 文件加载到内存中可以显著提高查询速度。

总的来说,通过使用高效的索引(如 VectorIndex)和将数据加载到内存中,ip2region 能够实现快速、准确的 IP 定位查询,这对于处理大量 IP 地址查询尤其重要。


总结

本文详细介绍了 ip2region 项目,这是一个高效的离线 IP 地址定位库,能够将 IP 地址映射到地理位置。通过对项目的细致解读,本文提供了关于如何使用 ip2region 的全面指南,特别是针对 Python 用户。

文章的重点在于演示如何使用不同的查询模式(完全基于文件的查询、缓存 VectorIndex 索引、缓存整个 xdb 数据)来处理大量的 IP 地址,并比较了这些方法在性能上的差异。通过这些实验,我们能够清楚地看到不同方法对于查询速度的影响,这对于选择合适的查询策略是非常有帮助的。

后话

本次分享到此结束,
see you~~🎈🎈

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PLC物联网,实现工厂设备数据采集

随着工业4.0时代的到来,物联网技术在工厂设备管理领域的应用日益普及。作为物联网技术的重要一环,PLC物联网为工厂设备数据采集带来了前所未有的便捷和高效。本文将围绕“PLC物联网,实现工厂设备数据采集”这一主题,探讨PLC物联网…

2-高可用-负载均衡、反向代理

负载均衡、反向代理 upstream server即上游服务器,指Nginx负载均衡到的处理业务的服务器,也可以称之为real server,即真实处理业务的服务器。 对于负载均衡我们要关心的几个方面如下: 上游服务器配置:使用upstream server配置上…

Axure情形动作篇(ERP登录效验)

目录 一、ERP系统用户登录效验 1.1 完成步骤 1.2 最终效果 二、省市区联动 三、ERP菜单栏页面跳转 四、下拉加载效果实现 4.1 加载动画实现步骤 4.2 下划界面加载实现 4.3 最终效果 一、ERP系统用户登录效验 1.1 完成步骤 首先搭建ERP系统的登录界面(输入…

HP服务器idrac设置以及系统安装

HP服务器idrac设置以及系统安装 一、设置管理口的地址和密码1、HP服务器重新界面选择"F9"进入BIOS,设置iLo5(idrac)的IP和用户名密码。2、选择"系统配置"。3、选择"iLO 4"配置程序。4、网络选项是设置idrac管理口的地址,设…

《数据分析-JiMuReport》积木报表详细入门教程

积木报表详细入门教程 一、JimuReport部署入门介绍 积木报表可以通过源码部署、SpringBoot集成、Docker部署以及各种成熟框架部署,具体可查看积木官方文档 当前采用源码部署,首先下载Jimureport-example-1.5.6 1 jimureport-example目录查看 使用ID…

IDEA创建springboot工程

选择spring boot的版本和依赖 finish创建完成 删除无用的文件

Java开发框架和中间件面试题(2)

8.说说自己对Spring MVC的了解? MVC是一种设计模式,Spring MVC是一款很优秀的MVC框架。Spring MVC可以帮助我们进行更简洁的Web层开发,并且它天生与Spring框架集成。SpringMVC下我们一般把后端项目分为Service(处理业务&#xff0…

vue ui 一直卡在 Starting GUI..

1.如果项目一直卡在 Starting GUI… 2.解决方法 (切换数据源) npm config set registry http://registry.npm.taobao.org/3.成功解决

CGAL的锥形扳手

1、介绍 这一章描述了用于构建两种基于锥体的生成树的包:Yao图和Theta图,给定平面上的一组顶点和锥体边界的方向。支持精确和不精确的构造。在精确构造中,锥体边界是使用多项式的根来计算的,通过避免在计算中使用π来实现精确性。…

数据治理之数据梳理与建模

目录 一、什么是数据模型二、数据模型的类型概念模型概念模型的3个基本要素概念模型的用途 逻辑模型逻辑模型的特征逻辑模型的用途 物理模型物理模型特征物理模型用途 三、什么是数据梳理数据梳理两种流程自上而下梳理数据域梳理数据主题梳理数据实体梳理设计数据模型优缺点 自…

http状态码(三)401、403、404报错

一 401、403、404报错 ① 401和403 说明: 由于 nginx 导致的401、403很不常见,这里不再细讲,后续会讲解两个独特的案例1) 401 Unauthorized --> 权限认证机制、Cookie、Token --> 请求没有经过授权2) 403 Forbidden -->…

BEVFusion-mit复现与实践(nuscenes-mini数据集)

目录 一、CUDA版本11.1二、创建虚拟环境并激活三、安装pytorch四、安装openmpi五、安装功能包六、源码下载七、参数修改与编译八、配置nuscenes-mini九、复现十、实践 一、CUDA版本11.1 二、创建虚拟环境并激活 conda create -n bevfusion python3.8 conda activate bevfusio…

4.3 C++对象模型和this指针

4.3 C对象模型和this指针 4.3.1 成员变量和成员函数分开存储 在C中&#xff0c;类内的成员变量和成员函数分开存储 只有非静态成员变量才属于类的对象上 #include <iostream>class Person { public:Person() {mA 0;} //非静态成员变量占对象空间int mA;//静态成员变量…

SSM整合实战(Spring、SpringMVC、MyBatis)

五、SSM整合实战 目录 一、SSM整合理解 1. 什么是SSM整合&#xff1f;2. SSM整合核心理解五连问&#xff01; 2.1 SSM整合涉及几个IoC容器&#xff1f;2.2 每个IoC容器盛放哪些组件&#xff1f;2.3 IoC容器之间是什么关系&#xff1f;2.4 需要几个配置文件和对应IoC容器关系&…

Redis原理之网络通信协议笔记

目录 1. RESP协议 ​2. 自定义Socket连接Redis 1. RESP协议 2. 自定义Socket连接Redis public class MyRedisClient {static Socket s;static PrintWriter writer;static BufferedReader reader;static Object obj;public static void main(String[] args) {try {// 1.建立连…

uni-app的初使用(附源码学习)

uni-app代码编写&#xff0c;基本语言包括js、vue、css。以及ts、scss等css预编译器。 新建项目等基础指路&#xff1a; 关于uni-app的下载及使用-CSDN博客 1.vue文件 由三个一级节点组成&#xff0c;分别是template、script、style <template> </template><…

设计模式——外观模式(Facade Pattern)

概述 外观模式又称为门面模式&#xff0c;它通过引入一个外观角色来简化客户端与子系统之间的交互&#xff0c;为复杂的子系统调用提供一个统一的入口&#xff0c;降低子系统与客户端的耦合度&#xff0c;且客户端调用非常方便。它是一种对象结构型模式。外观模式结构图如下所示…

ansible的脚本—playbook剧本

目录 一、playbook 1、简介 2、playbook组成部分&#xff1a; 3、如何编写Playbook&#xff1f; 4、语句的横向/纵向写法 二、playbook模版实例&#xff1a; 1、playbook模版&#xff1a; 2、playbook的条件判断&#xff1a; 3、playbook中的循环&#xff1a; 4、循环…

优维科技荣获第二届中国赛宝信息技术应用创新优秀解决方案三等奖

近日&#xff0c;“第二届中国赛宝信息技术应用创新优秀解决方案”评选活动圆满结束。优维科技所提交的《Hyperlnsight超融合持续观测解决方案》、《EasyOps一体化运维平台》从全国近300份申报方案中脱颖而出&#xff0c;荣获2023中国赛宝信息技术应用创新优秀解决方案奖。 本…

【操作系统】什么是进程?

文章目录 进程进程的属性进程的状态挂起 进程 进程是一个可并发执行的具有独立功能的程序关于某个数据集合的执行过程&#xff0c;也是操作系统进行资源分配和保护的基本单位。 进程的属性 结构性&#xff1a; 共享性&#xff1a;同一程序运行于不同数据集合上构成不同的进程…