开发者

Python通过IP地址查询地理位置的几种方法

目录
  • 一、在线API查询(简单快速,依赖网络)
    • 1. 使用 requests + ipinfo.io
    • 2. 使用 requests + ip-api.com
  • 二、本地数据库查询(离线高效,需下载数据库)
    • 1. 使用 geoip2 + GeoLite2 数据库
    • 2. 其他本地库对比
  • 三、结果可视化(增强展示)
    • 使用 folium 生成交互地图
  • 四、方法选择建议

    一、在线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'])  # 国家、运营商
    
    Singaandroidpore Tcloudnet
    

    二、本地数据库查询(离线高效,需下载数据库)

    1. 使用 geoip2 + GeoLite2 数据库

    • 原理:加载MaxMind的免费数据库文件(GeoLite2-City.mmdb)。
    • 步骤
      1. 下载数据库:MaxMind官网(需注册)。
      2. 安装库:pip install geoip2uv 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,
                '省份':python 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)}
    
    • 优点:离线可用,查询速度快(毫秒级)。
    • 缺点:数据库需定期更新http://www.devze.com(每月),精确度略低于商业版。

    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")
    

    Python通过IP地址查询地理位置的几种方法

    四、方法选择建议

    方法适用场景精度速度依赖
    在线API(androidipinfo)快速验证、少量查询网络
    本地GeoLite2高频查询、隐私敏感场景中高本地数据库文件
    地图可视化结果展示、数据分析报告--需经纬度数据

    推荐组合

    • 常规需求:geoip2 + 本地数据库(免费且高效)。
    • 实时性要求低:在线API(避免维护数据库)。

    通过上述方法,可灵活实现IP到地理位置的转换,满足安全分析、用户画像等场景需求。

    以上就是Python通过IP地址查询地理位置的几种方法的详细内容,更多关于Python IP地址查询地理位置的资料请关注编程客栈(www.devze.com)其它相关文章!

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新开发

    开发排行榜