Python通过IP地址查询地理位置的几种方法
作者:Humbunklung
本文介绍通过IP查询地理位置的两种方法:在线API(如ipinfo.io,快速但有请求限制)和本地数据库(如GeoLite2,高效但需定期更新),并推荐结合使用以满足不同场景需求,需要的朋友可以参考下
一、在线API查询(简单快速,依赖网络)
1. 使用 requests + ipinfo.io
- 原理:调用免费API返回JSON格式的地理信息(国家、城市、经纬度等)。
- 代码示例:
import 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']}
- 优点:无需本地数据库,快速部署。
- 缺点:免费版有请求限制,隐私数据需谨慎。
2. 使用 requests + ip-api.com
- 特点:返回更详细的运营商信息。
- 代码示例:
response = requests.get(f"http://ip-api.com/json/206.238.237.128") data = response.json() print(data['country'], data['isp']) # 国家、运营商
Singapore Tcloudnet
二、本地数据库查询(离线高效,需下载数据库)
1. 使用 geoip2 + GeoLite2 数据库
- 原理:加载MaxMind的免费数据库文件(
GeoLite2-City.mmdb
)。 - 步骤:
- 下载数据库:MaxMind官网(需注册)。
- 安装库:
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)}
- 优点:离线可用,查询速度快(毫秒级)。
- 缺点:数据库需定期更新(每月),精确度略低于商业版。
2. 其他本地库对比
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到地理位置的转换,满足安全分析、用户画像等场景需求。
以上就是Python通过IP地址查询地理位置的几种方法的详细内容,更多关于Python IP地址查询地理位置的资料请关注脚本之家其它相关文章!