通过GeoIP2分析访问者IP获取地理位置信息
原文链接: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接口进行调用测试,为下篇文章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 免费数据库在城市定位分析的不是很理想,但对我来说精度可以接受,聊胜于无嘛!
通过GeoIP2分析访问者IP获取地理位置信息的更多相关文章
- 通过ip获取地理位置信息
http://ipinfo.io/developers 直接使用get请求 url: http://ipinfo.io/json 即可获得json数据
- [日志分析]Graylog2进阶之获取Nginx来源IP的地理位置信息
如果你们觉得graylog只是负责日志收集的一个管理工具,那就too young too naive .日志收集只是graylog的最最基础的用法,graylog有很多实用的数据清洗和处理的进阶用法. ...
- PHP通过IP 获取 地理位置(实例)
发布:JB02 来源:脚本学堂 分享一例php代码,实现通过IP地址获取访问者的地理位置,在php编程中经常用到,有需要的朋友参考下吧.本节内容:PHP通过IP获取地理位置 例子: 复制代码代码 ...
- PHP通过IP 获取 地理位置(实例代码)
发布:JB02 来源:脚本学堂 分享一例php代码,实现通过IP地址获取访问者的地理位置,在php编程中经常用到,有需要的朋友参考下吧.本节内容:PHP通过IP获取地理位置 例子: 复制代码代码示 ...
- HTML5 获取地理位置信息
HTML5增加的新功能,获取地理位置信息,如果浏览器支持且设备有定位功能,就能够直接使用这组API来获取当前信息位置.该Geolocation API可以应用于移动设备中的地理位置. Geolocat ...
- Html5 Geolocation获取地理位置信息
Html5中提供了地理位置信息的API,通过浏览器来获取用户当前位置.基于此特性可以开发基于位置的服务应用.在获取地理位置信息前,首先浏览器都会向用户询问是否愿意共享其位置信息,待用户同意后才能使用. ...
- AngularJS进阶(二十)HTML5实现获取地理位置信息并定位功能
HTML5实现获取地理位置信息并定位功能 注:请点击此处进行充电! 前言 这篇文章主要介绍了HTML5实现获取地理位置信息并定位功能,本文讲解了原生HTML5.百度地图.谷歌地图等三种获取理位置信息并 ...
- html5实现获取地理位置信息并定位
这里主要讲h5实现获取地理位置信息并定位功能,本文讲解了原生h5,百度地图,谷歌地图等三种获取地理信息并定位的方法,需要的朋友可以参考下: h5提供了地理位置功能(Geolocation API),能 ...
- html5获取地理位置信息API
html5获取地理位置信息API 在HTML5中,可以看下如何使用Geolocation API来获得用户的地理位置信息,如果该浏览器支持的话,且设备具有定位功能,就能够直接使用这组API来获取当前位 ...
随机推荐
- 【Masonry】使用技巧 - 篇一
从别人项目得到的灵感 : 请看以下代码 UIColor *darkColor = [UIColor colorWithHexString:@"0x28303b"]; // 1. 确 ...
- Kakfa
Kakfa分布式集群搭建 本位以最新版本kafka_2.11-0.10.1.0版本讲述分布式kafka集群环境的搭建过程.服务器列表: 1 2 3 172.31.10.1 172.31.10.2 17 ...
- 华为p7怎么打开usb调试模式
在应用程序列表中选择[设置]进入系统设置菜单,点击[关于手机]  2.在"版本号"上面连续点击七次:  3.现在返回"设置"界面,发现多了一个"开 ...
- hdu 2629 Identity Card (字符串解析模拟题)
这题是一个字符串模拟水题,给12级学弟学妹们找找自信的,嘿嘿; 题目意思就是要你讲身份证的上的省份和生日解析出来输出就可以了: http://acm.hdu.edu.cn/showproblem.ph ...
- Careercup - Google面试题 - 6407924087783424
2014-05-07 15:17 题目链接 原题: Given an array of n elements (a1,a2,..ai,...,an). You are allow to chose a ...
- hibernate.cfg.xml 配置(摘录)
配置文件中映射元素详解 对象关系的映射是用一个XML文档来说明的.映射文档可以使用工具来生成,如XDoclet,Middlegen和AndroMDA等.下面从一个映射的例子开始讲解映射元素,映射文件的 ...
- 代码复用 -- 深入了解javascript
/* 代码复用 */ /* 一.避免 */ /* 模式1:默认模式 */ function Parent() { this.name = "123"; } Parent.proto ...
- SQL-AdventureWorks样例数据库
1. 下载样例数据库文件 输入网址:http://www.codeplex.com/ , 搜索:microsoft sql server product samples 下载对应数据库的Adventu ...
- ubuntu重置root密码
from: http://mmicky.blog.163.com/blog/static/150290154201398113034698/ 使用ubuntu的时候忘记了root密码该如何重置?我使用 ...
- Codeforces Round #FF (Div. 1) A. DZY Loves Sequences
题目链接: http://www.codeforces.com/contest/446/problem/A 题解: dp1[x]表示以x结尾的最大严格升序连续串,dp2[x]表示以x开头的最大严格升序 ...