首頁  >  文章  >  後端開發  >  一個轉存純真IP資料庫的腳本在Python中實現的程式碼分享

一個轉存純真IP資料庫的腳本在Python中實現的程式碼分享

黄舟
黄舟原創
2017-05-21 13:37:571657瀏覽

工作中我們常需要使用純真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腳本就好了

##說明#

以上是一個轉存純真IP資料庫的腳本在Python中實現的程式碼分享的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn