返回顶部
首页 > 资讯 > 后端开发 > Python >Python读取纯真IP数据库
  • 234
分享到

Python读取纯真IP数据库

纯真数据库Python 2023-01-31 07:01:43 234人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

一、获取最新版IP地址数据库qqwry.dat    纯真IP地址数据库下载地址:Http://update.cz88.net/soft/setup.zip    在windows机器上下载解压,点击setup.exe安装,在安装目录下的q

一、获取最新版IP地址数据库qqwry.dat

    纯真IP地址数据库下载地址:Http://update.cz88.net/soft/setup.zip

    在windows机器上下载解压,点击setup.exe安装,在安装目录下的qqwry.dat即是最新版ip数据库

    也可从51CTO下载(不是最新版,可用于测试):http://down.51cto.com/data/1888530

二、IPLocator.py

    网上找到别人用python写的纯真IP数据库的查询程序,原文地址:http://blog.chinaunix.net/uid-20758462-id-1876988.html,本文对代码做了一些修改,解决中文乱码问题。

    建立IPLocator.py文件(见本文附件),内容如下:

#! /usr/bin/env Python
# -*- coding: utf-8 -*-
""" IPLocator: locate IP in the QQWry.dat.
    Usage:
        python IPLocator.py <ip>
"""

import Socket,string,struct,sys

class IPLocator :
    def __init__( self, ipdbFile ):
        self.ipdb = open( ipdbFile, "rb" )
        str = self.ipdb.read( 8 )
        (self.firstIndex,self.lastIndex) = struct.unpack('II',str)
        self.indexCount = (self.lastIndex - self.firstIndex)/7+1
        print self.getVersion()," 纪录总数: %d 条 "%(self.indexCount)

    def getVersion(self):
        s = self.getIpAddr(0xffffff00L)
        return s

    def getAreaAddr(self,offset=0):
        if offset :
            self.ipdb.seek( offset )
        str = self.ipdb.read( 1 )
        (byte,) = struct.unpack('B',str)
        if byte == 0x01 or byte == 0x02:
            p = self.getLong3()
            if p:
                return self.getString( p )
            else:
                return ""
        else:
            self.ipdb.seek(-1,1)
            return self.getString( offset )

    def getAddr(self,offset,ip=0):
        self.ipdb.seek( offset + 4)
        countryAddr = ""
        areaAddr = ""
        str = self.ipdb.read( 1 )
        (byte,) = struct.unpack('B',str)
        if byte == 0x01:
            countryOffset = self.getLong3()
            self.ipdb.seek( countryOffset )
            str = self.ipdb.read( 1 )
            (b,) = struct.unpack('B',str)
            if b == 0x02:
                countryAddr = self.getString( self.getLong3() )
                self.ipdb.seek( countryOffset + 4 )
            else:
                countryAddr = self.getString( countryOffset )
            areaAddr = self.getAreaAddr()
        elif byte == 0x02:
            countryAddr = self.getString( self.getLong3() )
            areaAddr = self.getAreaAddr( offset + 8 )
        else:
            countryAddr = self.getString( offset + 4 )
            areaAddr = self.getAreaAddr()
        return countryAddr + " " + areaAddr

    def dump(self, first ,last ):
        if last > self.indexCount :
            last = self.indexCount
        for index in range(first,last):
            offset = self.firstIndex + index * 7
            self.ipdb.seek( offset )
            buf = self.ipdb.read( 7 )
            (ip,of1,of2) = struct.unpack("IHB",buf)
            address = self.getAddr( of1 + (of2 << 16) )
            #把GBK转为utf-8
            address = unicode(address,'gbk').encode("utf-8")
            print "%d\t%s\t%s" %(index, self.ip2str(ip), \
                address )

    def setIpRange(self,index):
        offset = self.firstIndex + index * 7
        self.ipdb.seek( offset )
        buf = self.ipdb.read( 7 )
        (self.curStartIp,of1,of2) = struct.unpack("IHB",buf)
        self.curEndIpOffset = of1 + (of2 << 16)
        self.ipdb.seek( self.curEndIpOffset )
        buf = self.ipdb.read( 4 )
        (self.curEndIp,) = struct.unpack("I",buf)

    def getIpAddr(self,ip):
        L = 0
        R = self.indexCount - 1
        while L < R-1:
            M = (L + R) / 2
            self.setIpRange(M)
            if ip == self.curStartIp:
                L = M
                break
            if ip > self.curStartIp:
                L = M
            else:
                R = M
        self.setIpRange( L )
        #version infORMation,255.255.255.X,urgy but useful
        if ip&0xffffff00L == 0xffffff00L:
            self.setIpRange( R )
        if self.curStartIp <= ip <= self.curEndIp:
            address = self.getAddr( self.curEndIpOffset )
            #把GBK转为utf-8
            address = unicode(address,'gbk').encode("utf-8")
        else:
            address = "未找到该IP的地址"
        return address

    def getIpRange(self,ip):
        self.getIpAddr(ip)
        range = self.ip2str(self.curStartIp) + ' - ' \
            + self.ip2str(self.curEndIp)
        return range

    def getString(self,offset = 0):
        if offset :
            self.ipdb.seek( offset )
        str = ""
        ch = self.ipdb.read( 1 )
        (byte,) = struct.unpack('B',ch)
        while byte != 0:
            str = str + ch
            ch = self.ipdb.read( 1 )
            (byte,) = struct.unpack('B',ch)
        return str

    def ip2str(self,ip):
        return str(ip>>24)+'.'+str((ip>>16)&0xffL)+'.' \
            +str((ip>>8)&0xffL)+'.'+str(ip&0xffL)

    def str2ip(self,s):
        (ip,) = struct.unpack('I',socket.inet_aton(s))
        return ((ip>>24)&0xffL)|((ip&0xffL)<<24) \
            |((ip>>8)&0xff00L)|((ip&0xff00L)<<8)

    def getLong3(self,offset = 0):
        if offset :
            self.ipdb.seek( offset )
        str = self.ipdb.read(3)
        (a,b) = struct.unpack('HB',str)
        return (b << 16) + a

#Demo
def main():
    IPL = IPLocator( "qqwry.dat" )
    ip = ""
    if len(sys.argv) != 2:
        print 'Usage: python IPLocator.py <IP>'
        return
    else:
        ip = sys.argv[1]
    address = IPL.getIpAddr( IPL.str2ip(ip) )
    range = IPL.getIpRange( IPL.str2ip(ip) )
    print "此IP %s 属于 %s\n所在网段: %s" % (ip,address, range)


if __name__ == "__main__" :
    main()

    把qqwry.dat放到和IPLocator.py同一目录,使用方法如下(请参考IPLocator.py中的Demo):

wKiom1SKxheTBaiIAAOTHHV72tE754.jpg


--结束END--

本文标题: Python读取纯真IP数据库

本文链接: https://lsjlt.com/news/191171.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python读取纯真IP数据库
    一、获取最新版IP地址数据库qqwry.dat    纯真IP地址数据库下载地址:http://update.cz88.net/soft/setup.zip    在windows机器上下载解压,点击setup.exe安装,在安装目录下的q...
    99+
    2023-01-31
    纯真 数据库 Python
  • python3通过纯真IP数据库查询IP
    在网上看到的别人写的python2的代码,修改成了python3。 把纯真IP数据库文件qqwry.dat放到czip.py同一目录下。 1 #! /usr/bin/env python 2 # -*- coding: utf-...
    99+
    2023-01-31
    数据库查询 纯真 IP
  • python读取数据库
    一、access 1、获取表 http://blog.sina.com.cn/s/blog_92ab5a530102wjxe.html 参考这个链接。我把操作录制下来如下所示   import pypyodbc import time ...
    99+
    2022-04-14
    python读取数据库 数据库入门 数据库基础教程 数据库 mysql
  • Python实现一个转存纯真IP数据库的脚本分享
    前言 之前写过很多关于扫描脚本的文章,一直都没写自己的扫描IP段是哪里搞来的,也会有朋友经常来问一些扫描经验,说实话我觉得这个工具并没有实际的技术含量,但是能提高工作效率,就共享出来给大家耍耍~ 谈到扫描经...
    99+
    2022-06-04
    脚本 纯真 数据库
  • python怎么读取oracle数据库数据
    要从Oracle数据库中读取数据,可以使用Python中的cx_Oracle模块。 首先,确保已经安装了cx_Oracle模块。可以...
    99+
    2024-04-09
    python oracle
  • Python读取postgresql数据库详情
    目录一、读取PostgreSQL数据库二、查询数据一、读取postgresql数据库 (1)首先,我们需要安装 psycopg 驱动。通过 pip 安装最新的 psycopg pip install psycopg2 -...
    99+
    2024-04-02
  • Python如何读取MySQL数据库表数据
    本文实例为大家分享了Python读取MySQL数据库表数据的具体代码,供大家参考,具体内容如下 环境:Python 3.6 ,Window 64bit 目的:从MySQL数据库读取目标表数据,并处理 代码:...
    99+
    2022-06-04
    数据库 数据 Python
  • python怎么读取数据库表每一行数据
    使用 fetchall() 方法可以读取数据库表的每一行数据。具体步骤包括:导入库、连接数据库、创建游标、执行查询、获取一行并遍历查询结果。 Python 读取数据库表每一行数据 要使...
    99+
    2024-04-02
  • python读取leveldb数据
    import sys import leveldb def read_data(): if len(sys.argv) < 2: print "pls input leveldb dir" return -1 db = ...
    99+
    2023-01-31
    数据 python leveldb
  • SQL数据库怎么读取数据
    本篇内容介绍了“SQL数据库怎么读取数据”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!   &...
    99+
    2024-04-02
  • mysql如何读取数据库数据
    mysql 读取数据库数据有两种常用方法:select 语句,用于从表中提取数据,语法为:select [列名] from [表名] [条件] [分组] [条件] [排序] [...
    99+
    2024-04-14
    mysql python
  • Python读取Hive数据库代码怎么写
    今天小编给大家分享一下Python读取Hive数据库代码怎么写的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。实际业务读取hi...
    99+
    2023-07-05
  • html怎么读取数据库
    html 本身不具备直接读取数据库的能力,而是需要结合后端编程语言和数据库查询语言来实现。后端代码负责与数据库交互,从数据库中读取数据,并将数据嵌入到 html 页面中。这个过程通常涉及...
    99+
    2024-04-02
  • redis怎么读取数据库
    如何通过 redis 读取数据库 直接连接到数据库 Redis 提供了 EVAL 命令,允许在 Redis 服务器上直接执行 Lua 脚本。您可以使用该脚本连接到数据库并执行查询。例如:...
    99+
    2024-06-03
    redis
  • python Pandas 读取数据,写
    pandas 选取数据 iloc和 loc的用法不太一样,iloc是根据索引, loc是根据行的数值>>> import pandas as pd >>> import os >>> o...
    99+
    2023-01-31
    数据 python Pandas
  • 从MySQL数据库binlog中读取数据
    1. 执行SQL查看Binlog日志文件名: show binary logs; 举个例子 2.去官网(https://dev.mysql.com/downloads/installer/)下载一个...
    99+
    2023-09-03
    数据库 mysql php
  • vb怎么读取sql数据库数据
    在VB中,可以使用ADO.NET来读取SQL数据库的数据。ADO.NET提供了一系列的类和方法来与数据库进行交互。下面是一个读取数据...
    99+
    2023-09-08
    vb sql数据库
  • php如何从数据库读取数据
    在PHP中,可以使用MySQLi或PDO扩展来连接和操作数据库。使用MySQLi扩展从数据库读取数据的示例代码如下:```php//...
    99+
    2023-08-23
    php 数据库
  • spark怎么读取mysql数据库数据
    在Spark中读取MySQL数据库数据,可以使用Spark的DataFrame API和JDBC连接器来实现。以下是一种常见的方法:...
    99+
    2024-04-09
    spark mysql
  • vb如何读取sql数据库数据
    在VB中读取SQL数据库数据可以使用ADO.NET技术。以下是一个简单示例代码: 引用System.Data.SqlClient命...
    99+
    2024-04-19
    vb sql
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作