赞
踩
目前几乎各种平台都被要求显示发文作者所在地区信息,不管是发表文章、视频、还是评论等,都明确要求显示地区信息。而通过IP地址查询所属归属地,自然而然就成为了一个可行的实现方案。
花钱的方案:网上一搜一大片,各种档次的收费api支持;
免费的方案:
通过爬虫的方式爬取一些ip查询网站的查询结果(容易被封,且如果对方网站有更新无法及时做出响应);
寻找一些开源项目支持;(本文选择此方案,开源项目用的是Ip2Region)
ip2region介绍:
一个离线ip位置定位库和ip定位数据管理框架,10微秒级的查询效率,提供主流编程语言的xdb数据生成和查询客户端实现。
离线库xdb文件(具体文件可从项目地址中的data目录下找到并下载,项目地址见文末)大小约11MB。
Region默认格式:国家|区域|省份|城市|ISP,区域信息默认为0。Region信息支持自定义。
java(jdk8)+maven
注:ip2region支持各种主流语言,本文中只是使用了java的版本
pom.xml中引入ip2region依赖:
- <dependency>
- <groupId>org.lionsoul</groupId>
- <artifactId>ip2region</artifactId>
- <version>2.7.0</version>
- </dependency>
代码实现:
- public class IP2RegionTest {
- public static void main(String[] args) {
- String xdbPath = "C:\\tmp\\ip2region.xdb";
- // 1、创建Searcher对象
- Searcher searcher = null;
- try {
- // 第一种方式:通过离线文件路径创建Searcher,注:如果是并发使用,每个线程需要创建一个searcher而不是共用,否则会有线程安全问题
- //searcher = Searcher.newWithFileOnly(xdbPath);
- // 第二种方式:使用vIndex创建Searcher,如果是并发使用,每个线程需要创建一个searcher而不是共用,否则会有线程安全问题
- byte[] buff = Searcher.loadContentFromFile(xdbPath);
- // searcher = Searcher.newWithVectorIndex(xdbPath, buff);
- // 第三种方式:缓存整个xdb数据,可用于并发使用的场景,也就是每个线程可共享一个searcher,
- searcher = Searcher.newWithBuffer(buff);
- } catch (IOException e) {
- e.printStackTrace();
- return;
- }
- // 2、查询ip归属地
- // String ip = "114.112.77.166";//国内
- String ip = "23.103.134.95";//国外
- try {
- long start = System.nanoTime();
- String region = searcher.search(ip);
- long cost = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - start);
- System.out.printf("{region:%s, ioCount:%d, took: %d us}\n", region, searcher.getIOCount(), cost);
- } catch (Exception e) {
- e.printStackTrace();
- }
-
- // 3、关闭资源
- try {
- searcher.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }

输出:
以上为离线调用的方式,亲自国内、国外ip的支持都比较友好,准确率也挺高(据说有99.9%)。
如果想要实现ip库的更新,请参考官网中的介绍
ip2region项目地址:
github:ip2region的githup
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。