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

 更新时间:2025年09月25日 09:28:28   作者: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)。
  • 步骤
    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,
            '省份': 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地址查询地理位置的资料请关注脚本之家其它相关文章!

相关文章

  • Django自定义用户表+自定义admin后台中的字段实例

    Django自定义用户表+自定义admin后台中的字段实例

    今天小编就为大家分享一篇Django自定义用户表+自定义admin后台中的字段实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • python使用turtle绘制国际象棋棋盘

    python使用turtle绘制国际象棋棋盘

    这篇文章主要为大家详细介绍了python使用turtle画国际象棋棋盘,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • Python的Darts库实现时间序列预测

    Python的Darts库实现时间序列预测

    Darts一个集统计、机器学习与深度学习模型于一体的Python时间序列预测库,本文主要介绍了Python的Darts库实现时间序列预测,感兴趣的可以了解一下
    2025-09-09
  • python IP地址转整数

    python IP地址转整数

    这篇文章主要介绍了python 如何将IP 地址转整数,帮助大家了解转换的原理与收益,更好的理解python,感兴趣的朋友可以了解下
    2020-11-11
  • python线程池(threadpool)模块使用笔记详解

    python线程池(threadpool)模块使用笔记详解

    这篇文章主要介绍了python线程池(threadpool)模块使用笔记详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • Python3.2中的字符串函数学习总结

    Python3.2中的字符串函数学习总结

    这篇文章主要介绍了Python3.2中的字符串函数学习总结,本文讲解了格式化类方法、查找 & 替换类方法、拆分 & 组合类方法等内容,需要的朋友可以参考下
    2015-04-04
  • Python中断言Assertion的一些改进方案

    Python中断言Assertion的一些改进方案

    python中的断言Assertion使用起来很方便,但是也不尽如人意的地方,所以这篇文章通过几个方面对Python中的断言进行了改进,感兴趣的朋友们可以参考借鉴,下面来一起看看吧。
    2016-10-10
  • 深入了解Python enumerate和zip

    深入了解Python enumerate和zip

    这篇文章主要介绍了Python enumerate和zip的相关资料,文中讲解非常细致,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • Python使用Altair创建交互式数据可视化的操作指南

    Python使用Altair创建交互式数据可视化的操作指南

    Altair 是一个基于 Vega-Lite 的 Python 数据可视化库,它旨在简化数据可视化的创建过程,尤其适用于统计图表的生成,Altair 强调声明式编码方式,通过简单的语法,用户能够快速创建复杂的交互式图表,本文将介绍 Altair 的基础用法、常见图表类型,需要的朋友可以参考下
    2024-12-12
  • 关于CUDA out of memory的解决方案

    关于CUDA out of memory的解决方案

    这篇文章主要介绍了关于CUDA out of memory的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02

最新评论