使用Folium实现IP追踪地图时遇ValueError:location参数为空数组
解决IP追踪地图标记程序的ValueError问题
错误原因
报错ValueError: Expected two (lat, lon) values for location, instead got: []的核心原因是geocoder.ip(ip)返回的latlng为空列表——说明geocoder库没能成功获取目标IP的经纬度数据。常见诱因包括:
- 输入的IP地址无效、属于内网IP,或无法被公开地理数据库解析
- geocoder依赖的免费API存在调用次数限制或访问限制
- 网络环境导致无法连接到地理编码服务
修正方案
方案1:为原代码添加空值检查与方法修复
原代码中locationmap1.show_in_browser()是错误用法(folium的Map对象无此方法),同时需要加入空值判断避免触发异常:
import geocoder import folium import webbrowser ip = input('Enter IP to trace: ') g = geocoder.ip(ip) location = g.latlng # 检查是否获取到有效经纬度 if not location: print(f"无法解析IP {ip}的地理位置,请检查IP有效性或稍后重试") else: locationmap1 = folium.Map(location=location, zoom_start=12) folium.CircleMarker(location=location, radius=50, popup=f"目标IP: {ip}").add_to(locationmap1) locationmap1.save('locationmap1.html') # 用webbrowser模块打开生成的地图文件 webbrowser.open('locationmap1.html')
方案2:更换更稳定的地理编码服务(ipinfo.io)
如果geocoder库持续无法获取数据,可以改用ipinfo的公开API(无需密钥,有调用次数限制):
import requests import folium import webbrowser ip = input('Enter IP to trace: ') # 调用ipinfo API获取地理数据 response = requests.get(f"https://ipinfo.io/{ip}/json") if response.status_code == 200: data = response.json() loc_str = data.get('loc') if loc_str: # 将经纬度字符串转为浮点数元组 location = tuple(map(float, loc_str.split(','))) # 生成地图并标记点位 locationmap1 = folium.Map(location=location, zoom_start=12) popup_content = f"IP: {ip}\n地区: {data.get('city', '')}, {data.get('region', '')}" folium.CircleMarker(location=location, radius=50, popup=popup_content).add_to(locationmap1) locationmap1.save('locationmap1.html') webbrowser.open('locationmap1.html') else: print(f"无法获取IP {ip}的地理位置信息") else: print(f"请求地理数据失败,状态码: {response.status_code}")
内容的提问来源于stack exchange,提问作者Cole Edwards
相关产品推荐
相关产品推荐

