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

标签: geoip2 分析 访问 | 发表时间:2014-12-20 03:53 | 作者:johnnycode
出处:http://blog.csdn.net

原文链接:http://blog.csdn.net/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接口进行调用测试,其他语言请参考官方指导自行解决! 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

查看帮助文档

$ /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.
四、测试

测试IP:112.225.35.70 山东省青岛市 联通

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>
            }
        }
      ]
  }

因为获取的数据是 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>

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

作者:johnnycode 发表于2014-12-19 19:53:14 原文链接
阅读:6 评论:0 查看评论

相关 [geoip2 分析 访问] 推荐:

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

- - CSDN博客推荐文章
原文链接:http://blog.csdn.net/johnnycode/article/details/42028841. MaxMind GeoIP2 服务能识别互联网用户的地点位置与其他特征,应用广泛,包括个性化定制内容、诈欺检测、广告定向、网站流量分析、执行规定、地理目标定位、地理围栏定位 (geo-fencing)以及数字版权管理.

一个 redis 异常访问引发 oom 的案例分析

- - mindwind
「推断的前提是以事实为依据. 这两天碰到一个线上系统的偶尔出现突然堆内存暴涨,这倒不是个什么疑难杂症, 只是过程中有些思路觉得可以借鉴参考,故总结下并写下来. 内存情况可以看看下面这张监控图. 一天偶尔出现几次,持续时间一般几分钟不等. 当这种情况出现时,我们检查错误日志,发现有下面两几种 OOM 错误.

Google和SugarSync访问异常

- Freeman - 月光博客
  今天下午,Https的Google出现了短时间的访问异常,国内各地网友发现其访问出现不稳定状态,有时可以访问,有时无法访问.   这对中国用户最直接的影响是,很多用户无法访问Https版Google Reader,还有一些用户无法登录Gmail邮箱.   今天的另一个坏消息是,知名美国云存储服务SugarSync网站的域名被关键字屏蔽,目前已经无法从中国访问,虽然SugarSync的上传速度比起Dropbox还有差距,但至少美国的服务用起来放心一些,早先云存储服务Dropbox被屏蔽时不少网友转到了SugarSync这个服务,不过值得庆幸的是,该服务的电脑客户端和iPhone手机端都可以正常使用,上传和下载文件都没有问题.

昨天访问了李娜

- sg - 咆哮女郎柏邦妮
昨天访问李娜,当然也见到了姜山. 体育界人士,原本不在我专业范围内,但是有一种朴素的好奇. 当世的一流高手,是怎么样的状态. 拄着网球拍,坐在镜头前,如沉渊一样深静. 环抱着网球拍,像剑客抱着自己的剑,有一种不怒而威的自信. 在镜头前走动,跑动,是不擅拍照人的青涩,. 但是表演挥拍动作时,几万个小时的积累就化作了自然,.

HBase 之访问控制

- gengmao - Trend Micro CDC SPN Team
构建和运维HBase集群是一个非常有挑战性的工作. HBase凭借其在海量数据的良好的扩展性和高效的读写能力,受到越来越多公司的重视. 在公司里,HBase越来越受欢迎. 希望通过HBase读写数据的产品越来越多,在兴奋之余,头疼的问题也来了. 毕竟,作为线上的产品,我们不希望过多人随意的访问,会照成很多潜在的风险,比如误删,误操作.

修改Hosts访问Twitter/Facebook

- cheng - 启光博客
  以前没感觉Facebook多么特别,最近又玩了一些日子,感觉还不错. 因为关注Facebook所以对最新Hosts比较关注,今天发现一个网友整理的,测试可直接使用. 虽然一直在文章中说以后不再发布类似的文章,不过没忍住,网友低调点使用吧,希望对经常访问Twitter与Facebook的网友有此帮助.

微软Hotmail无法访问

- Tim - 月光博客
  今天上午,世界最大的电子邮件服务之一:微软Hotmail出现了大规模长时间无法访问的状况,同时无法访问的还有微软的SkyDrive等服务.   通过对其域名的测试发现,Hotmail的域名在某些地区无法解析出IP地址,Ping不通,其NS服务器同样也Ping不通,怀疑有可能宕机.   中午时候,微软在Hotmail官方Twitter发布声明称,因为停电的原因导致Hotmail、SkyDrive等服务故障,目前正在积极努力的解决这个问题.

Linux可访问性现状

- - Solidot
一位有计算机科学学位的盲人Robert Cole在DistroWatch Weekly上发表文章谈论Linux对残障人士的可访问性. 他说,Linux为视力残障人士提供了大量优秀的软件,相比之下Windows盲人用户如果想使用上类似的工具至少要花600美元. 他使用Linux已将近7年,有5年只用Linux.

Android_ContentProvider_访问通讯录

- - CSDN博客推荐文章
本博文为子墨原创,转载请注明出处. 联系人提供者是一个很强很灵活的应用组件,用来管理联系人信息,可以方便的操作和查询联系人信息. 主要的3张表格,contact,raw contact,data,但是我们操作主要为raw contact,data两张表. /** * 使用批处理,插入联系人信息 * 插入姓名,email,家庭电话,工作电话,手机号码信息 * @param view */ public void insert() {.

Nginx并发访问优化

- - CSDN博客推荐文章
    Nginx反向代理并发能力的强弱,直接影响到系统的稳定性. 安装Nginx过程,默认配置并不涉及到过多的并发参数,作为产品运行,不得不考虑这些因素. Nginx作为产品运行,官方建议部署到Linux64位系统,基于该建议,本文中从系统线之上考虑Nginx的并发优化.     1、打开Linux系统epoll支持.