使用 Python 获取设备的物理位置?
Posted
技术标签:
【中文标题】使用 Python 获取设备的物理位置?【英文标题】:Get physical position of device with Python? 【发布时间】:2012-08-03 01:03:31 【问题描述】:有没有办法使用 Python 获取计算机的物理位置,最好不使用 API,或者使用免费 API?我搜索了一下,发现唯一的免费 API 非常非常不准确。我只需要准确一点,因为它是为了获取当地天气。
【问题讨论】:
1.您尝试过什么,2. 您在寻找的精确度如何? @mfrankli 我搜索了“IP 地理定位 API”,而 IP2location.com 是我唯一找到的东西。我住在一个大城市,他们网站上关于我的 IP 的例子很遥远。它是用来查找当地天气的,所以 ≈50 英里是可以的,但我发现的几乎是一个州。 您可能想要更新您的问题以反映这些事情(尤其是后者)。 基于 IP 的位置检测并不总是很好。您应该检查通过其他 ISP 或从其他位置(朋友家等)连接时尝试使用的工具,并在每个位置的多个工具中检查您报告的位置。基本上,不要太快责怪该工具。 【参考方案1】:您可以尝试使用MaxMind's GeoIP Python API 和他们的免费GeoLite City database。准确性可能会有所不同,更多details here。
还可以查看this question 以了解其他替代方案。
【讨论】:
【参考方案2】:import urllib2
import json
# Automatically geolocate the connecting IP
f = urllib2.urlopen('http://freegeoip.net/json/')
json_string = f.read()
f.close()
location = json.loads(json_string)
print(location)
location_city = location['city']
location_state = location['region_name']
location_country = location['country_name']
location_zip = location['zipcode']
将 HTTP GET 请求发送到:freegeoip.net/format/ip_or_hostname 以接收 Python 可以解析的 JSON 输出。
我得到以下 JSON 密钥,应该足以满足您的需要:
ip 国家代码 国家/地区名称 区域代码 地区名称 城市 邮政编码 纬度 经度 metro_code area_code【讨论】:
“此 API 端点已弃用,现已关闭。”【参考方案3】:例如,您可以从http://www.geoiptool.com/ 之类的网页上抓取它。
【讨论】:
抓取并不理想,Web API 的使用要好得多,因为它不太容易受到解析更改的影响。请参阅下面的答案。 @JasonParham freegeoip.net 目前不工作,抓取或使用 Web API 比使用GeoIP
数据库更糟糕,您可以离线下载,您不必担心这些服务宕机或从服务器下载数据所花费的时间【参考方案4】:
我重新发现了另一个我不太喜欢的天气 API(Weather Underground),但可以选择确定位置。如果我无法使用 geoiptool 刮刀之类的工具,可以使用它。
【讨论】:
【参考方案5】:如果您知道设备的公共 IP,那么您可以使用 freegeip 来做到这一点。下面是获取位置和时区的 Python 3.4.2 代码。
>>> import requests
>>> ip = '141.70.111.66'
>>> url = 'http://freegeoip.net/json/'+ip
>>> r = requests.get(url)
>>> js = r.json()
>>> js['country_code']
'DE'
>>> js['country_name']
'Germany'
>>> js['time_zone']
'Europe/Berlin'
>>> js['city']
'Stuttgart'
>>> js.items()
dict_items([('latitude', 48.7667), ('ip', '141.70.111.66'), ('region_code', 'BW'), ('country_code', 'DE'), ('city', 'Stuttgart'), ('zip_code', '70173'), ('country_name', 'Germany'), ('longitude', 9.1833), ('region_name', 'Baden-Württemberg Region'), ('time_zone', 'Europe/Berlin'), ('metro_code', 0)])
【讨论】:
“此 API 端点已弃用,现已关闭。”【参考方案6】:进入 https://python-visualization.github.io/folium/plugins.html 找到,很容易我的朋友 folium.plugins.LocateControl
【讨论】:
Seba Ledezma,欢迎提供解决方案的链接,但请确保您的答案在没有它的情况下有用:add context around the link 这样您的其他用户就会知道它是什么以及它为什么存在,然后如果目标页面不可用,请引用您链接到的页面中最相关的部分。 Answers that are little more than a link may be deleted. 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。以上是关于使用 Python 获取设备的物理位置?的主要内容,如果未能解决你的问题,请参考以下文章