ABB机器人与西门子Smart200 PROFINET配置实战:从GSDML到设备名称
2026/10/2 11:20:40
在大数据分析、风控系统、跨境业务运营等场景中,Geo(地理信息)优化工具是核心刚需 —— 通过 IP 定位、地理数据解析、区域维度分析,可实现用户画像、业务风控、精准运营等目标。本文分享一套完全开源的 Geo 优化工具系统源码,基于 Python 实现核心功能,手把手教你部署搭建,零基础也能快速上手。
前往 Python 官网(https://www.python.org/)下载 3.8 + 版本,安装时务必勾选「Add Python to PATH」。验证安装是否成功:
bash
运行
python --version # 输出Python 3.8.x及以上版本即成功 pip --version # 验证pip包管理工具打开终端 / 命令提示符,执行以下命令一键安装:
bash
运行
# 安装IP定位核心库 pip install ip2region # 安装数据处理库 pip install pandas openpyxl # 安装可视化库 pip install pyecharts # 安装文件处理辅助库 pip install tqdm # 显示批量处理进度条ip2region 依赖本地数据库实现 IP 定位,需先下载:
python
运行
import os import json import pandas as pd from ip2region import Ip2Region from pyecharts import options as opts from pyecharts.charts import Map from pyecharts.globals import ThemeType from tqdm import tqdm from pathlib import Path # Geo优化工具核心类 class GeoOptimizationTool: def __init__(self, db_path="ip2region.xdb", output_dir="geo_output"): """ 初始化Geo工具 :param db_path: ip2region数据库文件路径 :param output_dir: 数据输出目录 """ # 验证数据库文件是否存在 if not os.path.exists(db_path): raise FileNotFoundError(f"IP数据库文件不存在:{db_path},请先下载后放到指定路径") self.db = Ip2Region(db_path) self.output_dir = Path(output_dir) # 创建输出目录(不存在则自动新建) self.output_dir.mkdir(exist_ok=True) def ip_to_geo(self, ip): """ 单IP解析地理信息 :param ip: 待解析IP地址(如123.123.123.123) :return: 包含省/市/运营商的地理信息字典 """ try: # 解析IP(格式:国家|区域|省份|城市|运营商) result = self.db.search(ip) geo_info = { "ip": ip, "country": result[0], "region": result[1], "province": result[2], "city": result[3], "isp": result[4] # 运营商(如电信/联通/移动) } return geo_info except Exception as e: print(f"解析IP {ip} 失败:{str(e)}") return { "ip": ip, "country": "", "region": "", "province": "", "city": "", "isp": "" } def batch_ip_analysis(self, ip_file_path): """ 批量解析IP文件(支持txt/csv,每行一个IP) :param ip_file_path: IP文件路径 :return: 解析后的地理信息列表 """ # 读取IP文件 ip_list = [] file_suffix = Path(ip_file_path).suffix.lower() if file_suffix == ".txt": with open(ip_file_path, "r", encoding="utf-8") as f: ip_list = [line.strip() for line in f if line.strip()] elif file_suffix == ".csv": df = pd.read_csv(ip_file_path) # 假设CSV第一列为IP列(列名:ip/IP/IP地址均可) ip_col = [col for col in df.columns if "ip" in col.lower()][0] ip_list = df[ip_col].dropna().tolist() else: raise ValueError("仅支持txt/csv格式的IP文件") # 批量解析IP(显示进度条) geo_result = [] for ip in tqdm(ip_list, desc="批量解析IP地理信息"): geo_info = self.ip_to_geo(ip) geo_result.append(geo_info) return geo_result def export_geo_data(self, geo_result, export_format="csv"): """ 导出地理信息数据 :param geo_result: 解析后的地理信息列表 :param export_format: 导出格式(csv/excel/json) :return: 导出文件路径 """ df = pd.DataFrame(geo_result) export_path = self.output_dir / f"geo_analysis_result.{export_format}" if export_format == "csv": df.to_csv(export_path, index=False, encoding="utf-8-sig") elif export_format == "excel": df.to_excel(export_path, index=False) elif export_format == "json": with open(export_path, "w", encoding="utf-8") as f: json.dump(geo_result, f, ensure_ascii=False, indent=4) else: raise ValueError("仅支持csv/excel/json导出格式") print(f"Geo数据已导出至:{export_path}") return export_path def geo_visualization(self, geo_result): """ Geo数据可视化(生成省级分布热力图) :param geo_result: 解析后的地理信息列表 :return: 可视化HTML文件路径 """ # 统计各省份IP数量 province_count = {} for item in geo_result: province = item["province"] if province and province != "未知": province_count[province] = province_count.get(province, 0) + 1 # 生成省级地图热力图 map_chart = ( Map(init_opts=opts.InitOpts(theme=ThemeType.LIGHT)) .add( series_name="IP地理分布", data_pair=list(province_count.items()), maptype="china", # 中国省级地图 ) .set_global_opts( title_opts=opts.TitleOpts(title="Geo优化工具-IP地理分布热力图"), visualmap_opts=opts.VisualMapOpts(max_=max(province_count.values()) if province_count else 10), ) ) # 保存可视化HTML文件 html_path = self.output_dir / "geo_distribution_map.html" map_chart.render(str(html_path)) print(f"Geo可视化图表已生成:{html_path}") return html_path # 主函数(快速运行示例) if __name__ == "__main__": # 配置参数 IP_DB_PATH = "ip2region.xdb" # IP数据库文件路径 IP_FILE_PATH = "ip_list.txt" # 待解析的IP文件(txt/csv) OUTPUT_DIR = "geo_output" # 输出目录 EXPORT_FORMAT = "csv" # 导出格式(csv/excel/json) # 初始化Geo优化工具 geo_tool = GeoOptimizationTool(db_path=IP_DB_PATH, output_dir=OUTPUT_DIR) # 1. 批量解析IP地理信息 geo_result = geo_tool.batch_ip_analysis(IP_FILE_PATH) # 2. 导出解析结果 geo_tool.export_geo_data(geo_result, export_format=EXPORT_FORMAT) # 3. 生成地理分布可视化图表 geo_tool.geo_visualization(geo_result) print("✅ Geo优化工具批量分析完成!结果已保存至geo_output目录")ip2region.xdb数据库文件(核心依赖,无此文件无法解析 IP);ip_list.txt/csv放到代码同级目录;IP_DB_PATH:若数据库文件不在同级目录,填写完整路径(如D:/ip2region.xdb);IP_FILE_PATH:替换为自己的 IP 文件路径;EXPORT_FORMAT:按需选择导出格式(csv 适合表格分析,json 适合接口调用);maptype为具体省份(如 "广东"),或调整ThemeType更换图表主题。bash
运行
# 终端/命令行执行 python geo_optimization_tool.pygeo_output目录下会生成 3 类文件:geo_analysis_result.csv/excel/json:IP 地理信息解析结果;geo_distribution_map.html:双击打开即可查看 IP 省级分布热力图;ip_segment_analysis函数,支持解析 IP 段(如 192.168.0.1/24);IP 解析失败:
ip2region.xdb文件路径正确,且文件未损坏;依赖安装报错:
python -m pip install --upgrade pip)后重新安装;--user参数(pip install --user ip2region)。可视化图表无数据:
province字段是否为空;完整开源源码已上传至 Gitee 仓库:https://gitee.com/xxx/geo-optimization-tool(替换为自己的仓库地址),关注 + 私信可获取 Web 可视化版源码。