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

背景:

方式1:调用外部接口

比如:
http://freeapi.ipip.net/ip
缺点:该接口会对同一个IP下面的请求做限制,导致部分IP无法查询;切时刻需要依赖外网,所以推荐使用方式2实现;

方式2:使用本地ip2Region地址库实现

优点:速度快,不依赖外网,地址全,有运营商信息

主体源码如下(自动生成Excel报告):

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

import struct, sys, os, time
from platform import python_version
from ip2Region import Ip2Region
import xlwt

def testSearch(ip_s):
    dbFile = "../../data/ip2region.db"
    searcher = Ip2Region(dbFile)
    try:
        print("开始检测:",(ip_s))
        sTime = time.time() * 1000
        data = searcher.binarySearch(ip_s)
        # elif algorithm == "memory":
        #     data = searcher.memorySearch(line)
        # else:
        #     data = searcher.btreeSearch(line)
        eTime = time.time() * 1000
        ip_info = ("%s|%s|%s" % (ip_s, data["city_id"], data["region"].decode('utf-8')))
        print("检测完成:" + ip_info)
        return ip_info

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


def all_in():
    row_id = 1
    book = xlwt.Workbook()
    sheet = book.add_sheet('sheet')
    title = ['源ip', '国家', '省市','运营商']
    for col in range(len(title)):
        sheet.write(0, col, title[col])
    with open('ip.txt' ,'r') as file:
        for line in file.readlines():
            ip = line.strip()
            try:
                data = testSearch(ip)
                ct = data.split('|')[2].strip()
                pv = data.split('|')[4].strip()
                city = data.split('|')[5].strip()
                yys = data.split('|')[6].strip()
                if ct == "0":
                    print("地址库中未找到对应的IP归属地,请更新地址库或者确定ip准确性!")
                    sheet.write(row_id, 0, ip)
                    sheet.write(row_id, 1, "/")
                    sheet.write(row_id, 2, "/")
                    sheet.write(row_id, 3, "/")
                    row_id += 1
                else:
                    if pv == "0":
                        print("省市查询为空!")
                        sheet.write(row_id, 0, ip)
                        sheet.write(row_id, 1, ct)
                        sheet.write(row_id, 2, "/")
                        sheet.write(row_id, 3, "/")
                        row_id += 1
                    else:
                        if city == "0":
                            sheet.write(row_id, 0, ip)
                            sheet.write(row_id, 1, ct)
                            sheet.write(row_id, 2, pv + "-" + "///")
                            sheet.write(row_id, 3, "/")
                            row_id += 1
                        else:
                            if yys == "0":
                                sheet.write(row_id, 0, ip)
                                sheet.write(row_id, 1, ct)
                                sheet.write(row_id, 2, pv + "-" + city)
                                sheet.write(row_id, 3, "/")
                                row_id += 1
                            else:
                                sheet.write(row_id, 0, ip)
                                sheet.write(row_id, 1, ct)
                                sheet.write(row_id, 2, pv + "-" + city)
                                sheet.write(row_id, 3, yys)
                                row_id += 1
            except Exception as e:
                print("[Error]: %s" % e)
                sheet.write(row_id, 0, ip)
                sheet.write(row_id, 1, "检测异常,请手动检测!")
                row_id += 1
    book.save('score.xls')


if __name__ == "__main__":
    all_in()

备注:
1、需要将ip地址整理到脚本同级目录,ip.txt文件。
2、地址库需要从Git下载,下载地址:
https://blog.csdn.net/weixin_34247032/article/details/92863280

ip2region是一个准确率99.9%的离线IP地址定位,0.0x毫秒级查询ip2region.db数据只有数MB,提供了java,php,c,python,nodejs,golang,c#等查询绑定和Binary,B树,内存三种查询算法。 Ip2region特性: 一、99.9%准确率 数据聚合了一些知名ip到地名查询提供商的数据,这些是他们官方的的准确率,经测试着实比经典的纯真IP定位准确一些。 二、标准化的数据格式 每条ip数据段都固定了格式: _城市Id|国家|区域|省份|城市|ISP_ 只有中国的数据精确到了城市,其他国家有部分数据只能定位到国家,后前的选项全部是0,已经包含了全部你能查到的大大小小的国家(请忽略前面的城市Id,个人项目需求)。 三、体积小 包含了全部的IP,生成的数据文件ip2region.db只有几MB,最小的版本只有1.5MB,随着数据的详细度增加数据的大小也慢慢增大,目前还没超过8MB。 四、查询速度快 全部的查询客户端单次查询都在0.x毫秒级别,内置了三种查询算法: 1.memory算法:整个数据全部载入内存,单次查询都在0.1x毫秒内,C语言的客户端单次查询在0.00x毫秒级别。 2.binary算法:基于二分查找,基于ip2region.db文件,不需要载入内存,单次查询在0.x毫秒级别。 3.b-tree算法:基于btree算法,基于ip2region.db文件,不需要载入内存,单词查询在0.x毫秒级别,比binary算法更快。 任何客户端b-tree都比binary算法快,当然memory算法固然是最快的! 五、多查询客户端的支持 已经集成的客户端有:java、C#、php、c、python、nodejs、php扩展(php5和php7)、golang、rust、lua、lua_c,nginx。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值