日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

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

發布時間:2025/5/22 python 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python3访问纯真IP数据库的代码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

工作中我們常需要使用純真IP數據庫內的數據做分析,如何使用Python3訪問讀取純真IP數據庫的方法有很多朋友需要。今天在網上找了一個,分享一下。雖然不知道該代碼的作者是誰,順便感謝一下~~~

#! /usr/bin/env python3 # -*- coding: utf-8 -*- # filename: czip.pyimport 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 = None# print(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)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 = '8.8.8.8'print(cz.get_ip_range(ip))print(cz.get_addr_by_ip(ip))

運行結果如下:

純真網絡 2019年8月30日IP數據 8.8.8.8 - 8.8.8.8 美國 加利福尼亞州圣克拉拉縣山景市谷歌公司DNS服務器 [Finished in 0.1s]

?

總結

以上是生活随笔為你收集整理的Python3访问纯真IP数据库的代码的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产亚洲一区二区不卡 | 爱爱高潮视频 | 中文字幕免费一区二区 | 好吊色一区二区三区 | 一道本久在线中文字幕 | 午夜男人的天堂 | 好吊操这里只有精品 | 久久精品小视频 | 中文字幕亚洲一区二区三区五十路 | 1024手机在线观看 | av片手机在线观看 | 一区二区三区免费在线观看 | 免费看成人片 | 五月婷婷免费视频 | www.亚洲激情 | 师生出轨h灌满了1v1 | 久久久久区| 成人在线高清 | 中文字幕乱码人妻一区二区三区 | 欧美日韩中 | sesese99| 日本在线免费看 | 曰批女人视频在线观看 | 日韩成人在线观看 | 高清一区二区在线 | 99国产在线观看 | 天天干免费视频 | 国产欧美日本 | 91二区| 国产小视频一区 | 长河落日电视连续剧免费观看 | 视频免费1区二区三区 | 久久青青热 | 久久伊人国产 | 成人亚洲一区二区 | 午夜宅男网 | 青青成人 | av免费国产| 免费a v视频 | av在线免费网址 | 欧洲视频一区 | 日本黄色免费网址 | av资源在线播放 | 久久精品国产清自在天天线 | 国产免费高清视频 | 日韩爆操 | 亚洲国产精品成人综合 | 亚洲第一色站 | 欧美激情片在线观看 | 五月婷婷欧美 | 久久蜜桃视频 | 亚洲狼人伊人 | 欧洲精品免费一区二区三区 | 山村大伦淫第1部分阅读小说 | 999在线观看视频 | 天天爱夜夜爱 | 国产色吧 | videos亚洲 | 黄色一级免费 | 加勒比波多野结衣 | 亚洲成人黄色av | 国产91麻豆视频 | 欧美丰满老妇性猛交 | 亚洲精品国产乱伦 | 庆余年三 | 成人免费毛片xxx | 中日韩午夜理伦电影免费 | 国产黄色网址在线观看 | 91视频啪啪 | 黑色丝袜吻戏亲胸摸腿 | 国产做a视频| 裸体一区二区 | 精品国产一区二区三区在线观看 | 黄色动漫在线观看 | 99综合视频 | 国产精品黄色在线观看 | 九九热精彩视频 | 天天性综合 | 天堂av中文在线观看 | 在线免费视频一区二区 | 麻豆视频免费网站 | 韩国伦理中文字幕 | 污视频免费看 | 国产老熟女伦老熟妇露脸 | 亚洲精品国产一区二区 | 久久久久久久久久久久 | 午夜精品一区二区三区在线 | 国产又粗又猛又爽视频 | 依人综合 | 波多野结衣中文字幕一区二区三区 | 国产h视频 | 成年人黄色大片 | 精品久久久无码中文字幕边打电话 | 久久久久久av无码免费看大片 | www.18av| 国产精品一区二区白浆 | 视频在线看 | 日韩久久网 | 国产女人18毛片水18精品 |