Golang — 根据IP获取地理位置信息

article/2025/10/14 15:47:25

Golang — 根据IP获取地理位置信息

  • 1 介绍
    • 1.1 ip2region
    • 1.2 geoip2-golang
    • 1.3 总结
  • 2 使用
    • 2.1 ip2region
    • 2.2 geoip2-golang

1 介绍

1 ip2region
2 geoip2-golang

1.1 ip2region

ip2region 是一个离线IP地址定位库和IP定位数据管理框架,10微秒级别的查询效率,提供了众多主流编程语言的 xdb 数据生成和查询客户端实现。

特点:

  1. 是一个开源的IP地理位置库。
  2. 标准化的数据格式
    每个 ip 数据段的 region 信息都固定了格式:国家|区域|省份|城市|ISP,只有中国的数据绝大部分精确到了城市,其他国家部分数据只能定位到国家,后前的选项全部是0。
  3. 数据去重和压缩
  4. 极速查询响应
    即使是完全基于 xdb 文件的查询,单次查询响应时间在十微秒级别。
  5. IP 数据管理框架

缺点:
ip2region 重点在于 研究 IP 数据的存储和快速查询的实现,并没有原始 IP 数据的支撑,本项目不保证及时的数据更新,暂时也不会有商用版本。

1.2 geoip2-golang

geoip2-golang只是一个使用示例,它所需的IP地理信息库是基于MaxMind提供的 GeoLite2GeoIP2 数据库。

特点:

  1. maxmind提供了免费的可在本地部署的geo-ip数据库(GeoLite2)(mmdb以及csv格式),和geo-ip查询api服务。
  2. 支持ipv4和ipv6的地理信息查询,以及ASN数据库(ip-运营商信息查询)
  3. 免费的数据库更新周期为两周一次,需要付费才能得到最快的更新速度。

1.3 总结

推荐优先使用 geoip2-golang,其次是ip2region,如果需要更加精确的话,建议选择商用的。

2 使用

2.1 ip2region

  1. 下载ip地址库
    到github:https://github.com/lionsoul2014/ip2region下载代码。

  2. ip2region的库
    data下的ip2region.xdb
    在这里插入图片描述

  3. 使用

package mainimport ("fmt""github.com/lionsoul2014/ip2region/binding/golang/xdb""net""time"
)func main() {ip2region()
}
func ip2region() {var dbPath = "iputil/ip2region/ip2region.xdb"searcher, err := xdb.NewWithFileOnly(dbPath)if err != nil {fmt.Printf("failed to create searcher: %s\n", err.Error())return}defer searcher.Close()var ip = "115.223.9.122"var tStart = time.Now()ips, err := net.LookupIP("www.github.com")ipres := ips[0].String()fmt.Printf("域名的ip:%s\n", ipres)region, err := searcher.SearchByStr(ip)if err != nil {fmt.Printf("failed to SearchIP(%s): %s\n", ip, err)return}fmt.Printf("{region: %s, took: %s}\n\n", region, time.Since(tStart))// 备注:并发使用,每个 goroutine 需要创建一个独立的 searcher 对象。
}

结果:

域名的ip:20.205.243.166
{region: 中国|0|浙江省|温州市|电信, took: 70.8846ms}

2.2 geoip2-golang

geoip2-golang只是一个使用示例,它所需的IP地理信息库是基于MaxMind提供的 GeoLite2GeoIP2 数据库。所以需要去MAXMID官网注册账号,然后才能下载最新的IP地理位置库

  1. 注册
    地址:https://www.maxmind.com/en/geolite2/signup,除了邮箱外,其他都不需要真实信息。
  2. 登录
  3. 下载最新的IP地理位置库
    登陆后点击 Download Databases进入下载选择页面
    在这里插入图片描述
  4. 下载库文件
    maxmind提供了六种免费的数据库,有mmdb【推荐】,也有csv格式。你也可以全部下载下来看看。

ASN数据库
从图中可以看到有些数据库的标题后面写着“ASN”三个字母,这个ASN的指的就是ip-运营商信息的数据库。

mmdb数据库
mmdbmaxmind自己的一种二进制数据库格式,它提供较快的ip查询速度。

这里我们只下载不是CSV格式的库文件即可,即只下载红色圈起来的,右侧是下载按钮。

注意MAXMIND会记录下载,所以不要反复下载,以免被禁。
在这里插入图片描述

  1. 库文件
  • GeoLite2-ASN_20230505.tar.gz
  • GeoLite2-City_20230505.tar.gz
  • GeoLite2-Country_20230505.tar.gz

解压后都是mmdb数据库类型,具体差别自己测试吧。

  1. 使用
  • 下载geoip2-golang
go get github.com/oschwald/geoip2-golang

代码示例:

package mainimport ("fmt""github.com/lionsoul2014/ip2region/binding/golang/xdb""github.com/oschwald/geoip2-golang""log""net""time"
)func main() {ip2region()geoip()
}
func ip2region() {var dbPath = "iputil/ip2region/ip2region.xdb"searcher, err := xdb.NewWithFileOnly(dbPath)if err != nil {fmt.Printf("failed to create searcher: %s\n", err.Error())return}defer searcher.Close()var ip = "115.223.9.122"var tStart = time.Now()ips, err := net.LookupIP("www.github.com")ipres := ips[0].String()fmt.Printf("域名的ip:%s\n", ipres)region, err := searcher.SearchByStr(ip)if err != nil {fmt.Printf("failed to SearchIP(%s): %s\n", ip, err)return}fmt.Printf("{region: %s, took: %s}\n\n", region, time.Since(tStart))// 备注:并发使用,每个 goroutine 需要创建一个独立的 searcher 对象。
}func geoip() {db, err := geoip2.Open("iputil/geolite2/GeoLite2-City.mmdb")if err != nil {log.Fatal(err)}defer db.Close()// If you are using strings that may be invalid, check that ip is not nil//ip := net.ParseIP("81.2.69.142")ip := net.ParseIP("115.192.211.101")record, err := db.City(ip)if err != nil {log.Fatal(err)}fmt.Printf("Portuguese (BR) city name: %v\n", record.City.Names["pt-BR"])if len(record.Subdivisions) > 0 {fmt.Printf("English subdivision name: %v\n", record.Subdivisions[0].Names["en"])}fmt.Printf("Russian country name: %v\n", record.Country.Names["ru"])fmt.Printf("ISO country code: %v\n", record.Country.IsoCode)fmt.Printf("Time zone: %v\n", record.Location.TimeZone)fmt.Printf("Coordinates: %v, %v\n", record.Location.Latitude, record.Location.Longitude)// Output:// Portuguese (BR) city name: Londres// English subdivision name: England// Russian country name: Великобритания// ISO country code: GB// Time zone: Europe/London// Coordinates: 51.5142, -0.0931fmt.Println("中文结果")fmt.Printf("Portuguese (BR) city name: %v\n", record.City.Names["zh-CN"])if len(record.Subdivisions) > 0 {fmt.Printf("English subdivision name: %v\n", record.Subdivisions[0].Names["zh-CN"])}fmt.Printf("Russian country name: %v\n", record.Country.Names["zh-CN"])fmt.Printf("ISO country code: %v\n", record.Country.IsoCode)fmt.Printf("Time zone: %v\n", record.Location.TimeZone)fmt.Printf("Coordinates: %v, %v\n", record.Location.Latitude, record.Location.Longitude)
}

结果:

Portuguese (BR) city name: Hangzhou
English subdivision name: Zhejiang
Russian country name: Китай
ISO country code: CN
Time zone: Asia/Shanghai
Coordinates: 30.2994, 120.1612
中文结果
Portuguese (BR) city name: 杭州
English subdivision name: 浙江省
Russian country name: 中国
ISO country code: CN
Time zone: Asia/Shanghai
Coordinates: 30.2994, 120.1612
  1. 将输出结果改为中文
    只需要将Names[“en”]更改为Names[“zh-CN”]即可显示中文。

http://chatgpt.dhexx.cn/article/qOyAPMrG.shtml

相关文章

python通过ip获取地理位置等ip信息

作者讲话:本人是一个菜鸟勿喷本文章仅供娱乐。 ps:以后可以线下挑战了,直接顺着网线找到你!哈哈哈 查询IP数据网站 使用结果1 ‘http://freeapi.ipip.net/ip’ 中文网站 使用结果2 ‘http://ip-api.com/json/ip’ 外国网站 实…

如何利用IP地址确定地理位置

近年来,基于IP地址的网络应用层出不穷,主要包括定向广告、社交网络、网络安全、网络服务性能优化、用户位置画像等。 互联网用户的物理位置对于很多不同类型的应用是有不同的用处的。以搜索引擎为首等应用通常会使用用户的位置来自定义对用户请求的响应。…

python根据IP查询地理位置

实现了输入ip地址返回该ip对应的信息。 如图:解释如下: 打开百度,输入ip打开调试界面,点击图中3号位置过滤在图中4号框位置输入想要查询的ip,然后点查询依次点击图中5、6,找到timestamp字段,粘…

教你如何使用ip地址进行高精度定位

IP这个概念大部分人都很熟悉了,这里IP的意思不是个人标签,而是IP地址(英语:Internet Protocol Address)是一种在Internet上的给主机编址的方式,也称为网际协议地址。IP地址是IP协议提供的一种统一的地址格式…

windows访问Ext4磁盘

作者 QQ群:852283276 微信:arm80x86 微信公众号:青儿创客基地 B站:主页 https://space.bilibili.com/208826118 参考 在Windows下读取Ext4分区 推荐一款Windows下读取 Linux文件系统Ext4的最佳软件 Paragon ExtFS api-ms-win-cr…

【Linux】Linux Ext2文件系统

下面以Linux的Ext2为例介绍文件系统的组成。 Ext2采用了分立式目录结构,即一个文件的目录分为目录项和索引节点两个部分。 Ext2的索引节点 在一个实际分立式目录的文件系统中,索引节点(inode)主要需要两部分内容来支持&#xff…

EXT2文件系统实现原理

目录 一 EXT2文件系统结构概览 2 1.1 EXT2文件系统结构框图 2 1.2 EXT2重要数据结构 3 二 块缓存 6 三 EXT2文件系统挂载 7 3.1 注册ext2文件系统类型 7 3.2 ext2文件系统挂载 7 3.3文件系统操作 9 EXT2文件系统结构概览 1.1 EXT2文…

模拟实现EXT2文件系统

设计EXT2文件系统 实验目的 (1)掌握文件系统的工作原理 (2)理解文件系统的主要数据结构 (3)学习较为复杂的 Linux 下的编程 (4)了解 EXT2 文件系统的结构 实验内容 设计并实现…

WIN10访问linux分区「ext2fsd」

尝试ext2explore、Paragon ExtFS都不好用,强烈安利ext2fsd,可读写,很强大 转自:https://blog.csdn.net/cruise_h/article/details/12894135 ext2fsd是国人发起的项目,主页 http://www.ext2fsd.com/ 下载:h…

windos读写ext3工具_“ ext2fsd” Windows系统工具,用于读写ext2 / 3/4文件系统

在过去的几天里,我使用定制版本的Bridge Linux来扔Arch Linux. 修改lxdm主题时,我无意间无法进入系统,也无法切换命令行模式,因此我不得不找出Windows系统中是否存在可以读写ext4文件系统的工具. 以前尝试过ext2explore&#xff0…

ext2文件系统

ext2是Linux早期比较流行的文件系统,很多文件系统(NTFS、FAT32等)的设计都源自于它。只要掌握了ext2文件系统,其他文件系统大同小异。 ext2文件系统的布局如下: 文件系统中存储的最小单位是块(Block&#…

文件系统系列专题之 Ext2/3/4

一、Ext概述 EXT是延伸文件系统(Extended file system,缩写为 ext或 ext1),也译为扩展文件系统,第 1 个扩展文件系统(ext1)由 Remy Card 设计,并于 1992 年 4 月引入到 Linux 中。采…

深入理解ext2文件系统

ext2文件系统需要考虑哪些因素: 1.最重要的是保证数据的安全性。 2.效率,方便文件的查找读写。 3.文件在磁盘空间占用空间小。 (1)树形目录结构 EXT文件系统采用一个独立的顶级树形目录架构(即所有一切都从root根目录开始&…

学习篇 | LINUX 内核的文件系统 -- ext2

引言: 本篇博客中主要讲述的是 LINUX 内核所用的文件系统 —— 第二代扩展文件系统 Ext2,Ext2是数个Linux发行版本的默认文件系统。 百度百科 -- ext2 目录 引言: Ext2 文件系统 磁盘的物理组成 ext2 文件系统的格式 ext2 文件系统目录…

ext2文件系统详解

第一部分磁盘的物理组成 磁盘的基本概念: 扇区为最小的物理存储单位,每个扇区为512字节。 将扇区组成一个圆,那就是柱面,柱面是分区的最小单位。 第一个扇区很重要,里面有硬盘主引导记录(Masterbootrecord…

编译原理——证明文法具有二义性

证明一个文法具有二义性我们需要掌握两个知识点。 1.语法分析树 定义很简单,就是把一个句型的推导写成树的形式,这种表示法就叫语法分析树,或者简称为语法树。大概是这个样子的 2.二义性 一个文法存在某个句子对应两棵不同的语法树&…

二义性文法的理解和消除方法

给定文法G,如果存在句子s,它有两棵不同的分析树,那么称G是二义性文法 从编译器角度,二义性文法存在问题: 同一个程序会有不同的含义 因此程序运行的结果不是唯一的 一个句子有多于一棵分析树,仅与文法和句子…

2.5.3 文法二义性的消除

2.5.3 文法二义性的消除 (1 )不改变文法中原有的语法规则,仅加进一些语法的非形式规定。 例如,对于上例文法 G [ E ],不改变已有的 4 条规则,仅加进运算符的优先顺序和结合规则,即 * 优先于 ; , * 服从左结合。这样,对于文法 G [ E ]中的句子 i * i i 只有唯一的一棵语法树…

C#调用方法时的二义性解决方法

如图中出现的错误: 里面有三个名字为SetCurrentSelectableObject的方法,其中两个的参数都是引用对象,一个是SelectableObject类型,一个是string类型,这样导致引用出现了二义性,解决的办法就是对null进行强制…