杰瑞科技汇

Python如何精准获取location信息?

下面我将为你详细解释几种最常见的“位置”获取方式,并提供相应的 Python 代码示例:

Python如何精准获取location信息?-图1
(图片来源网络,侵删)
  1. 获取本机设备的地理位置 (需要用户授权或硬件支持)
  2. 获取IP地址对应的地理位置 (基于网络,无需授权,但精度较低)
  3. 获取文件在系统中的路径 (文件系统位置)
  4. 获取网页或API请求的来源URL (网络请求位置)

获取本机设备的地理位置

这种方式需要设备(如手机、电脑)具备定位硬件(GPS、Wi-Fi、基站等),并且通常需要用户授权,在 Python 中,我们通常通过调用操作系统的命令或使用专门的库来实现。

方法 A: 使用 geopy 库 (推荐,跨平台)

geopy 是一个强大的地理编码库,它本身不直接获取位置,但可以调用多种地理编码服务(如 Google Maps, OpenStreetMap 等),对于本机定位,我们可以先通过系统命令获取经纬度,然后用 geopy 进行逆地理编码。

步骤:

  1. 安装 geopyrequests:

    Python如何精准获取location信息?-图2
    (图片来源网络,侵删)
    pip install geopy requests
  2. 编写代码: 这个方法依赖于 requests 来调用一个公共的IP定位服务来获取本机公网IP的经纬度,这是一种间接但通用的方法。

    import requests
    from geopy.geocoders import Nominatim
    from geopy.exc import GeocoderUnavailable, GeocoderTimedOut
    def get_device_location():
        """
        通过IP地址获取本机的大致地理位置。
        注意:这并非GPS定位,精度有限,且结果取决于IP地址库。
        """
        try:
            # 1. 获取本机公网IP
            print("正在获取本机IP地址...")
            response = requests.get('https://api.ipify.org?format=json')
            response.raise_for_status()  # 检查请求是否成功
            ip_address = response.json()['ip']
            print(f"本机IP地址: {ip_address}")
            # 2. 使用IP定位服务获取经纬度 (这里使用ip-api.com,有免费调用限制)
            print("正在通过IP获取经纬度...")
            ip_info_url = f'http://ip-api.com/json/{ip_address}'
            ip_info_response = requests.get(ip_info_url)
            ip_info_response.raise_for_status()
            ip_data = ip_info_response.json()
            if ip_data['status'] == 'success':
                lat = ip_data['lat']
                lon = ip_data['lon']
                print(f"获取到经纬度: 纬度 {lat}, 经度 {lon}")
                # 3. 使用geopy进行逆地理编码,将经纬度转换为可读地址
                print("正在解析地址...")
                geolocator = Nominatim(user_agent="my_geocoder_app")
                location = geolocator.reverse((lat, lon), language='zh-CN')
                if location:
                    print("\n--- 本机设备位置信息 ---")
                    print(f"详细地址: {location.address}")
                    # 也可以单独获取国家、城市等信息
                    address_parts = location.raw['address']
                    print(f"国家: {address_parts.get('country')}")
                    print(f"省份: {address_parts.get('state')}")
                    print(f"城市: {address_parts.get('city')}")
                    print(f"区县: {address_parts.get('suburb')}")
                else:
                    print("无法解析该经纬度为具体地址。")
            else:
                print(f"IP定位失败: {ip_data.get('message')}")
        except requests.exceptions.RequestException as e:
            print(f"网络请求错误: {e}")
        except (GeocoderUnavailable, GeocoderTimedOut) as e:
            print(f"地理编码服务不可用或超时: {e}")
        except Exception as e:
            print(f"发生未知错误: {e}")
    if __name__ == "__main__":
        get_device_location()

方法 B: 在 Windows 上使用原生命令

如果你在 Windows 系统上,可以直接调用 nslookup 命令来获取IP,然后结合上面的方法。

import subprocess
import re
def get_windows_ip():
    try:
        # 调用nslookup命令获取本机IP
        result = subprocess.run(['nslookup', 'myip.opendns.com', 'resolver1.opendns.com'], 
                                capture_output=True, text=True, check=True)
        # 从输出中提取IP地址
        match = re.search(r'Address: ([0-9.]+)', result.stdout)
        if match:
            return match.group(1)
    except (subprocess.CalledProcessError, FileNotFoundError):
        pass
    return None
# 使用方法同上,先获取IP,再调用定位API
ip = get_windows_ip()
if ip:
    print(f"通过Windows命令获取的IP: {ip}")
else:
    print("无法获取IP地址")

获取IP地址对应的地理位置

这通常是获取“位置”最简单的方法,因为它不依赖用户的设备硬件,只需要网络连接,精度通常是城市级别,无法精确到街道。

使用 ip2locationip-api 等服务

许多网站提供IP查询的API,我们只需要发送HTTP请求即可。

Python如何精准获取location信息?-图3
(图片来源网络,侵删)

示例代码 (使用免费的 ip-api.com)

import requests
def get_location_by_ip(ip_address=None):
    """
    根据IP地址获取地理位置信息。
    如果不提供IP,则默认查询本机IP。
    """
    if ip_address is None:
        # 获取本机IP
        try:
            response = requests.get('https://api.ipify.org?format=json')
            response.raise_for_status()
            ip_address = response.json()['ip']
        except requests.exceptions.RequestException:
            print("无法获取本机IP地址。")
            return
    print(f"正在查询IP地址: {ip_address}")
    url = f'http://ip-api.com/json/{ip_address}?lang=zh-CN'
    try:
        response = requests.get(url)
        response.raise_for_status()
        data = response.json()
        if data['status'] == 'success':
            print("\n--- IP地址位置信息 ---")
            print(f"国家: {data.get('country')}")
            print(f"地区: {data.get('regionName')}")
            print(f"城市: {data.get('city')}")
            print(f("邮编: {data.get('zip')}")
            print(f("时区: {data.get('timezone')}")
            print(f("ISP: {data.get('isp')}")
        else:
            print(f"查询失败: {data.get('message')}")
    except requests.exceptions.RequestException as e:
        print(f"网络请求错误: {e}")
# 查询本机IP
get_location_by_ip()
# 查询指定IP (Google 的DNS服务器)
get_location_by_ip("8.8.8.8")

获取文件在系统中的路径

这是最字面意义上的“location”,即文件或目录的绝对路径。

使用 os 模块

os 模块是处理文件和目录路径的标准库。

import os
# 1. 获取当前工作目录
current_dir = os.getcwd()
print(f"当前工作目录: {current_dir}")
# 2. 获取当前执行脚本的绝对路径
script_path = os.path.abspath(__file__)
print(f"当前脚本路径: {script_path}")
# 3. 获取某个文件的绝对路径
# 假设有一个名为 'example.txt' 的文件在脚本同目录下
file_name = 'example.txt'
# 构建文件的完整路径
file_path = os.path.join(current_dir, file_name)
print(f"文件 '{file_name}' 的完整路径: {file_path}")
# 4. 获取目录和文件名
dir_name, base_name = os.path.split(file_path)
print(f"目录名: {dir_name}")
print(f"文件名: {base_name}")
# 5. 检查路径是否存在
if os.path.exists(file_path):
    print(f"文件 '{file_path}' 存在。")
else:
    print(f"文件 '{file_path}' 不存在。")

获取网页或API请求的来源URL

在Web开发中,"location" 可能指请求的来源URL,这通常在处理HTTP请求时获取。

使用 Flask 框架示例

如果你使用像 Flask 这样的Web框架,可以轻松获取请求的URL信息。

# 需要先安装 Flask: pip install Flask
from flask import Flask, request
app = Flask(__name__)
@app.route('/')
def index():
    # request.url: 完整的URL,包括协议、域名、路径和查询参数
    # request.path: 只包含路径部分
    # request.args: 包含查询参数的字典
    # request.referrer: 获取来源页面的URL (HTTP Referer header)
    full_url = request.url
    path = request.path
    query_params = request.args
    referrer = request.referrer
    response = f"""
    <h1>请求URL信息</h1>
    <p><b>完整URL:</b> {full_url}</p>
    <p><b>路径:</b> {path}</p>
    <p><b>查询参数:</b> {dict(query_params)}</p>
    <p><b>来源页面:</b> {referrer if referrer else '无'}</p>
    """
    return response
if __name__ == '__main__':
    # 运行这个脚本,然后在浏览器访问 http://127.0.0.1:5000/?name=python&id=123
    app.run(debug=True)
需求场景 推荐方法 关键库/模块 精度/特点
获取本机设备位置 调用IP定位服务 + geopy requests, geopy 间接定位,精度为城市级,依赖IP库
获取IP对应位置 调用IP查询API requests 简单快速,精度为城市级,无用户授权需求
获取文件系统路径 使用路径操作函数 os 最可靠,用于文件和目录管理
获取Web请求URL 解析HTTP请求对象 Flask, Django, requests 用于Web开发,获取客户端请求信息

请根据你的具体需求选择最合适的方法。

分享:
扫描分享到社交APP
上一篇
下一篇