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

2016-08-10 10:27:12来源:oschina作者:twist_fate人点击

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


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


一、免费版本介绍:


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


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


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


[plain]view plaincopy



在CODE上查看代码片派生到我的代码片

$du-sh*%20
%2032MGeoLite2-City.mmdb%20
%202.3MGeoLite2-Country.mmdb%20
%2018MGeoLiteCity.dat%20
%20732KGeoLiteCountry.dat%20

City%20文件为包含城市信息数据库,Country%20文件为国家信息数据库。

%20

%20

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

%20

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

%20

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

%20

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

%20

[plain]view%20plaincopy

%20

%20

派生到我的代码片

$sudomkdir-p/mnt/data/geolite2&&cd$_%20
%20$sudowgethttp://geolite.maxmind.com/download/geoip/database/GeoLite2-City.mmdb.gz%20
%20$sudogzip-dGeoLite2-City.mmdb.gz%20
%20$sudowgethttp://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.mmdb.gz%20
%20$sudogzip-dGeoLite2-Country.mmdb.gz%20

%20

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

%20

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

%20

[plain]view%20plaincopy

%20

%20

派生到我的代码片

$sudoyuminstalllibcurl-devel-y%20
%20$sudowgethttps://github.com/maxmind/geoipupdate/releases/download/v2.1.0/geoipupdate-2.1.0.tar.gz%20
%20$sudotarxzvfgeoipupdate-2.1.0.tar.gz%20
%20$cdgeoipupdate-2.1.0%20
%20$sudo./configure%20
%20$sudomake%20
%20$sudomakeinstall%20

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

%20

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

%20

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

%20

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

%20

[plain]view%20plaincopy

%20

%20

派生到我的代码片

#ThefollowingUserIdandLicenseKeyarerequiredplaceholders:%20
%20UserId999999%20
%20LicenseKey000000000000#IncludeoneormoreofthefollowingProductIds:%20
%20#*GeoLite2-City-GeoLite2City%20
%20#*GeoLite2-Country-GeoLite2Country%20
%20#*506-GeoLiteLegacyCountry%20
%20#*517-GeoLiteLegacyASN%20
%20#*533-GeoLiteLegacyCity#dat格式数据库%20
%20#ProductIdsGeoLite2-CityGeoLite2-Country506533#mmdb格式数据库%20
%20ProductIdsGeoLite2-CityGeoLite2-Country132106%20

c、执行更新

%20

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

%20

%20

[plain]view%20plaincopy

%20

%20

派生到我的代码片

$/usr/local/bin/geoipupdate-h%20
%20Usage:geoipupdate[-Vhv][-flicense_file][-dcustomdirectory]-dDIRstoredownloadedfilesinDIR%20
%20-fFILEuseconfigurationfoundinFILE(seeGeoIP.conf(5)manpage)%20
%20-hdisplaythishelptext%20
%20-vuseverboseoutput%20
%20-Vdisplaytheversionandexit%20

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

%20

[plain]view%20plaincopy

%20

%20

派生到我的代码片

$ll/mnt/data/geolite2/&&cd$_%20
%20总用量0%20
%20$sudo/usr/local/bin/geoipupdate-d/mnt/data/geolite2/-v%20
%20$ll%20
%20总用量34088%20
%20-rw-r--r--.1rootroot3255361112月1918:14GeoLite2-City.mmdb%20
%20-rw-r--r--.1rootroot234940612月1918:14GeoLite2-Country.mmdb%20

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

%20

三、安装GeoLite2API%20调用程序

%20

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

%20

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

%20

%20

[plain]view%20plaincopy

%20

%20

派生到我的代码片

$sudowgethttps://github.com/maxmind/libmaxminddb/releases/download/1.0.3/libmaxminddb-1.0.3.tar.gz%20
%20$sudotarxzvflibmaxminddb-1.0.3.tar.gz%20
%20$cdlibmaxminddb-1.0.3%20
%20$sudo./configure%20
%20$sudomake%20
%20$sudomakeinstall%20
%20$sudoldconfig%20

查看帮助文档

%20

[plain]view%20plaincopy

%20

%20

派生到我的代码片

$/usr/local/bin/mmdblookup--helpmmdblookup--file/path/to/file.mmdb--ip1.2.3.4[pathtolookup]Thisapplicationacceptsthefollowingoptions:--file(-f)ThepathtotheMMDBfile.Required.--ip(-i)TheIPaddresstolookup.Required.--verbose(-v)Turnsonverboseoutput.Specifically,thiscausesthis%20
%20applicationtooutputthedatabasemetadata.--versionPrinttheprogram'sversionnumberandexit.--help(-h-?)Showusageinformation.IfanIP'sdataentryresolvestoamaporarray,youcanprovide%20
%20alookuppathtoonlyshowpartofthatdata.Forexample,givenaJSONstructurelikethis:{%20
%20"names":{%20
%20"en":"Germany",%20
%20"de":"Deutschland"%20
%20},%20
%20"cities":["Berlin","Frankfurt"]%20
%20}YoucouldlookupjusttheEnglishnamebycallingmmdblookupwithalookuppathof:mmdblookup--file...--ip...namesenOryoucouldlookupthesecondcityinthelistwith:mmdblookup--file...--ip...cities1Arraynumberingbeginswithzero(0).Ifyoudonotprovideapathtolookup,alloftheinformationforagivenIP%20
%20willbeshown.%20

四、测试

%20

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

%20

[plain]view%20plaincopy

%20

%20

派生到我的代码片

$/usr/local/bin/mmdblookup--file/mnt/data/geolite2/GeoLite2-Country.mmdb--ip112.225.35.70{%20
%20"continent":%20
%20{%20
%20"code":%20
%20"AS"%20
%20"geoname_id":%20
%206255147%20
%20"names":%20
%20{%20
%20"de":%20
%20"Asien"%20
%20"en":%20
%20"Asia"%20
%20"es":%20
%20"Asia"%20
%20"fr":%20
%20"Asie"%20
%20"ja":%20
%20"アジア"%20
%20"pt-BR":%20
%20"Ásia"%20
%20"ru":%20
%20"Азия"%20
%20"zh-CN":%20
%20"亚洲"%20
%20}%20
%20}%20
%20"country":%20
%20{%20
%20"geoname_id":%20
%201814991%20
%20"iso_code":%20
%20"CN"%20
%20"names":%20
%20{%20
%20"de":%20
%20"China"%20
%20"en":%20
%20"China"%20
%20"es":%20
%20"China"%20
%20"fr":%20
%20"Chine"%20
%20"ja":%20
%20"中国"%20
%20"pt-BR":%20
%20"China"%20
%20"ru":%20
%20"Китай"%20
%20"zh-CN":%20
%20"中国"%20
%20}%20
%20}%20
%20"registered_country":%20
%20{%20
%20"geoname_id":%20
%201814991%20
%20"iso_code":%20
%20"CN"%20
%20"names":%20
%20{%20
%20"de":%20
%20"China"%20
%20"en":%20
%20"China"%20
%20"es":%20
%20"China"%20
%20"fr":%20
%20"Chine"%20
%20"ja":%20
%20"中国"%20
%20"pt-BR":%20
%20"China"%20
%20"ru":%20
%20"Китай"%20
%20"zh-CN":%20
%20"中国"%20
%20}%20
%20}%20
%20}%20

%20

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

%20

%20

[plain]view%20plaincopy

%20

%20

派生到我的代码片

$/usr/local/bin/mmdblookup--file/mnt/data/geolite2/GeoLite2-City.mmdb--ip112.225.35.70%20
%20{%20
%20"city":%20
%20{%20
%20"geoname_id":%20
%201805753%20
%20"names":%20
%20{%20
%20"de":%20
%20"Jinan"%20
%20"en":%20
%20"Jinan"%20
%20"es":%20
%20"Jinan"%20
%20"fr":%20
%20"Jinan"%20
%20"ja":%20
%20"済南市"%20
%20"pt-BR":%20
%20"Jinan"%20
%20"ru":%20
%20"Цзинань"%20
%20"zh-CN":%20
%20"济南"%20
%20}%20
%20}%20
%20"continent":%20
%20{%20
%20"code":%20
%20"AS"%20
%20"geoname_id":%20
%206255147%20
%20"names":%20
%20{%20
%20"de":%20
%20"Asien"%20
%20"en":%20
%20"Asia"%20
%20"es":%20
%20"Asia"%20
%20"fr":%20
%20"Asie"%20
%20"ja":%20
%20"アジア"%20
%20"pt-BR":%20
%20"Ásia"%20
%20"ru":%20
%20"Азия"%20
%20"zh-CN":%20
%20"亚洲"%20
%20}%20
%20}%20
%20"country":%20
%20{%20
%20"geoname_id":%20
%201814991%20
%20"iso_code":%20
%20"CN"%20
%20"names":%20
%20{%20
%20"de":%20
%20"China"%20
%20"en":%20
%20"China"%20
%20"es":%20
%20"China"%20
%20"fr":%20
%20"Chine"%20
%20"ja":%20
%20"中国"%20
%20"pt-BR":%20
%20"China"%20
%20"ru":%20
%20"Китай"%20
%20"zh-CN":%20
%20"中国"%20
%20}%20
%20}%20
%20"location":%20
%20{%20
%20"latitude":%20
%2036.668300%20
%20"longitude":%20
%20116.997200%20
%20"time_zone":%20
%20"Asia/Shanghai"%20
%20}%20
%20"registered_country":%20
%20{%20
%20"geoname_id":%20
%201814991%20
%20"iso_code":%20
%20"CN"%20
%20"names":%20
%20{%20
%20"de":%20
%20"China"%20
%20"en":%20
%20"China"%20
%20"es":%20
%20"China"%20
%20"fr":%20
%20"Chine"%20
%20"ja":%20
%20"中国"%20
%20"pt-BR":%20
%20"China"%20
%20"ru":%20
%20"Китай"%20
%20"zh-CN":%20
%20"中国"%20
%20}%20
%20}%20
%20"subdivisions":%20
%20[%20
%20{%20
%20"geoname_id":%20
%201796328%20
%20"iso_code":%20
%20"37"%20
%20"names":%20
%20{%20
%20"en":%20
%20"ShandongSheng"%20
%20"zh-CN":%20
%20"山东省"%20
%20}%20
%20}%20
%20]%20
%20}%20

%20

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

%20

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

%20

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

%20

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

%20

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

%20

%20

[plain]view%20plaincopy

%20

%20

派生到我的代码片

$/usr/local/bin/mmdblookup--file/mnt/data/geolite2/GeoLite2-City.mmdb--ip112.225.35.70citynameszh-CN"济南"


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



[plain]view plaincopy


$/usr/local/bin/mmdblookup--file/mnt/data/geolite2/GeoLite2-City.mmdb--ip112.225.35.70subdivisions0namesen"ShandongSheng"


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

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台