python +ip2region 离线IP库地址文件实现秒级查询ip归属地址
ip2region
ip2region - 离线的ip地址查询库,ip到地区的映射库,提供二进制,B树,内存搜索三种查询算法,查询速度非常快。
支持Java,PHP,C,Python,Nodejs,Golang,C#等语言,本文以Python为例
一、前期准备
-
在GitHub上克隆下来源文件
https://github.com/lionsoul2014/ip2region

下载完的文件:

-
解压后很轻易就分辨出来各个文件夹的作用(挨个文件夹点了一遍☹)
注:
- 脚本涉及到了Python、Java、PHP、C、Nodejs、Golang、C#等多种语言
- 数据库文件会不定期更新,详情请参考
1中的下载地址

二、简单使用(以Python为例)
-
单个查询(直接使用大佬的脚本工具进行查询)
python binding/python/testSearcher.py ./data/ip2region.db #python 脚本文件 数据库文件
注意运行时的
脚本文件路径和数据库文件路径 -
批量查询
由于需求不同(本人需要的是批量查询),所以在大佬的脚本工具基础上进行符合本人需求的扩展
首先把
ip2region-master\data\ip2region.db和ip2region-master\binding\python\ip2Region.py复制出来,并创建一个自己的py文件ipaddr_query.py

ip2region.db:数据库文件
ip2Region.py:调用数据库的脚本工具
ipaddr_query.py里的代码如下:
from ip2Region import Ip2Region #此处导入的是刚才复制的py文件
db_file = './data/ip2region.db' #数据库文件路径
search_file = './search_file.txt' #查询文件:每行一个ip
result_file = './result_file.txt' #结果文件:每行一个ip结果
def ip_search():
#打开需要查询的文件
with open(search_file,'r',encoding='utf-8') as search_file_r:
search_file_lines = search_file_r.readlines()
#打开结果文件,准备写入
with open(result_file,'a',encoding='utf-8') as result_file_w:
searcher = Ip2Region(db_file) #实例化
for line in search_file_lines:
ip = line.strip('\n')
#判断是不是ip,isip这个函数是Ip2Region里写好的,直接用
if searcher.isip(ip):
#三种算法任选其一
data = searcher.btreeSearch(ip) #B树
# data = searcher.binarySearch(line) #二进制
# data = searcher.memorySearch(line) #内存
result_file_w.write("%s|%s\n" % (ip, data["region"].decode('utf-8')))
print("%s|%s" % (ip, data["region"].decode('utf-8')))
else:
result_file_w.write('%s|错误数据\n'%ip)
print('%s|错误数据'%ip)
searcher.close() #关闭
if __name__ == "__main__":
ip_search()
GitHub地址:https://github.com/lionsoul2014/ip2region
再次感谢大佬的分享,如有其它问题欢迎留言私信

浙公网安备 33010602011771号