python使用ip2Region库离线查询ip地址归属地,生成Excel报告

参考:

python使用ip2Region库查询ip地址归属地查询/ip朔源自动生成Excel报告

https://www.pythonheidong.com/blog/article/895015/58b65cf3aeda4f51d1f5/

xlsxwriter简单用法

https://blog.csdn.net/lb245557472/article/details/102955908/


ip2Region

https://gitee.com/lionsoul/ip2region


xlsxwriter库替换了xlsx库,经过测试可写入了100万+行,无限制。xlsx最大行数限制65535

ip2region.db替换为ip2Region升级后的ip2region.xdb

#-*- coding:utf-8 -*-

import struct, sys, os, time
from platform import python_version
from xdbSearcher import XdbSearcher
import xlsxwriter

def testSearch(ip_s):
    dbFile = "../../data/ip2region.xdb"
    searcher = XdbSearcher(dbfile=dbFile)
    try:
        #print("开始检测:",(ip_s))
        #sTime = time.time() * 1000
        data = searcher.searchByIPStr(ip_s)
        #print("return-data:" + f"{data}")
        # elif algorithm == "memory":
        #     data = searcher.memorySearch(line)
        # else:
        #     data = searcher.btreeSearch(line)
        #eTime = time.time() * 1000
        #ip_info = ("%s|%s" % (ip_s, data))
        #print("检测完成:return" + ip_info)
        return data

    except Exception as e:
        print("[Error]: %s" % e)
    searcher.close()
    

def all_in():
    #row_id = 1
    #book = xlwt.Workbook()
    workbook = xlsxwriter.Workbook('ip.xlsx')
    
    #sheet = book.add_sheet('sheet')
    worksheet = workbook.add_worksheet()
    
    row = 1
    
    title = ['源ip', '国家', '省份','城市','运营商']
    # 定义一个红色+黑体的格式.
    #bold = workbook.add_format({'bold': 1, "color": "red"})
    #worksheet.write('A1', '源ip', bold)
    #worksheet.write('B1', '国家', bold)
    #worksheet.write('C1', '省份', bold)
    #worksheet.write('C1', '城市', bold)
    #worksheet.write('C1', '运营商', bold)

    for col in range(len(title)):
        worksheet.write(0, col, title[col])
    with open('ip.txt' ,'r') as file:
        for line in file.readlines():
            ip = line.strip()
            try:
                data = testSearch(ip)
                #print("循环内"+f"{data}")
                ct = data.split('|')[0].strip()
                pv = data.split('|')[2].strip()
                city = data.split('|')[3].strip()
                yys = data.split('|')[4].strip()
                if ct == "0":
                    #print("地址库中未找到对应的IP归属地,请更新地址库或者确定ip准确性!")
                    worksheet.write(row, 0, ip)
                    worksheet.write(row, 1, "/")
                    worksheet.write(row, 2, "/")
                    worksheet.write(row, 3, "/")
                    worksheet.write(row, 4, "/")
                    row += 1
                else:
                    worksheet.write(row, 0, ip)
                    worksheet.write(row, 1, ct)
                    worksheet.write(row, 2, pv)
                    worksheet.write(row, 3, city)
                    worksheet.write(row, 4, yys)
                    row += 1
            except Exception as e:
                print("[Error]: %s" % e)
                worksheet.write(row, 0, ip)
                worksheet.write(row, 1, "查询异常")
                row += 1
    #book.save('score.xls')
    workbook.close()


if __name__ == "__main__":
    all_in()

image.png

25w条ip记录查询时间为44s

输出格式为

image.png