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之网站的结构
Oct 24 Python
Python自动化部署工具Fabric的简单上手指南
Apr 19 Python
Python cookbook(数据结构与算法)从任意长度的可迭代对象中分解元素操作示例
Feb 13 Python
Python中GeoJson和bokeh-1的使用讲解
Jan 03 Python
解决python字典对值(值为列表)赋值出现重复的问题
Jan 20 Python
python3+pyqt5+itchat微信定时发送消息的方法
Feb 20 Python
浅谈python图片处理Image和skimage的区别
Aug 04 Python
解决python3 安装不了PIL的问题
Aug 16 Python
Python生成器实现简单"生产者消费者"模型代码实例
Mar 27 Python
解决jupyter运行pyqt代码内核重启的问题
Apr 16 Python
在tensorflow实现直接读取网络的参数(weight and bias)的值
Jun 24 Python
基于python获取本地时间并转换时间戳和日期格式
Oct 27 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
全国FM电台频率大全 - 28 甘肃省
2020/03/11 无线电
社区(php&&mysql)五
2006/10/09 PHP
PHP脚本的10个技巧(4)
2006/10/09 PHP
cmd下运行php脚本
2008/11/25 PHP
php通过COM类调用组件的实现代码
2012/01/11 PHP
PHP实现的交通银行网银在线支付接口ECSHOP插件和使用例子
2014/05/10 PHP
PHP curl使用实例
2015/07/02 PHP
PHP Web木马扫描器代码分享
2015/09/06 PHP
php获取文件名称和扩展名的方法
2017/02/07 PHP
自动刷新网页,自动刷新当前页面,JS调用
2013/06/24 Javascript
javascript禁用Tab键脚本实例
2013/11/22 Javascript
javascript屏蔽右键代码
2014/05/15 Javascript
jQuery实现放大镜效果实例代码
2016/03/17 Javascript
Vue.js中用v-bind绑定class的注意事项
2016/12/13 Javascript
微信小程序 Buffer缓冲区的详解
2017/07/06 Javascript
教你如何编写Vue.js的单元测试的方法
2018/10/17 Javascript
webpack 开发和生产并行设置的方法
2018/11/08 Javascript
vue2.0基于vue-cli+element-ui制作树形treeTable
2019/04/30 Javascript
[01:01:18]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#2COL VS LGD
2016/03/03 DOTA
[51:50]完美世界DOTA2联赛 Magma vs GXR 第一场 11.07
2020/11/10 DOTA
python实现搜索指定目录下文件及文件内搜索指定关键词的方法
2015/06/28 Python
剖析Python的Twisted框架的核心特性
2016/05/25 Python
Python DataFrame 设置输出不显示index(索引)值的方法
2018/06/07 Python
Python3爬虫学习之将爬取的信息保存到本地的方法详解
2018/12/12 Python
浅谈python str.format与制表符\t关于中文对齐的细节问题
2019/01/14 Python
在Django的View中使用asyncio的方法
2019/07/12 Python
Django Rest framework频率原理与限制
2019/07/26 Python
Python zip函数打包元素实例解析
2019/12/11 Python
python Scrapy框架原理解析
2021/01/04 Python
Pycharm 设置默认解释器路径和编码格式的操作
2021/02/05 Python
加拿大休闲和工业服装和鞋类零售商:L’Équipeur
2018/01/12 全球购物
Mountain Warehouse德国官网:英国户外零售商
2019/08/11 全球购物
大学生个人自荐信
2014/02/24 职场文书
小学生九一八纪念日83周年演讲稿500字
2014/09/17 职场文书
python中24小时制转换为12小时制的方法
2021/06/18 Python
在Oracle表中进行关键词搜索的过程
2022/06/10 Oracle