亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Python > 正文

python訪問純真IP數據庫的代碼

2020-02-23 04:47:26
字體:
來源:轉載
供稿:網友

核心代碼:

#!/usr/bin/env python # -*- coding: utf-8 -*- from bisect import bisect _LIST1, _LIST2 = [], [] _INIT = False ip2int = lambda ip_str: reduce(lambda a, b: (a << 8) + b, [int(i) for i in ip_str.split('.')]) def _init(): global _LIST, _INIT if not _INIT: for l in open('ipdata.txt', 'rb'): ip1, ip2 = l.split()[:2] addr = ' '.join(l.split()[2:]) ip1, ip2 = ip2int(ip1), ip2int(ip2) _LIST1.append(ip1) _LIST2.append((ip1, ip2, addr)) _INIT = True def ip_from(ip): _init() i = ip2int(ip) idx = bisect(_LIST1, i) assert(idx > 0) if len(_LIST1) <= idx: return u'unknown ip address %s' % ip else: frm, to ,addr = _LIST2[idx - 1] if frm <= i <= to: return addr else: return u'unknown ip address %s' % ip if __name__ == '__main__': print ip_from('115.238.54.106') print ip_from('220.181.29.160') print ip_from('115.238.54.107') print ip_from('8.8.8.8')

代碼打包下載 http://xiazai.jb51.net/201105/yuanma/ipaddress.7z

接下來為大家分享更完美的代碼:

#!/usr/bin/env python# coding: utf-8 '''用Python腳本查詢純真IP庫 QQWry.Dat的格式如下: +----------+| 文件頭 | (8字節)+----------+| 記錄區 | (不定長)+----------+| 索引區 | (大小由文件頭決定)+----------+ 文件頭:4字節開始索引偏移值+4字節結尾索引偏移值 記錄區: 每條IP記錄格式 ==> IP地址[國家信息][地區信息]   對于國家記錄,可以有三種表示方式:     字符串形式(IP記錄第5字節不等于0x01和0x02的情況),    重定向模式1(第5字節為0x01),則接下來3字節為國家信息存儲地的偏移值    重定向模式(第5字節為0x02),   對于地區記錄,可以有兩種表示方式: 字符串形式和重定向   最后一條規則:重定向模式1的國家記錄后不能跟地區記錄 索引區: 每條索引記錄格式 ==> 4字節起始IP地址 + 3字節指向IP記錄的偏移值   索引區的IP和它指向的記錄區一條記錄中的IP構成一個IP范圍。查詢信息是這個  范圍內IP的信息 ''' import sysimport socketfrom struct import pack, unpack class IPInfo(object):  '''QQWry.Dat數據庫查詢功能集合  '''  def __init__(self, dbname):    ''' 初始化類,讀取數據庫內容為一個字符串,    通過開始8字節確定數據庫的索引信息'''     self.dbname = dbname    # f = file(dbname, 'r')     # Demon注:在Windows下用'r'會有問題,會把/r/n轉換成/n    # 詳見http://demon.tw/programming/python-open-mode.html    # 還有Python文檔中不提倡用file函數來打開文件,推薦用open    f = open(dbname, 'rb')     self.img = f.read()    f.close()     # QQWry.Dat文件的開始8字節是索引信息,前4字節是開始索引的偏移值,    # 后4字節是結束索引的偏移值。    # (self.firstIndex, self.lastIndex) = unpack('II', self.img[:8])     # Demon注:unpack默認使用的endian是和機器有關的    # Intel x86和AMD64(x86-64)是little-endian    # Motorola 68000和PowerPC G5是big-endian    # 而純真數據庫全部采用了little-endian字節序    # 所以在某些big-endian的機器上原代碼會出錯    (self.firstIndex, self.lastIndex) = unpack('<II', self.img[:8])     # 每條索引長7字節,這里得到索引總個數    self.indexCount = (self.lastIndex - self.firstIndex) / 7 + 1   def getString(self, offset = 0):    ''' 讀取字符串信息,包括"國家"信息和"地區"信息     QQWry.Dat的記錄區每條信息都是一個以'/0'結尾的字符串'''     o2 = self.img.find('/0', offset)    #return self.img[offset:o2]    # 有可能只有國家信息沒有地區信息,    gb2312_str = self.img[offset:o2]    try:      utf8_str = unicode(gb2312_str,'gb2312').encode('utf-8')    except:      return '未知'    return utf8_str   def getLong3(self, offset = 0):    '''QQWry.Dat中的偏移記錄都是3字節,本函數取得3字節的偏移量的常規表示    QQWry.Dat使用“字符串“存儲這些值'''    s = self.img[offset: offset + 3]    s += '/0'    # unpack用一個'I'作為format,后面的字符串必須是4字節    # return unpack('I', s)[0]     # Demon注:和上面一樣,強制使用little-endian    return unpack('<I', s)[0]   def getAreaAddr(self, offset = 0):    ''' 通過給出偏移值,取得區域信息字符串,'''     byte = ord(self.img[offset])    if byte == 1 or byte == 2:      # 第一個字節為1或者2時,取得2-4字節作為一個偏移量調用自己      p = self.getLong3(offset + 1)      return self.getAreaAddr(p)    else:      return self.getString(offset)   def getAddr(self, offset, ip = 0):    img = self.img    o = offset    byte = ord(img[o])     if byte == 1:      # 重定向模式1      # [IP][0x01][國家和地區信息的絕對偏移地址]      # 使用接下來的3字節作為偏移量調用字節取得信息      return self.getAddr(self.getLong3(o + 1))     if byte == 2:      # 重定向模式2      # [IP][0x02][國家信息的絕對偏移][地區信息字符串]      # 使用國家信息偏移量調用自己取得字符串信息      cArea = self.getAreaAddr(self.getLong3(o + 1))      o += 4      # 跳過前4字節取字符串作為地區信息      aArea = self.getAreaAddr(o)      return (cArea, aArea)     if byte != 1 and byte != 2:      # 最簡單的IP記錄形式,[IP][國家信息][地區信息]      # 重定向模式1有種情況就是偏移量指向包含國家和地區信息兩個字符串      # 即偏移量指向的第一個字節不是1或2,就使用這里的分支      # 簡單地說:取連續取兩個字符串!       cArea = self.getString(o)      #o += 2*len(cArea) + 1      # 我們已經修改cArea為utf-8字符編碼了,len取得的長度會有變,      # 用下面方法得到offset       o = self.img.find('/0',o) + 1      aArea = self.getString(o)      if aArea == "?":        aArea = "電信"      if aArea == "信":        aArea = ""      if aArea == "[":        aArea = "聯通"      return (cArea, aArea)   def find(self, ip, l, r):    ''' 使用二分法查找網絡字節編碼的IP地址的索引記錄'''    if r - l <= 1:      return l     m = (l + r) / 2    o = self.firstIndex + m * 7    #new_ip = unpack('I', self.img[o: o+4])[0]     # Demon注:和上面一樣,強制使用little-endian    new_ip = unpack('<I', self.img[o: o+4])[0]     if ip <= new_ip:      return self.find(ip, l, m)    else:      return self.find(ip, m, r)   def getIPAddr(self, ip):    ''' 調用其他函數,取得信息!'''    # 使用網絡字節編碼IP地址    ip = unpack('!I', socket.inet_aton(ip))[0]    # 使用 self.find 函數查找ip的索引偏移    i = self.find(ip, 0, self.indexCount - 1)    # 得到索引記錄    o = self.firstIndex + i * 7    # 索引記錄格式是: 前4字節IP信息+3字節指向IP記錄信息的偏移量    # 這里就是使用后3字節作為偏移量得到其常規表示(QQWry.Dat用字符串表示值)    o2 = self.getLong3(o + 4)    # IP記錄偏移值+4可以丟棄前4字節的IP地址信息。    (c, a) = self.getAddr(o2 + 4)    return (c, a)   def output(self, first, last):    for i in range(first, last):      o = self.firstIndex + i * 7      ip = socket.inet_ntoa(pack('!I', unpack('I', self.img[o:o+4])[0]))      offset = self.getLong3(o + 4)      (c, a) = self.getAddr(offset + 4)      print "%s %d %s/%s" % (ip, offset, c, a)def getIP(ip):  import os  _localDir=os.path.dirname(__file__)  _curpath=os.path.normpath(os.path.join(os.getcwd(),_localDir))  curpath=_curpath  i = IPInfo(curpath+'/qqwry.dat')  (c, a) = i.getIPAddr(ip)  return c+adef main():  import os  _localDir=os.path.dirname(__file__)  _curpath=os.path.normpath(os.path.join(os.getcwd(),_localDir))  curpath=_curpath  i = IPInfo(curpath+'/qqwry.dat')  if os.path.exists(sys.argv[1]):    for line in open(sys.argv[1],"r").readlines():      line = line.replace("/r","").replace("/n","")      (c, a) = i.getIPAddr(line)      # Demon注:如果是在Windows命令行中運行把編碼轉回gb2312以避免亂碼      if sys.platform == 'win32':        c = unicode(c, 'utf-8').encode('gb2312')        a = unicode(a, 'utf-8').encode('gb2312')      print '%s %s/%s' % (line, c, a)  else:    (c, a) = i.getIPAddr(sys.argv[1])    # Demon注:如果是在Windows命令行中運行把編碼轉回gb2312以避免亂碼    if sys.platform == 'win32':      c = unicode(c, 'utf-8').encode('gb2312')      a = unicode(a, 'utf-8').encode('gb2312')    print '%s %s/%s' % (sys.argv[1], c, a) if __name__ == '__main__':  main()            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久精品成人欧美大片古装| 色噜噜亚洲精品中文字幕| 国产精品吊钟奶在线| 亚洲国产美女精品久久久久∴| 欧美理论电影在线播放| 欧洲午夜精品久久久| 人九九综合九九宗合| 日韩av免费在线播放| 欧美亚洲国产日韩2020| 欧美中在线观看| 欧美一级淫片aaaaaaa视频| 国产精品久久久av| 欧美性极品xxxx娇小| 欧美激情精品久久久久久蜜臀| 久久精品99久久久香蕉| 欧美精品激情在线| 亚洲成av人乱码色午夜| 国产男女猛烈无遮挡91| 久久人人爽人人爽人人片av高清| 1769国内精品视频在线播放| 国外色69视频在线观看| 久久人人爽人人爽人人片亚洲| 欧美精品激情在线观看| www.99久久热国产日韩欧美.com| 久久电影一区二区| 欧美成人精品三级在线观看| 亚洲a在线播放| 亚洲国产精品字幕| 韩国v欧美v日本v亚洲| 一本色道久久88综合日韩精品| 国产精品久久久久久久久久久久久久| 国产精品r级在线| 亚洲日本欧美中文幕| 国产精品高清免费在线观看| 一色桃子一区二区| 亚洲天堂男人天堂| 亚洲图片在线综合| 国产精品久久久久不卡| 欧美在线视频一二三| 色综合久久悠悠| 中文字幕精品av| 国产精品香蕉av| 国产亚洲精品91在线| 美日韩精品免费观看视频| 人妖精品videosex性欧美| 亚洲电影免费观看高清| 奇米成人av国产一区二区三区| 在线成人激情视频| 国产精品久久久久久久久久三级| 中文字幕一区二区精品| 亚洲男人av电影| 精品视频—区二区三区免费| 欧美午夜精品久久久久久久| 亚洲深夜福利视频| 欧美激情精品久久久久久变态| 亚洲欧美激情另类校园| 视频在线观看99| 欧美成人精品在线观看| 国产精品偷伦一区二区| 亚洲男人的天堂在线| 色视频www在线播放国产成人| 国产亚洲精品激情久久| 欧美精品久久久久久久| 欧美亚洲成人网| 精品国产区一区二区三区在线观看| 日韩高清av在线| 亚洲精品视频免费在线观看| 亚洲一区二区三区乱码aⅴ蜜桃女| 欧美精品激情在线观看| 一本大道香蕉久在线播放29| 欧美日韩黄色大片| 日韩免费观看高清| 欧美国产一区二区三区| 中文字幕精品视频| 国产成人中文字幕| 综合网日日天干夜夜久久| 91精品国产91久久久久久| 精品国偷自产在线| 亚洲日本中文字幕| 国产精品久在线观看| 国产精品黄页免费高清在线观看| 亚洲自拍欧美另类| 日韩美女福利视频| 国产精品第100页| 国产亚洲美女精品久久久| 色综合天天综合网国产成人网| 日韩一区在线视频| 69视频在线播放| 欧美性猛交xxxx黑人猛交| 亚洲精品福利资源站| 国产精品一区二区电影| 美女视频黄免费的亚洲男人天堂| 久久久国产一区| 国产精品国内视频| 日韩电影免费在线观看中文字幕| xxav国产精品美女主播| 久久99精品久久久久久噜噜| 日韩精品在线影院| 91久久久久久久久久久久久| 欧美亚洲免费电影| 亚洲一区二区三区在线视频| 亚洲国产美女精品久久久久∴| 国产成人精品一区二区| 欧美激情在线播放| 欧美精品在线网站| 国产精品中文久久久久久久| 亚洲成人av在线播放| 精品中文视频在线| 欧美激情精品久久久久久| 久久久久久香蕉网| 亚洲人成电影在线观看天堂色| 久久久久久久一| 亚洲精品久久久久久下一站| 亚洲黄色www网站| 精品久久久国产精品999| 欧美日韩爱爱视频| 欧美乱人伦中文字幕在线| 国产一区二区三区中文| 亚洲精品大尺度| 中文字幕在线日韩| 久久精品国产亚洲7777| 亚洲精品99久久久久| 亚洲国产精品成人va在线观看| 欧美猛交ⅹxxx乱大交视频| 国产精品福利无圣光在线一区| 国产精品成人va在线观看| 国产精品国内视频| 成人激情综合网| 亚洲小视频在线| 日韩在线激情视频| 国产成人精品日本亚洲专区61| 久久九九有精品国产23| 久久久久免费视频| 91网站免费看| 欧美一级大片在线观看| 国产精品久久综合av爱欲tv| 亚洲欧美另类在线观看| 亚洲男人天堂手机在线| 成人黄色激情网| 亚洲国产欧美一区二区三区同亚洲| 福利二区91精品bt7086| 国产精品久久999| 亚洲乱码国产乱码精品精| 国产日韩av高清| 国产成人一区二区三区| 亚洲欧洲视频在线| 国产亚洲一区二区精品| 久久国产精品视频| 上原亚衣av一区二区三区| 精品国产鲁一鲁一区二区张丽| 国产精品美女视频网站| 色综合久久中文字幕综合网小说| 91国内揄拍国内精品对白| 久久国产色av| 日产日韩在线亚洲欧美| 国产精品夜色7777狼人| 欧美与黑人午夜性猛交久久久| 日本中文字幕不卡免费| 91精品国产综合久久久久久久久| 久久免费少妇高潮久久精品99| 国产亚洲精品久久| 亚洲精品美女久久久| 日韩精品免费看| 国产精品视频中文字幕91|