这里有新鲜出炉的 Python 多线程编程,程序狗速度看过来!
Python 是一种面向对象、解释型计算机程序设计语言,由 Guido van Rossum 于 1989 年底发明,第一个公开发行版发行于 1991 年。Python 语法简洁而清晰,具有丰富和强大的类库。它常被昵称为胶水语言,它能够把用其他语言制作的各种模块(尤其是 C/C++)很轻松地联结在一起。
工作中我们常需要使用纯真 IP 数据库内的数据做分析,下面这篇文章主要给大家介绍了利用 Python 如何实现一个转存纯真 IP 数据库的相关资料,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
前言
之前写过很多关于扫描脚本的文章,一直都没写自己的扫描 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++ 先转码一下
效果
原始数据
转存之后的数据
使用
首先需要导出纯真 ip 数据库为 txt 文档,这里我导出为 ip.txt
然后放到 Py 脚本同一目录
对了,首先你还得有 mysql 数据库
然后导入数据库结构,就是那个 sql 文件
接着你还得修改脚本里面的 mysql 连接密码等
最后执行 Py 脚本就好了
说明
所有代码都托管在 Github
地址 https://github.com/kbdancer/myTools/tree/master/czip2mysql
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对 PHPERZ 的支持。
来源: http://www.phperz.com/article/17/0605/335750.html