通过GeoIP2分析访问者IP获取地理位置信息

【第三方库】【GeoIP2】Python中geoip2的使用 GeoIP的使用介绍,查询指定IP的地址,以及其他附加信息 阅读详情

原文链接:http://blog.youkuaiyun.com/johnnycode/article/details/42028841

MaxMind GeoIP2 服务能识别互联网用户的地点位置与其他特征,应用广泛,包括个性化定制内容、诈欺检测、广告定向、网站流量分析、执行规定、地理目标定位、地理围栏定位 (geo-fencing)以及数字版权管理。目前使用 GeoIP 更多是配合Nginx或Apache服务器进行日志分析获取网站访问量地域分布状况。

GeoIP 分为商业版和免费版,免费版比商业版精度差了许多,经测试对于城市定位确实有差距,能否接受看你的精度要求!

一、免费版本介绍:

1、GeoLite 版本,网上流传较广,数据库类型为 dat 格式文件,库文件较小未进行精准度测试。

2、GeoLite2版本,目前最新版本,数据库文件为 mmdb 格式文件,有兴趣了解 mmdb 格式的点这里 。

两者数据库文件大小比对,GeoLite2 特性点击这里

$ du -sh *
32M	GeoLite2-City.mmdb
2.3M	GeoLite2-Country.mmdb
18M	GeoLiteCity.dat
732K	GeoLiteCountry.dat
City 文件为包含城市信息数据库,Country 文件为国家信息数据库。

二、下载 GeoLite2 数据库
下载方式分为两种,第一种通过下载 gz 压缩包,第二种通过使用官方提供的下载更新程序,建议使用第二种,官方称数据库在每个月的第一个星期二更新,如果想做成计划任务每月都更新建议选择第二种!GeoIP2详细更新日志点这里。

两种方式这里都啰嗦一下,本阶段只是讲如何下载数据库,调用方式需要参考第三阶段 API 调用部分!

1、第一种方式,下载 gz 文件并解压缩。

GeoLite2 只提供 City 数据库和 Country 数据库下载 查看详情点击里,数据库文件分为 Binary 和 CVS 两种,这里使用 Binary 文件。

$ sudo mkdir -p /mnt/data/geolite2 && cd $_
$ sudo wget http://geolite.maxmind.com/download/geoip/database/GeoLite2-City.mmdb.gz
$ sudo gzip -d GeoLite2-City.mmdb.gz
$ sudo wget http://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.mmdb.gz
$ sudo gzip -d GeoLite2-Country.mmdb.gz

2、第二种方式,需安装官方下载更新程序 geoipupdate 。

a、到 GitHub下载地址 下载 geoipupdate,目前最新版为 2.1.0,GitHub 连接速度要有耐心,肯定可以下载滴!编译文件需要 libcurl-devel 包支持,需提前下载安装。

$ sudo yum install libcurl-devel -y
$ sudo wget https://github.com/maxmind/geoipupdate/releases/download/v2.1.0/geoipupdate-2.1.0.tar.gz
$ sudo tar xzvf geoipupdate-2.1.0.tar.gz
$ cd geoipupdate-2.1.0
$ sudo ./configure
$ sudo make
$ sudo make install

编译完毕只需要关注两个文件

更新执行文件 /usr/local/bin/geoipupdate

账户信息文件 /usr/local/etc/GeoIP.conf

b、配置账户信息 GeoIP.conf,修改配置文件如下即可,本配置文件默认下载 mmdb 文件,若想下载 dat 文件取消注释即可!

 # The following UserId and LicenseKey are required placeholders:
UserId 999999
LicenseKey 000000000000

# Include one or more of the following ProductIds:
# * GeoLite2-City - GeoLite 2 City
# * GeoLite2-Country - GeoLite2 Country
# * 506 - GeoLite Legacy Country
# * 517 - GeoLite Legacy ASN
# * 533 - GeoLite Legacy City

# dat 格式数据库
#ProductIds GeoLite2-City GeoLite2-Country 506 533

# mmdb 格式数据库
ProductIds GeoLite2-City GeoLite2-Country 132 106

c、执行更新

查看geoipupdate帮助文件,了解有哪些参数可以使用! -d 参数将文件下载到指定目录,-v 参数就是显示下载过程明细信息。

$ /usr/local/bin/geoipupdate -h
Usage: geoipupdate [-Vhv] [-f license_file] [-d custom directory]

  -d DIR   store downloaded files in DIR
  -f FILE  use configuration found in FILE (see GeoIP.conf(5) man page)
  -h       display this help text
  -v       use verbose output
  -V       display the version and exit

执行更新命令,下载速度看网络情况,本文将文件下载到 /mnt/data/geolite2/目录 。

$ ll /mnt/data/geolite2/ && cd $_
总用量 0
$ sudo /usr/local/bin/geoipupdate -d /mnt/data/geolite2/ -v
$ ll
总用量 34088
-rw-r--r--. 1 root root 32553611 12月 19 18:14 GeoLite2-City.mmdb
-rw-r--r--. 1 root root  2349406 12月 19 18:14 GeoLite2-Country.mmdb

如何配置计划任务定时更新 GeoLite2 数据库请自行解决。

三、安装 GeoLite2 API 调用程序

官方提供 .NET (C#)、C、Java、Perl、Python、Apache API调用。其他第三方接口也有,但官方不提供技术支持,详情点击这里。

本文使用 C 语言API接口进行调用测试,为下篇文章Nginx与GeoIP2配合做铺垫。其他语言请参考官方指导自行解决!C语言API GitHub 下载地址

$ sudo wget https://github.com/maxmind/libmaxminddb/releases/download/1.0.3/libmaxminddb-1.0.3.tar.gz
$ sudo tar xzvf libmaxminddb-1.0.3.tar.gz
$ cd libmaxminddb-1.0.3
$ sudo ./configure
$ sudo make
$ sudo make install
$ sudo ldconfig

查看帮助文档

$ /usr/local/bin/mmdblookup --help

  mmdblookup --file /path/to/file.mmdb --ip 1.2.3.4 [path to lookup]

  This application accepts the following options:

      --file (-f)     The path to the MMDB file. Required.

      --ip (-i)       The IP address to look up. Required.

      --verbose (-v)  Turns on verbose output. Specifically, this causes this
                      application to output the database metadata.

      --version       Print the program's version number and exit.

      --help (-h -?)  Show usage information.

  If an IP's data entry resolves to a map or array, you can provide
  a lookup path to only show part of that data.

  For example, given a JSON structure like this:

    {
        "names": {
             "en": "Germany",
             "de": "Deutschland"
        },
        "cities": [ "Berlin", "Frankfurt" ]
    }

  You could look up just the English name by calling mmdblookup with a lookup path of:

    mmdblookup --file ... --ip ... names en

  Or you could look up the second city in the list with:

    mmdblookup --file ... --ip ... cities 1

  Array numbering begins with zero (0).

  If you do not provide a path to lookup, all of the information for a given IP
  will be shown.
四、测试

1、获取国家信息,国家信息是正确滴,看着像乱码的地方是显示的俄语!

$ /usr/local/bin/mmdblookup --file /mnt/data/geolite2/GeoLite2-Country.mmdb --ip 112.225.35.70

  {
    "continent": 
      {
        "code": 
          "AS" <utf8_string>
        "geoname_id": 
          6255147 <uint32>
        "names": 
          {
            "de": 
              "Asien" <utf8_string>
            "en": 
              "Asia" <utf8_string>
            "es": 
              "Asia" <utf8_string>
            "fr": 
              "Asie" <utf8_string>
            "ja": 
              "アジア" <utf8_string>
            "pt-BR": 
              "Ásia" <utf8_string>
            "ru": 
              "Азия" <utf8_string>
            "zh-CN": 
              "亚洲" <utf8_string>
          }
      }
    "country": 
      {
        "geoname_id": 
          1814991 <uint32>
        "iso_code": 
          "CN" <utf8_string>
        "names": 
          {
            "de": 
              "China" <utf8_string>
            "en": 
              "China" <utf8_string>
            "es": 
              "China" <utf8_string>
            "fr": 
              "Chine" <utf8_string>
            "ja": 
              "中国" <utf8_string>
            "pt-BR": 
              "China" <utf8_string>
            "ru": 
              "Китай" <utf8_string>
            "zh-CN": 
              "中国" <utf8_string>
          }
      }
    "registered_country": 
      {
        "geoname_id": 
          1814991 <uint32>
        "iso_code": 
          "CN" <utf8_string>
        "names": 
          {
            "de": 
              "China" <utf8_string>
            "en": 
              "China" <utf8_string>
            "es": 
              "China" <utf8_string>
            "fr": 
              "Chine" <utf8_string>
            "ja": 
              "中国" <utf8_string>
            "pt-BR": 
              "China" <utf8_string>
            "ru": 
              "Китай" <utf8_string>
            "zh-CN": 
              "中国" <utf8_string>
          }
      }
  }

2、获取城市信息,这个数据就有点纠结了,省份没有问题,城市是有问题的! 官方演示地址 非常精准,也许这就是免费和收费的差别 :)

$ /usr/local/bin/mmdblookup --file /mnt/data/geolite2/GeoLite2-City.mmdb --ip 112.225.35.70 
  {
    "city": 
      {
        "geoname_id": 
          1805753 <uint32>
        "names": 
          {
            "de": 
              "Jinan" <utf8_string>
            "en": 
              "Jinan" <utf8_string>
            "es": 
              "Jinan" <utf8_string>
            "fr": 
              "Jinan" <utf8_string>
            "ja": 
              "済南市" <utf8_string>
            "pt-BR": 
              "Jinan" <utf8_string>
            "ru": 
              "Цзинань" <utf8_string>
            "zh-CN": 
              "济南" <utf8_string>
          }
      }
    "continent": 
      {
        "code": 
          "AS" <utf8_string>
        "geoname_id": 
          6255147 <uint32>
        "names": 
          {
            "de": 
              "Asien" <utf8_string>
            "en": 
              "Asia" <utf8_string>
            "es": 
              "Asia" <utf8_string>
            "fr": 
              "Asie" <utf8_string>
            "ja": 
              "アジア" <utf8_string>
            "pt-BR": 
              "Ásia" <utf8_string>
            "ru": 
              "Азия" <utf8_string>
            "zh-CN": 
              "亚洲" <utf8_string>
          }
      }
    "country": 
      {
        "geoname_id": 
          1814991 <uint32>
        "iso_code": 
          "CN" <utf8_string>
        "names": 
          {
            "de": 
              "China" <utf8_string>
            "en": 
              "China" <utf8_string>
            "es": 
              "China" <utf8_string>
            "fr": 
              "Chine" <utf8_string>
            "ja": 
              "中国" <utf8_string>
            "pt-BR": 
              "China" <utf8_string>
            "ru": 
              "Китай" <utf8_string>
            "zh-CN": 
              "中国" <utf8_string>
          }
      }
    "location": 
      {
        "latitude": 
          36.668300 <double>
        "longitude": 
          116.997200 <double>
        "time_zone": 
          "Asia/Shanghai" <utf8_string>
      }
    "registered_country": 
      {
        "geoname_id": 
          1814991 <uint32>
        "iso_code": 
          "CN" <utf8_string>
        "names": 
          {
            "de": 
              "China" <utf8_string>
            "en": 
              "China" <utf8_string>
            "es": 
              "China" <utf8_string>
            "fr": 
              "Chine" <utf8_string>
            "ja": 
              "中国" <utf8_string>
            "pt-BR": 
              "China" <utf8_string>
            "ru": 
              "Китай" <utf8_string>
            "zh-CN": 
              "中国" <utf8_string>
          }
      }
    "subdivisions": 
      [
        {
          "geoname_id": 
            1796328 <uint32>
          "iso_code": 
            "37" <utf8_string>
          "names": 
            {
              "en": 
                "Shandong Sheng" <utf8_string>
              "zh-CN": 
                "山东省" <utf8_string>
            }
        }
      ]
  }

测试IP1:112.225.35.70 山东省青岛市,定位错误。

测试IP2:115.29.113.101 浙江省杭州市,定位正确。

测试IP3:112.124.127.64 浙江省杭州市,定位正确。

测试IP4:180.153.214.152 上海市,定位正确。

因为获取的数据是 Json 格式,所以根据帮助文档提示可以对内容进行格式化输出,如输出城市数据库中 city->names->zh-CN 内容

$ /usr/local/bin/mmdblookup --file /mnt/data/geolite2/GeoLite2-City.mmdb --ip 112.225.35.70 city names zh-CN

  "济南" <utf8_string>

获取省份要注意一点,省份是个数组,无意中发现每个版本的获取方式还不一样,注意版本区别!

$ /usr/local/bin/mmdblookup --file /mnt/data/geolite2/GeoLite2-City.mmdb --ip 112.225.35.70 subdivisions 0 names en

  "Shandong Sheng" <utf8_string>

虽然 GeoIP2 免费数据库在城市定位分析的不是很理想,但对我来说精度可以接受,聊胜于无嘛! 

企业运维实践-Nginx使用geoip2模块并利用MaxMind的GeoIP2数据库实现处理不同国家或城市的访问最佳... 描述: 为了实现根据访问者访问我们的网站时根据其IP显示其所属地,也为获取不同地区访问者的IP地址等相关信息为目的,所以在搜索引擎中查找解决方案,在网络上查询到如下几种方案Nginx+GeoIP2、使用收费 IP 识别接口、DNS 根据地域解析,然后经过多方面考究,最终还是使用Nginx+GeoIP2解决方案。三种解决方案优缺点可以拿到请求 IP 的国家和城市信息然后进行各种个性化 Nginx 配置可以将请求 IP 的地理位置通过 php-fpm 传递 php 程序。... 阅读详情

相关推荐

GeoLiteCity.dat 新版

本地IP定位GeoLiteCity.dat离线文件,可以定位到区域,包括国家、城市、区域和经纬度信息,以及两点之间的距离

GeoIP2:检验IP地址位置识别的实用性

GeoIP2是一种被广泛使用的IP地址定位技术,它可以根据用户的IP地址确定其所在的地理位置信息。无论是网络安全还是市场营销等领域,GeoIP2都是一个非常实用的工具。因为它易于使用,所以它经常被外贸等行业广泛应用。由于之前,我也有了相关的需求,也是开始测试各种定位相关的工具。这个工具的测试,是在我写通过API限制城市之前。为了避免忘记,我将记录下测试Geoip2的过程整理后,与大家分享。希望这篇文章可以对需要定位IP地址的读者有所帮助。从上面的演示场景中,应该可以看到Geoip2的基本用法。

漠效的博客 4855

GeoLiteCity.dat

GeoLiteCity.dat离线文件,可以定位到区域,包括国家、城市、区域和经纬度信息,以及两点之间的距离。用Python调用时可以使用

基于Geoip2实现Nginx拦截国外IP访问网站

最近公司上线了一个APP,过段时间发现告警群总有些莫名的异常,通过排查发现是被攻击了,并且攻击IP全是国外的,基于APP业务全在国内,最简单办法就是屏蔽这些IP。云上虽有产品但收费,自己动手才是王道。实现方法需要使用到ngx_http_geoip2模块,对于未装过Nginx环境的步骤可以参考阿里云上的一篇文章。如果对于已经有Nginx情况下再添加新模块,过程会有些不一样,当初在配置时还是踩了一些坑。所以本文重点是介绍已有Nginx情况怎么升级。

caizi1288的专栏 2328

GeoIP2-City.mmdb.gz

全球ip转换经纬度库

GeoLiteCity.dat.zip

GeoLiteCity.dat离线文件,可以定位到区域,包括国家、城市、区域和经纬度信息,以及两点之间的距离。用Python调用时可以使用

Graylog分析Nginx日志并通过GeoIP2获取访问者IP的地理位置信息

简介: Graylog相对于ELK是较为轻量级的日志管理平台 Graylog官网:https://×××w.graylog.org/ Graylog-server:Graylog接收来自后端各种应用程序的日志并提供Web访问接口 Graylog Collector Sidecar:负责收集应用程序日志并发送至Graylog-server Elasticsearch:用于索引和保存接收到的日...

weixin_34220963的博客 1073

InVEST模型实战指南:从水源涵养到热岛缓解的生态系统服务评估

本文提供了InVEST模型的实战指南,详细介绍了从环境搭建、数据预处理到核心模型应用的完整流程。通过水源涵养、碳存储、土壤保持和城市热岛缓解等核心模型的拆解,帮助生态学者与规划者系统量化评估生态系统服务,将复杂的生态价值转化为直观的空间数据与地图,为科学决策提供有力支撑。

weixin_29197051的博客 430

geoip java api zh cn_通过GeoIP2分析访问者IP获取地理位置信息

MaxMind GeoIP2 服务能识别互联网用户的地点位置与其他特征,应用广泛,包括个性化定制内容、诈欺检测、广告定向、网站流量分析、执行规定、地理目标定位、地理围栏定位 (geo-fencing)以及数字版权管理。目前使用 GeoIP 更多是配合Nginx或Apache服务器进行日志分析获取网站访问量地域分布状况。GeoIP 分为商业版和免费版,免费版比商业版精度差了许多,经测试对于城市定位确...

weixin_32515741的博客 536

Python主要智能优化算法库汇总

最近几年简单浏览和对比了一些智能算法的库。现将各种库的主要信息、相关优缺点简单整理如下,各位同学可根据自己的需求和喜好进行选择。 文章目录1、DEAP2、mealpy3、scikit-opt (国产良心)4、Geat2(国产用心)5、pygmo26、pyswarms7、SciPy(想不到吧)小结 1、DEAP 项目地址:https://github.com/DEAP/deap 安装: pip install deap 优点: 起点高,发表在Journal of Machine Learning Rese

半个冯博士 2万+

Cadence电路原理图全部变成黄色如何解决?

Cadence电路原理图全部变成黄色如何解决?现象:解决方法: 最近用cadence仿真锁相环,拷贝师哥的library后打开,发现schematic中全部变成了黄色,但可以正常修改元件参数,正常仿真。仅仅影响使用效果,看起来超级难受。 现象: 1.电路元件及连线全部变为黄色 2.可以正常修改参数,电路ADE仿真 如下图所示: 解决方法: 重新导入display.drf文件,步骤如下: tool——Display Resource Manager,截图如下 完成上述步骤,显示如下界面,选择Merge选项

virtuoso~晓晓 1万+
上一篇: Nginx 因 Selinux 服务导致无法远程访问
下一篇: Log4j xml 配置方式
王吉军
博客等级 码龄19年 94粉丝 56原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值