如何用IP离线库批量清洗订单IP,自动标注省市区?

运维的同学经常找我吐槽:每天要分析几万笔订单的用户在哪个省、哪个市,但原始日志里只有IP地址,没有省市区。让我帮忙写个脚本批量查一下。一开始我想着用在线API,结果试了一下,单次查询几十毫秒,一万条跑下来得等好几个小时,中间还被限流卡了好几次,根本没法用。后来换了离线库的方案,效果还不错,分享出来给大家参考。

一、业务痛点:为什么不能用在线API批量查?

  • 在线API:单次30-80ms,10万条就要等待数小时,且易被限流
  • 成本:按次计费,10万次调用成本可观
  • 数据出内网:有些行业(比如金融、政务)根本不让你把IP发出去

所以,批量清洗IP数据,还是用离线库最合适。本地部署一次,之后随便查,不花钱、不限速、数据不出门。

二、整体处理流程

原始订单日志(CSV) → 读取IP列 → 批量调用离线库 → 获取省/市/区 → 写入新列 → 输出清洗后文件

整个流程全程在本地跑,不联网,速度快到起飞。

三、核心代码:直接可运行的Python脚本

以下脚本使用离线库,支持批量处理CSV文件中的IP地址,自动添加省份城市区县三列。

复制代码
import ipdatacloud
import pandas as pd
import time
from tqdm import tqdm

# 加载IP数据云离线库(本地部署,数据不出内网)
ip_db = ipdatacloud.OfflineIPLib('/data/ipdb/ip_data_cloud.mmdb', enable_risk=True)

def get_ip_location(ip: str):
    """返回IP对应的省、市、区县"""
    try:
        info = ip_db.query(ip)
        return info.get('province', ''), info.get('city', ''), info.get('district', '')
    except Exception as e:
        print(f"查询失败 {ip}: {e}")
        return '', '', ''

def batch_process_ip_file(input_file, output_file, ip_column='ip'):
    """
    批量处理CSV/Excel中的IP地址
    """
    # 自动识别文件格式
    if input_file.endswith('.csv'):
        df = pd.read_csv(input_file)
    elif input_file.endswith(('.xls', '.xlsx')):
        df = pd.read_excel(input_file)
    else:
        raise ValueError("只支持CSV或Excel文件,兄弟")
    
    # 增加三列
    df['省份'] = ''
    df['城市'] = ''
    df['区县'] = ''
    
    # 带进度条的批量处理
    tqdm.pandas(desc="正在解析IP归属地")
    df[['省份', '城市', '区县']] = df[ip_column].progress_apply(
        lambda ip: pd.Series(get_ip_location(str(ip)))
    )
    
    # 保存结果
    if output_file.endswith('.csv'):
        df.to_csv(output_file, index=False, encoding='utf-8-sig')
    else:
        df.to_excel(output_file, index=False)
    
    print(f"搞定!共处理 {len(df)} 条记录,结果在 {output_file}")

# 用的时候改成你的文件名和IP列名就行
if __name__ == '__main__':
    batch_process_ip_file(
        input_file='./order_log.csv',
        output_file='./order_log_with_location.xlsx',
        ip_column='client_ip'
    )

几个小提示

  • 需要先去官网下载 .mmdb 文件,脚本里的路径要改成你放的位置
  • 如果没装 tqdm,先执行 pip install tqdm pandas
  • 支持CSV和Excel两种格式,输出可以跟输入不一样

四**、还能给你更多字段(不止省市区)**

除了省份、城市、区县,离线库还能返回一堆有用的信息,比如:

  • net_type:网络类型(数据中心/住宅/移动),可以用来区分是不是机房刷单
  • risk_score:风险评分(0-100),分数越高越可疑
  • isp:运营商(电信/联通/移动)
  • asn:自治系统号
  • latitude / longitude:经纬度(精确到区县)

你可以把这些字段也加到清洗结果里,让BI分析更立体。比如:

复制代码
def get_ip_details(ip: str):
    info = ip_db.query(ip)
    return {
        'province': info.get('province'),
        'city': info.get('city'),
        'district': info.get('district'),
        'net_type': info.get('net_type'),
        'risk_score': info.get('risk_score'),
        'isp': info.get('isp')
    }

然后输出到Excel,运维同学一眼就能看出哪些订单来自机房、哪些IP风险高。

五、扩展建议

  • 定时跑:每天凌晨配合cron或Airflow定时运行脚本,自动生成每日地域报表
  • 直接导入数据库:输出结果丢到MySQL或ClickHouse,供BI工具可视化
  • 增量处理:记录上次处理到的订单ID,只跑新数据

六、小结

批量清洗订单IP数据这件事,用IP数据云离线库 + 一个简单的Python脚本,就能省去大把的时间和精力。代码我已经贴在上面了,你只需要改个文件路径,几分钟就能跑通。建议先用几千条数据试一下,精度没问题再铺开。我已经在好几家电商和物流公司验证过,靠谱。希望对你有帮助。

相关推荐
思麟呀1 小时前
C++工业级日志项目(七)日志器核心
linux·开发语言·c++·windows
py小王子1 小时前
期刊复现 | Python实现扇形小提琴图
python·期刊图片复现
lcj25111 小时前
vector的基本使用 + 手搓成员变量 size capacity begin end operator[] reserve扩容 拷贝构造 赋值析构
开发语言·c++·笔记·面试
GHL2842710902 小时前
Qt Creator 19.0.0 (Community)下载
开发语言·qt
之歆2 小时前
Day21_电商详情页核心技术实战:从LESS预处理到复杂交互实现
开发语言·前端·javascript·css·交互·less
Mininglamp_27182 小时前
现在入局Agent开发还来得及吗?
java·开发语言
godspeed_lucip2 小时前
LLM和Agent——专题5: LLM Ops 入门(2)
人工智能·python
技术钱2 小时前
RAG 开发 6 个阶段优化策略分析
python