使用Python写一个转存纯真IP数据库的脚本

前言

好久没写文,有点生疏了。

这一两个月项目实在是繁忙,基本上每天晚上都得加班到好晚,几乎挤不出来时间写东西。

昨天项目基本上算是上线成功了,历时一个月的重构、优化、调试、对接后端接口,新加入一个团队需要磨合,遇到的问题也非常多。

项目开发中遇到的问题都是些小问题,我会整理到博客,今天来写写我自己Python小工具。

背景

之前我写过很多关于扫描脚本的文章,一直都没写自己的扫描IP段是哪里搞来的,也会有朋友经常来问一些扫描经验,说实话我觉得这个工具并没有实际的技术含量,但是能提高工作效率,就共享出来给大家耍耍~

谈到扫描经验,我个人通常都会针对不同的设备,不同的应用选择不同类型的段。

比如我现在扫描的目标是一款电信光猫,那自然是选择电信的IP段,光猫一般是家庭用户,我们筛选下家庭用户的活跃IP段,这样我们就有针对性了。

再比如我现在想扫一款企业路由设备,那么我就可以选择企业公司多的段。

纯真IP真心是个不错的工具,我通常用来检索某个地区的IP段,但是这个工具有个非常致命的缺点,就是不能联合查询,这就令人非常蛋疼了,而且这玩意每次用都要切换到win下面操作,对于我这种Linux党来说自然是无法忍,索性写个把纯真IP转存到mysql数据库的脚本,这样不用每次查询都去win下面,还可以直接部署到远程,查询方便了很多,最主要的还是支持多条件查询。

需求

Python写这个脚本技术上难度不大,主要还是用到了MySQLdb库,关于MySQLdb库的安装就不多说了,博客之前有写相关的文章。这里咱们需要先分析下纯真IP数据库的数据文件结构,发现其实每一行的结构都是固定的,那么写起来就简单了。

编码这块我就不详细说了,简单几个方法就能轻松实现,贴出来代码

#!/usr/bin/env python
# coding=utf-8
# kbdancer@92ez.com

import MySQLdb
import sys

reload(sys)
sys.setdefaultencoding('utf8')


def save_data_to_mysql(mysql_object, ip_line):
    try:
        begin = ip_line[0:16].replace(' ', '')
        end = ip_line[16:32].replace(' ', '')
        try:
            location = line[32:].split(' ')[0]
        except:
            location = ''
        try:
            isp_type = line[32:].replace('  ', ' ').split(' ')[1].replace('\n', '').replace('\r', '')
        except:
            isp_type = ''

        this_line_value = [begin + "-" + end, location, isp_type]
        do_insert(mysql_object, this_line_value)
    except Exception, e:
        print e


def do_insert(mysql_object, row_data):
    try:
        insert_sql = """INSERT INTO `ipdb` (`iprange`,`location`, `type`) VALUES ( %s, %s, %s )"""
        mysql_object.insert(insert_sql, row_data)
    except Exception, e:
        print row_data
        print e


class Database:
    host = 'localhost'
    user = 'ipdb'
    password = '3u9whrpcEUBTnNNn'
    db = 'ipinfo'
    charset = 'utf8'

    def __init__(self):
        self.connection = MySQLdb.connect(self.host, self.user, self.password, self.db, charset=self.charset)
        self.cursor = self.connection.cursor()

    def insert(self, query, params):
        try:
            self.cursor.execute(query, params)
            self.connection.commit()
        except Exception, e:
            print e
            self.connection.rollback()

    def query(self, query, params):
        cursor = self.connection.cursor(MySQLdb.cursors.DictCursor)
        cursor.execute(query, params)
        return cursor.fetchall()

    def __del__(self):
        self.connection.close()


if __name__ == '__main__':
    mysql = Database()
    ip_file = open(sys.path[0] + "/ip.txt")
    print 'Start save to mysql ...'
    for line in ip_file:
        save_data_to_mysql(mysql, line)
    ip_file.close()
    print 'Save complete.'

注意

这里存在一个性能问题,就是遍历所有数据的时候需要进行插入数据库的操作,单行插入的效率是非常低的,建议使用多行插入,比如说写个缓存数组,当缓存数组达到规定的条数,比如达到100条的时候,一次性把100条存入到数据库,这个速度比单条存入要快得多。博主我在这里就挖个坑,希望使用脚本的朋友能自己修改,改起来也不难。

由于纯真IP数据库导出的txt文件并不是标准的无BOM UTF8编码,直接解析肯定是失败的,建议使用Notepad++先转码一下

效果

原始数据

old.png - 大小: 273.54 KB - 尺寸:  x  - 点击打开新窗口浏览全图

转存之后的数据

new.png - 大小: 217.18 KB - 尺寸:  x  - 点击打开新窗口浏览全图

使用

首先需要导出纯真ip数据库为txt文档,这里我导出为ip.txt
然后放到Py脚本同一目录
对了,首先你还得有mysql数据库
然后导入数据库结构,就是那个sql文件
接着你还得修改脚本里面的mysql连接密码等
最后执行Py脚本就好了

说明

所有代码都托管在Github

地址 https://github.com/kbdancer/myTools/tree/master/czip2mysql

如果您觉得文章有帮助到您,请到 https://www.92ez.com/index.php?action=show&id=23403 进行打赏/捐赠,谢谢!
如果您觉得文章有帮助到您,请 使劲戳这里 进行打赏/捐赠,谢谢!
本文链接:https://www.92ez.com/?action=show&id=23442
提示:技术文章有一定的时效性,请先确认是否适用你当前的系统环境。

上一篇: 我为什么不用Django而用Flask?
下一篇: 解决Python 2.7.x 使用Requests发起https请求时报Warning的问题

访客评论
#1
回复 kimqcn 2017-05-25, 5:44 PM
纯真的ip库的确不错,40多w条。
#2
回复 single 2017-06-02, 9:55 PM
不错,怎么能联系到你
发表评论

评论内容 (必填):