requests
+ ipinfo.ioimport requests
def get_ip_info(ip):
response = requests.get(f"https://ipinfo.io/{ip}/json")
if response.status_code == 200:
data = response.json()
return {
'IP': data.get('ip'),
'城市': data.get('city'),
'地区': data.get('region'),
'国家': data.get('country'),
'经纬度': data.get('loc').split(',') if data.get('loc') else None
}
return None
print(get_ip_info("66.235.200.109")) # 示例IP
{'IP': '66.235.200.109', '城市': 'Jacksonville', '地区': 'Florida', '国家': 'US', '经纬度': ['30.2214', '-81.5571']}
requests
+ ip-api.comresponse = requests.get(f"http://ip-api.com/json/206.238.237.128")
data = response.json()
print(data['country'], data['isp']) # 国家、运营商
Singapore Tcloudnet
geoip2
+ GeoLite2 数据库GeoLite2-City.mmdb
)。pip install geoip2
或 uv add geoip2
import geoip2.database
def get_location(ip, db_path='GeoLite2-City.mmdb'):
try:
reader = geoip2.database.Reader(db_path)
response = reader.city(ip)
return {
'国家': response.country.name,
'省份': response.subdivisions.most_specific.name,
'城市': response.city.name,
'经纬度': (response.location.latitude, response.location.longitude)
}
except Exception as e:
return str(e)
print(get_location("61.160.202.122")) # 国内IP示例
print(get_location("172.67.182.90")) # 国外IP示例
{'国家': 'China', '省份': None, '城市': None, '经纬度': (34.7732, 113.722)}
{'国家': None, '省份': None, '城市': None, '经纬度': (None, None)}
pygeoip
(仅Python 2)或 ip2geotools
(多数据源),但geoip2
是当前主流方案。folium
生成交互地图import folium
def plot_on_map(lat, lon, city):
map = folium.Map(location=[lat, lon], zoom_start=10)
folium.Marker([lat, lon], popup=city).add_to(map)
map.save("ip_location.html") # 生成HTML地图
# 结合API或数据库获取经纬度后调用
lat, lon = 37.4056, -122.0775
plot_on_map(lat, lon, "California")
方法 | 适用场景 | 精度 | 速度 | 依赖 |
---|---|---|---|---|
在线API(ipinfo) | 快速验证、少量查询 | 中 | 中 | 网络 |
本地GeoLite2 | 高频查询、隐私敏感场景 | 中高 | 快 | 本地数据库文件 |
地图可视化 | 结果展示、数据分析报告 | - | - | 需经纬度数据 |
推荐组合:
- 常规需求:
geoip2
+ 本地数据库(免费且高效)。- 实时性要求低:在线API(避免维护数据库)。
通过上述方法,可灵活实现IP到地理位置的转换,满足安全分析、用户画像等场景需求。