Python实现一个转存纯真IP数据库的脚本分享


Posted in Python onMay 21, 2017

前言

之前写过很多关于扫描脚本的文章,一直都没写自己的扫描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++先转码一下

效果

原始数据

Python实现一个转存纯真IP数据库的脚本分享

转存之后的数据

Python实现一个转存纯真IP数据库的脚本分享

使用

首先需要导出纯真ip数据库为txt文档,这里我导出为ip.txt

然后放到Py脚本同一目录

对了,首先你还得有mysql数据库

然后导入数据库结构,就是那个sql文件

接着你还得修改脚本里面的mysql连接密码等

最后执行Py脚本就好了

说明

所有代码都托管在Github

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

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
python中 chr unichr ord函数的实例详解
Aug 06 Python
python爬虫获取淘宝天猫商品详细参数
Jun 23 Python
浅谈Python2、Python3相对路径、绝对路径导入方法
Jun 22 Python
为什么Python中没有"a++"这种写法
Nov 27 Python
python学生管理系统
Jan 30 Python
树莓派动作捕捉抓拍存储图像脚本
Jun 22 Python
Python中PyQt5/PySide2的按钮控件使用实例
Aug 17 Python
python3中pip3安装出错,找不到SSL的解决方式
Dec 12 Python
Python matplotlib可视化实例解析
Jun 01 Python
Python操作MySQL数据库的示例代码
Jul 13 Python
如何基于python把文字图片写入word文档
Jul 31 Python
Python基于mediainfo批量重命名图片文件
Dec 29 Python
Python学习小技巧之利用字典的默认行为
May 20 #Python
Python学习小技巧之列表项的排序
May 20 #Python
Python学习小技巧之列表项的推导式与过滤操作
May 20 #Python
Python yield 使用方法浅析
May 20 #Python
Python学习小技巧之列表项的拼接
May 20 #Python
Django验证码的生成与使用示例
May 20 #Python
Linux RedHat下安装Python2.7开发环境
May 20 #Python
You might like
Laravel中如何增加自定义全局函数详解
2017/05/09 PHP
php使用json-schema模块实现json校验示例
2019/09/28 PHP
Jquery判断IE6等浏览器的代码
2011/04/05 Javascript
js Dialog 实践分享
2012/10/22 Javascript
浅析JavaScript中两种类型的全局对象/函数
2013/12/05 Javascript
Node.js插件的正确编写方式
2014/08/03 Javascript
JS 使用for循环遍历子节点查找元素
2014/09/06 Javascript
jQuery实现的分子运动小球碰撞效果
2016/01/27 Javascript
JavaScript中的各种操作符使用总结
2016/05/26 Javascript
移动端 一个简单易懂的弹出框
2016/07/06 Javascript
BootStrap 超链接变按钮的实现方法
2016/09/25 Javascript
vue判断input输入内容全是空格的方法
2018/03/02 Javascript
关于vue面试题汇总
2018/03/20 Javascript
Bootstrap Table列宽拖动的方法
2018/08/15 Javascript
简单了解vue.js数组的常用操作
2019/06/17 Javascript
javascript关于“时间”的一次探索
2019/07/24 Javascript
详解基于原生JS验证表单组件xy-form
2019/08/20 Javascript
关于vue组件事件属性穿透详解
2019/10/28 Javascript
纯JS开发baguetteBox.js响应式画廊插件
2020/06/28 Javascript
element-ui封装一个Table模板组件的示例
2021/01/04 Javascript
Python的Django框架中消息通知的计数器实现教程
2016/06/13 Python
动感网页相册 python编写简单文件夹内图片浏览工具
2016/08/17 Python
linux环境下的python安装过程图解(含setuptools)
2017/11/22 Python
浅析Git版本控制器使用
2017/12/10 Python
python opencv进行图像拼接
2020/03/27 Python
python获取响应某个字段值的3种实现方法
2020/04/30 Python
详解Python设计模式之策略模式
2020/06/15 Python
Python下划线5种含义代码实例解析
2020/07/10 Python
Python做图像处理及视频音频文件分离和合成功能
2020/11/24 Python
CSS中几个与换行有关的属性简明总结
2014/04/15 HTML / CSS
加拿大服装和鞋类零售商:Mark’s
2021/01/04 全球购物
main 主函数执行完毕后,是否可能会再执行一段代码,给出说明
2012/12/05 面试题
将一个文本文件的内容按倒序打印出来
2015/01/05 面试题
建筑工程自我鉴定
2013/10/18 职场文书
销售工作岗位职责
2013/12/24 职场文书
2014幼儿园班主任工作总结
2014/12/04 职场文书