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实现rest请求api示例
Apr 22 Python
Python爬取京东的商品分类与链接
Aug 26 Python
python基础教程之Filter使用方法
Jan 17 Python
Python机器学习之决策树算法
Dec 22 Python
Django中cookie的基本使用方法示例
Feb 03 Python
PyQt5每天必学之带有标签的复选框
Apr 19 Python
pyshp创建shp点文件的方法
Dec 31 Python
Django Form 实时从数据库中获取数据的操作方法
Jul 25 Python
pymysql模块的操作实例
Dec 17 Python
Python中的Cookie模块如何使用
Jun 04 Python
python装饰器实现对异常代码出现进行自动监控的实现方法
Sep 15 Python
windows下python 3.9 Numpy scipy和matlabplot的安装教程详解
Nov 28 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
Zend Studio for Eclipse的java.lang.NullPointerException错误的解决方法
2008/12/06 PHP
PHP mail 通过Windows的SMTP发送邮件失败的解决方案
2009/05/27 PHP
php版银联支付接口开发简明教程
2016/10/14 PHP
jQuery 美元符冲突的解决方法
2010/03/28 Javascript
jquery 学习之二 属性(html()与html(val))
2010/11/25 Javascript
细说javascript函数从函数的构成开始
2013/08/29 Javascript
新增加的内容是如何将div的scrollbar自动移动最下面
2014/01/02 Javascript
生成二维码方法汇总
2014/12/26 Javascript
JavaScript清空数组元素的两种方法简单比较
2015/07/10 Javascript
使用javaScript动态加载Js文件和Css文件
2015/10/24 Javascript
js实现跨域访问的三种方法
2015/12/09 Javascript
jQuery Easyui Datagrid实现单行的上移下移及保存移动的结果
2016/08/15 Javascript
Vue.js列表渲染绑定jQuery插件的正确姿势
2017/06/29 jQuery
angularjs2中父子组件的数据传递的实例代码
2017/07/05 Javascript
nodejs 图解express+supervisor+ejs的用法(推荐)
2017/09/08 NodeJs
Element-ui tree组件自定义节点使用方法代码详解
2018/09/17 Javascript
js使用Promise实现简单的Ajax缓存
2018/11/14 Javascript
JS去除字符串最后的逗号实例分析【四种方法】
2019/06/20 Javascript
JQuery获得内容和属性方法解析
2020/05/30 jQuery
Vue中的nextTick作用和几个简单的使用场景
2021/01/25 Vue.js
python中datetime模块中strftime/strptime函数的使用
2018/07/03 Python
详解Django的model查询操作与查询性能优化
2018/10/16 Python
numpy和pandas中数组的合并、拉直和重塑实例
2019/06/28 Python
Python简易版停车管理系统
2019/08/12 Python
Django 实现对已存在的model进行更改
2020/03/28 Python
keras中的backend.clip用法
2020/05/22 Python
如何用 Python 制作 GitHub 消息助手
2021/02/20 Python
基于HTML5超酷摄像头(HTML5 webcam)拍照功能实现代码
2012/12/13 HTML / CSS
澳大利亚巧克力花束和礼品网站:Tastebuds
2019/03/15 全球购物
英国打印机墨盒销售网站:Ink Factory
2019/10/07 全球购物
奥巴马上海演讲稿
2014/09/10 职场文书
党小组推荐意见
2015/06/02 职场文书
2015年清剿火患专项行动工作总结
2015/07/27 职场文书
优秀团员主要事迹材料
2015/11/05 职场文书
导游词之广西漓江
2019/11/02 职场文书
java获取一个文本文件的编码(格式)信息
2022/09/23 Java/Android