如何使用Python访问任何用户的当前位置

34 投票
11 回答
158772 浏览
提问于 2025-04-18 14:24

有没有什么办法可以通过Python获取我设备的位置?现在我需要使用selenium打开一个浏览器,访问一个位置服务网站,然后把结果设置为纬度和经度的变量。

但有没有更简单的方法呢?

更新:我在我的Raspberry Pi上使用的是3G网卡,所以我想找到一种方法来获取它的具体纬度和经度——我可以通过网络服务成功做到这一点,只是在想Python里有没有更快的方法来处理这些请求?

11 个回答

2

Ipregistry 是一个可以根据你的当前IP地址或指定的IP地址返回位置信息的服务,除了位置,它还会提供货币、时区等信息(顺便说一下,我是这个服务的运营者)。另外,PyPI上也有一个官方的Python客户端可以使用:

$ pip install ipregistry
from ipregistry import IpregistryClient

client = IpregistryClient("tryout")  
ipInfo = client.lookup() 
print(ipInfo)

与许多其他服务不同,Ipregistry提供了很多数据,包括运营商、公司等信息,除了城市、经度、纬度、货币、时区等,所有这些信息都可以通过一次快速的请求获取。

2

这里有一个Python的地理编码模块,它包含了GeoFreeIP功能。

示例链接: http://geocoder.readthedocs.io/

$ pip install geocoder

使用命令行界面(CLI)

$ geocode '99.240.181.199' --provider freegeoip --pretty --json

使用Python编程

>>> import geocoder
>>> g = geocoder.freegeoip('99.240.181.199')
<[OK] Freegeoip - Geocode [Ottawa, Ontario Canada]>
>>> g.json
7

因为 http://freegeoip.net/json 这个接口已经不再使用,并且会在2018年7月1日停止工作,所以他们推出了新的接口 http://api.ipstack.com

你可以试试这个新的接口:

import requests
import json

send_url = "http://api.ipstack.com/check?access_key=YOUR_ACCESS_KEY"
geo_req = requests.get(send_url)
geo_json = json.loads(geo_req.text)
latitude = geo_json['latitude']
longitude = geo_json['longitude']
city = geo_json['city']

要获取你自己的 ACCESS_KEY,你需要先在 ipstack.com 上注册一个免费账户,注册地址是 https://ipstack.com/signup/free

除了可以获取 latitude(纬度)、longitude(经度)和 city(城市)之外,你还可以获取 zip(邮政编码)、continent_code(洲代码)、continent_name(洲名)、country_code(国家代码)、country_name(国家名)、region_code(地区代码)和 region_name(地区名)。

限制:免费账户每个月只能发送10,000次请求。如果你的需求超过这个数量,可以考虑升级你的账户。

想了解更多关于这个新接口的信息,可以访问 https://github.com/apilayer/freegeoip

参考:@JishnuM 的回答

22

其他人提到了一些服务,但还有一个值得考虑的就是我自己的服务,https://ipinfo.io,它可以提供你的经纬度和其他很多信息:

在Bash中使用:

$ curl ipinfo.io
{
  "ip": "24.6.61.239",
  "hostname": "c-24-6-61-239.hsd1.ca.comcast.net",
  "city": "Mountain View",
  "region": "California",
  "country": "US",
  "loc": "37.3845,-122.0881",
  "org": "AS7922 Comcast Cable Communications, LLC",
  "postal": "94040"
}

如果你只想要坐标数据,可以通过请求 /loc 来获取:

$ curl ipinfo.io/loc
37.3845,-122.0881

想了解更多细节,可以查看 https://ipinfo.io/developers

53

或者,可以这么简单

import geocoder
g = geocoder.ip('me')
print(g.latlng)

撰写回答