【问题标题】:Get physical position of device with Python?使用 Python 获取设备的物理位置?
【发布时间】:2012-08-03 01:03:31
【问题描述】:

有没有办法使用 Python 获取计算机的物理位置,最好不使用 API,或者使用免费 API?我搜索了一下,发现唯一的免费 API 非常非常不准确。我只需要准确一点,因为它是为了获取当地天气。

【问题讨论】:

  • 1.您尝试过什么,2. 您在寻找的精确度如何?
  • @mfrankli 我搜索了“IP 地理定位 API”,而 IP2location.com 是我唯一找到的东西。我住在一个大城市,他们网站上关于我的 IP 的例子很遥远。它是用来查找当地天气的,所以 ≈50 英里是可以的,但我发现的几乎是一个州。
  • 您可能想要更新您的问题以反映这些事情(尤其是后者)。
  • 基于 IP 的位置检测并不总是很好。您应该检查通过其他 ISP 或从其他位置(朋友家等)连接时尝试使用的工具,并在每个位置的多个工具中检查您报告的位置。基本上,不要太快责怪该工具。

标签: python geolocation


【解决方案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
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-09
      • 1970-01-01
      相关资源
      最近更新 更多