这段时间一直再查用户的ip归属地,但是各大爸爸们都是有限制的,像淘宝ip库,百度的都是有限制的,请求太频繁了就不行了。没办法只能手撸了。
然后发现纯真数据库挺不错的。
纯真网络:http://www.cz88.net
废话不多说,直接附上代码了,python3

#纯真数据库
import socket
import structclass CzIp:def __init__(self, db_file='qqwry.dat'):self.f_db = open(db_file, "rb")bs = self.f_db.read(8)(self.first_index, self.last_index) = struct.unpack('II', bs)self.index_count = int((self.last_index - self.first_index) / 7 + 1)self.cur_start_ip = Noneself.cur_end_ip_offset = Noneself.cur_end_ip = Noneprint(self.get_version(), " 纪录总数: %d 条 "%(self.index_count))def get_version(self):'''获取版本信息,最后一条IP记录 255.255.255.0-255.255.255.255 是版本信息:return: str'''s = self.get_addr_by_ip(0xffffff00)# print(s)return sdef _get_area_addr(self, offset=0):if offset:self.f_db.seek(offset)bs = self.f_db.read(1)(byte,) = struct.unpack('B', bs)if byte == 0x01 or byte == 0x02:p = self.getLong3()if p:return self.get_offset_string(p)else:return ""else:self.f_db.seek(-1, 1)return self.get_offset_string(offset)def _get_addr(self, offset):'''获取offset处记录区地址信息(包含国家和地区)如果是中国ip,则是 "xx省xx市 xxxxx地区" 这样的形式(比如:"福建省 电信", "澳大利亚 墨尔本Goldenit有限公司"):param offset::return:str'''self.f_db.seek(offset + 4)bs = self.f_db.read(1)(byte,) = struct.unpack('B', bs)if byte == 0x01:    # 重定向模式1country_offset = self.getLong3()self.f_db.seek(country_offset)bs = self.f_db.read(1)(b,) = struct.unpack('B', bs)if b == 0x02:country_addr = self.get_offset_string(self.getLong3())self.f_db.seek(country_offset + 4)else:country_addr = self.get_offset_string(country_offset)area_addr = self._get_area_addr()elif byte == 0x02:  # 重定向模式2country_addr = self.get_offset_string(self.getLong3())area_addr = self._get_area_addr(offset + 8)else:   # 字符串模式country_addr = self.get_offset_string(offset + 4)area_addr = self._get_area_addr()return country_addr + " " + area_addrdef dump(self, first, last):'''打印数据库中索引为first到索引为last(不包含last)的记录:param first::param last::return:'''if last > self.index_count:last = self.index_countfor index in range(first, last):offset = self.first_index + index * 7self.f_db.seek(offset)buf = self.f_db.read(7)(ip, of1, of2) = struct.unpack("IHB", buf)address = self._get_addr(of1 + (of2 << 16))print("%d %s %s" % (index, self.ip2str(ip), address))def _set_ip_range(self, index):offset = self.first_index + index * 7self.f_db.seek(offset)buf = self.f_db.read(7)(self.cur_start_ip, of1, of2) = struct.unpack("IHB", buf)self.cur_end_ip_offset = of1 + (of2 << 16)self.f_db.seek(self.cur_end_ip_offset)buf = self.f_db.read(4)(self.cur_end_ip,) = struct.unpack("I", buf)def get_addr_by_ip(self, ip):'''通过ip查找其地址:param ip: (int or str):return: str'''if type(ip) == str:ip = self.str2ip(ip)L = 0R = self.index_count - 1while L < R - 1:M = int((L + R) / 2)self._set_ip_range(M)if ip == self.cur_start_ip:L = Mbreakif ip > self.cur_start_ip:L = Melse:R = Mself._set_ip_range(L)# version information, 255.255.255.X, urgy but usefulif ip & 0xffffff00 == 0xffffff00:self._set_ip_range(R)if self.cur_start_ip <= ip <= self.cur_end_ip:address = self._get_addr(self.cur_end_ip_offset)else:address = "未找到该IP的地址"return addressdef get_ip_range(self, ip):'''返回ip所在记录的IP段:param ip: ip(str or int):return: str'''if type(ip) == str:ip = self.str2ip(ip)self.get_addr_by_ip(ip)range = self.ip2str(self.cur_start_ip) + ' - ' \+ self.ip2str(self.cur_end_ip)return rangedef get_offset_string(self, offset=0):'''获取文件偏移处的字符串(以'\0'结尾):param offset: 偏移:return: str'''if offset:self.f_db.seek(offset)bs = b''ch = self.f_db.read(1)(byte,) = struct.unpack('B', ch)while byte != 0:bs += chch = self.f_db.read(1)(byte,) = struct.unpack('B', ch)return bs.decode('gbk')def ip2str(self, ip):'''整数IP转化为IP字符串:param ip::return:'''return str(ip >> 24) + '.' + str((ip >> 16) & 0xff) + '.' + str((ip >> 8) & 0xff) + '.' + str(ip & 0xff)def str2ip(self, s):'''IP字符串转换为整数IP:param s::return:'''(ip,) = struct.unpack('I', socket.inet_aton(s))return ((ip >> 24) & 0xff) | ((ip & 0xff) << 24) | ((ip >> 8) & 0xff00) | ((ip & 0xff00) << 8)def getLong3(self, offset=0):'''3字节的数值:param offset::return:'''if offset:self.f_db.seek(offset)bs = self.f_db.read(3)(a, b) = struct.unpack('HB', bs)return (b << 16) + aif __name__ == '__main__':cz = CzIp()print(cz.get_version())ip = '106.224.149.75'print(cz.get_ip_range(ip))print(cz.get_addr_by_ip(ip))

python3解析纯真ip数据库相关推荐

  1. Python3访问纯真IP数据库的代码

    工作中我们常需要使用纯真IP数据库内的数据做分析,如何使用Python3访问读取纯真IP数据库的方法有很多朋友需要.今天在网上找了一个,分享一下.虽然不知道该代码的作者是谁,顺便感谢一下~~~ #! ...

  2. c++ 解析纯真IP数据库qqwry

    http://www.cdut-boy.com/2011/09/22/parseqqwry/ 网上流传的IP数据库等,如纯真,其实是cnss制定的格式. 在项目中有需求,网上找到的几份已有的实现,都不 ...

  3. java解析纯真IP数据库

    原文地址: http://www.blogjava.net/libin2722/articles/338316.html 转载于:https://blog.51cto.com/7090376/1592 ...

  4. 基于 cz88 纯真IP数据库开发的 IP 解析服务 - 支持 http 协议请求或 rpc 协议请求,也支持第三方包的方式引入直接使用

    cz88 基于 cz88 纯真IP数据库开发的 IP 解析服务 - 支持 http 协议请求或 rpc 协议请求,也支持第三方包的方式引入直接使用 Go 语言编写 进程内缓存结果,重复的 ip 查询响 ...

  5. JAVA解析纯真IP地址库

    2019独角兽企业重金招聘Python工程师标准>>> 用java实现对纯真IP数据库的查询,首先到网上下载QQwry.da文件,读取代码如下: 1.IP记录实体类 package ...

  6. 纯真IP数据库格式详解

    摘要 网络上的IP数据库以纯真版的最为流行,LumaQQ也采用了纯真版IP数据库做为IP查询功能的基础.不过关于其格式的文档却非常之少,后来终于在网上 找到了一份文档,得以了解其内幕,不过那份文档寥寥 ...

  7. java读取纯真IP数据库qqwry.dat的源代码

    java读取纯真IP数据库QQwry.dat的源代码,要运行此程序必须有 到网上下载QQwry.dat,下载地址 http://www.cz88.net/down/   由于太大,我这里就不提供了. ...

  8. 纯真IP数据库格式详解zt

    摘要 网络上的IP数据库以纯真版的最为流行,LumaQQ也采用了纯真版IP数据库做为IP查询功能的基础.不过关于其格式的文档却非常之少,后来终于在网上找到了一份文档,得以了解其内幕,不过那份文档寥寥数 ...

  9. ip解析 java_JAVA解析纯真IP地址库

    http://lumaqq.linuxsir.org/article/qqwry_format_detail.html,这里就不多叙述了. 看下JAVA代码中怎么解析IP的吧.(代码参考至lumaQQ ...

  10. Java 解析纯真IP库

    JAVA解析纯真IP地址库 博客分类: JAVA Java log4j Cache 数据结构 J#  前几天看了下Ruby的IPParse,觉得很过瘾,上网查了下貌似很多IP数据库都要收费的,就下了个 ...

最新文章

  1. “大厂平均年龄 29.6 岁”:不是我们选择了年龄焦虑,是大厂焦虑了我们
  2. hdu 5086(dp)
  3. 最详细的CentOS 6与7对比(一):常见设置对比
  4. HDU Problem - 5938 Four Operations
  5. SAP Spartacus需要补充url validation单元测试的地方
  6. Netty工作笔记0010---Channel应用案例1
  7. 深入出不来nodejs源码-内置模块引入初探
  8. Java面试题中的Redis大合集,所有你想找的都在这里!
  9. 生物信息学:根据PDB名称、爬虫PDB数据库的信息、保存到Excel里
  10. 苹果战世界:苹果史上27大口水战
  11. Spark MLlib系列(二):基于协同过滤的电影推荐系统
  12. windows录屏_录制视频的软件有哪些?三款软件轻松应对录屏_
  13. Java 基础 Collection集合拓展
  14. Exclusive-OR
  15. SLAM数据集、RGB-D数据集
  16. 0x01.渗透思路篇
  17. General error: 8 attempt to write a readonly database
  18. BiSeNetV1 面部分割
  19. WordPress | 阿里云轻量应用服务器wordpress升级php步骤
  20. SWF格式的视频如何快速无损地转换成MP4格式

热门文章

  1. 惠普局域网共享打印机设置_打印机共享怎么设置 惠普打印机共享设置步骤介绍【详解】...
  2. SPSS学习笔记(二)T检验
  3. w3school JavaScript笔记2 ——JavaScript HTML DOM
  4. mfp服务器控制中心,固网1008MFP驱动
  5. bzoj·入门OJ·统计损失
  6. Vivado的下载和安装
  7. 夏普SHARP-10-80cm红外测距传感器-GP2Y0A21YK0F-性能测试
  8. 自建网盘教程之:使用可道云搭建私有云网盘,无需数据库,windows操作界面
  9. LU分解算法(串行、并行)
  10. 不用编程,快速实现西门子PLC与罗克韦尔(AB)PLC之间以太网通讯