Python如何通过ip2region解析IP获得地域信息
作者:亿万行代码的梦 发布时间:2021-08-02 12:59:04
通过ip2region解析IP获得地域信息
目标,从给的读取给的ip地址文件解析出ip地域名并输出CSV文件,我选用的是开源ip2region。ip2region地址
下载好后直接用pycharm打开,因为我用的是python所以其他语言我就忽略了。
这里我对代码进行了编辑从而实现自己的目的。
主要对benchmark.py进行了修改。
代码如下:
import threading
import time, sys
from ip2Region import Ip2Region
class BenchmarkThread(threading.Thread):
__searcher = None
__lock = None
def __init__(self, searcher, lock):
self.__searcher = searcher
self.__lock = lock
threading.Thread.__init__(self)
def run(self):
#输入路径,每行为一个IP地址
for IP in open("D:\****\****.txt"):
self.__lock.acquire()
try:
data = self.__searcher.memorySearch(IP)
region=str(data["region"].decode('utf-8'))
#print(region.split("|"))
city=""
province=""
regions=region.split("|")
if(regions[3]=="0"):
city=""
else:
city=regions[3]
if (regions[2] == "0"):
province = ""
else:
province = regions[2]
print(IP.strip()+","+regions[0]+province+city+regions[4])
result=IP.strip()+","+regions[0]+province+city+" "+regions[4]
with open('*****.csv', 'a') as f: # 设置文件对象
f.write(result+"\n")
finally:
self.__lock.release()
if __name__ == "__main__":
dbFile = "D:\pythonProject\hx_hdfs_local\ip2region-master\data\ip2region.db"
if ( len(sys.argv) > 2 ):
dbFile = sys.argv[1];
threads = []
searcher = Ip2Region(dbFile)
lock = threading.Lock()
for i in range(1):
t = BenchmarkThread(searcher, lock)
threads.append(t)
sTime = time.time() * 1
for t in threads:
t.start()
for t in threads:
t.join()
eTime = time.time() * 1
#print("Benchmark done: %5f" % (eTime - sTime))
结果对比:
ip2region的使用总结
ip2region 简介
根据它获取一个具体ip的信息,通过IP解析出国家、具体地址、网络服务商等相关信息。
ip2region 实际应用
在开发中,我们需要记录登陆的日志信息,关于登陆者的ip和位置信息,可以通过ip2region来实现。
Spring Boot集成ip2region
第一步:pom.xml引入
<properties>
<ip2region.version>1.7.2</ip2region.version>
</properties>
<dependency>
<groupId>org.lionsoul</groupId>
<artifactId>ip2region</artifactId>
<version>${ip2region.version}</version>
</dependency>
第二步:下载ip2region.db
$ git clone https://gitee.com/lionsoul/ip2region.git
下载这个项目之后到data/文件夹下面找到ip2region.db复制到项目resources下
下载这个项目之后到data/文件夹下面找到ip2region.db复制到项目resources下
第三步:ip2region 工具类
功能:主要基于IP获取当前位置信息。
import org.apache.commons.io.IOUtils;
import org.lionsoul.ip2region.DataBlock;
import org.lionsoul.ip2region.DbConfig;
import org.lionsoul.ip2region.DbSearcher;
import org.lionsoul.ip2region.Util;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.ClassPathResource;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Method;
/**
* @author zhouzhiwengang
*/
public class AddressUtil {
private static Logger log = LoggerFactory.getLogger(AddressUtil.class);
@SuppressWarnings("all")
public static String getCityInfo(String ip) {
//db
String dbPath = AddressUtil.class.getResource("/ip2region/ip2region.db").getPath();
File file = new File(dbPath);
if (!file.exists()) {
log.info("地址库文件不存在,进行其他处理");
String tmpDir = System.getProperties().getProperty("java.io.tmpdir");
dbPath = tmpDir + File.separator + "ip2region.db";
log.info("临时文件路径:{}", dbPath);
file = new File(dbPath);
if (!file.exists() || (System.currentTimeMillis() - file.lastModified() > 86400000L)) {
log.info("文件不存在或者文件存在时间超过1天进入...");
try {
InputStream inputStream = new ClassPathResource("ip2region/ip2region.db").getInputStream();
IOUtils.copy(inputStream, new FileOutputStream(file));
} catch (IOException exception) {
exception.printStackTrace();
}
}
}
//查询算法
int algorithm = DbSearcher.BTREE_ALGORITHM; //B-tree
try {
DbConfig config = new DbConfig();
DbSearcher searcher = new DbSearcher(config, dbPath);
//define the method
Method method = null;
switch (algorithm) {
case DbSearcher.BTREE_ALGORITHM:
method = searcher.getClass().getMethod("btreeSearch", String.class);
break;
case DbSearcher.BINARY_ALGORITHM:
method = searcher.getClass().getMethod("binarySearch", String.class);
break;
case DbSearcher.MEMORY_ALGORITYM:
method = searcher.getClass().getMethod("memorySearch", String.class);
break;
}
DataBlock dataBlock = null;
if (Util.isIpAddress(ip) == false) {
log.error("Error: Invalid ip address");
}
dataBlock = (DataBlock) method.invoke(searcher, ip);
return dataBlock.getRegion();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
知识拓展
遇到的问题:由于AddressUtil.java 工具类是处于项目common(基础通用模块),但部署到tomcat 容器中,提示无法加载ip2region.db 数据库资源文件。
产生上述问题的原因是:项目common(基础通用模块)没有把resources 资源文件夹下的相关资源打包,仅需要将ip2region.db 打包之项目common(基础通用模块).jar 中即可。
解决办法:改造项目common(基础通用模块)的pom.xml 文件,添加如下代码片段:
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**.*</include>
<include>**/*.*</include><!-- i18n能读取到 -->
<include>**/*/*.*</include>
</includes>
</resource>
</resources>
</build>
来源:https://blog.csdn.net/qq_41744529/article/details/124321760


猜你喜欢
- 一个页面执行一次Sql语句的话,不会影响到性能。如果一个页面要执行很多次Sql语句,而且使用的是同一个数据库连接,那么上面的方法可能会影响到
- 前言:在了解 Python 的特性之前,我们首先要了解 Python 编程语言是什么。Python 编程语言是世界上发展最快的编程语言。这一
- 本文实例为大家分享了js简单计算器的实现代码,供大家参考,具体内容如下1.html代码 <input type="text&
- 一、groupby 能做什么?python中groupby函数主要的作用是进行数据的分组以及分组后地组内运算!对于数据的分组和分组运算主要是
- 一、数据库设计三范式相关知识说明1、什么是设计范式?设计表的依据,按照这三个范式设计出来的表,不会出现数据的冗余。2、为什么要学习数据库的三
- 1.sort()方法sort()是列表的方法,修改原列表使得它按照大小排序,没有返回值,返回NoneIn [90]: x = [4, 6,
- 1. imageZMQ库实现imageZMQ库链接:https://github.com/jeffbass/imagezmq该库原本是用于树
- 首先要有一个概念:并不是一个语言支持函数,这个语言就可以叫做“函数式语言”。函数式语言中的函数(function),除了能被调用之外,还具有
- 本文实例讲述了Python使用matplotlib实现交换式图形显示功能。分享给大家供大家参考,具体如下:一 代码from random i
- 上一篇中,我们已经打开了Django自带的用户认证模块,并配置了数据库连接,创建了相应的表,本篇我们将在Django自带的用户认证的基础上,
- 目录技术背景python对Excel表格的处理vaex的安装与使用vaex的安装性能对比数据格式转换总结概要技术背景数据处理是一个当下非常热
- 类的代码: define('QR_MODE_NUL', -1); define('QR_MODE_NUM',
- 在做语义分割项目时,标注的图片不合标准,而且类型是RGBA型,且是A的部分表示的类别,因此需要将该图片转化为RGB图片# -*- codin
- xml文件:country.xml<data><country name="shdi2hajk">
- 1. 用SimpleITK读取dicom序列:import SimpleITK as sitkimport numpy as npimg_p
- import shutil高级的文件,文件夹,压缩包的处理模块,也主要用于文件的拷贝shutil.copyfileobj(fsrc,fdst
- 微信更新后出来了一块比较火的小游戏,要是一款不涉及到排行的游戏,可能 没人去关注这款游戏。最开自己一直苦练技术,想在微信排行上面装一装,练了
- 本文实例讲述了使用coverage统计python web项目代码覆盖率的方法。分享给大家供大家参考,具体如下:在使用python+sele
- 前言本文主要给大家介绍的是关于MySQL自定义函数和存储过程的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧1、前
- 1、二维数组声明方式是下面这样的:var images=new Array(); //先声明一维 for(var i=0;i<10;i