Подтвердить что ты не робот

Получите ваше местоположение через python

В любом случае, я могу получить местоположение своего устройства через python. В настоящее время мне приходится использовать селен и открывать браузер, использовать веб-сайт службы определения местоположения и устанавливать результат этого для переменных для lat/long.

Но есть ли более простой способ сделать это?

UPDATE: я использую 3G-ключ на моем RaspberryPi, так что ищу способ получить конкретный лат/долгое время - я могу успешно сделать это через веб-сервис, просто интересно, есть ли более быстрый способ, встроенный в python для этих запросов?

4b9b3361

Ответ 1

Обновление: эта конечная точка API устарела и перестанет работать 1 июля 2018 года. Для получения дополнительной информации, пожалуйста, посетите: https://github.com/apilayer/freegeoip#readme "

Предположения:

Устройство, для которого ищется местоположение, - это устройство, на котором работает Python. У вас есть доступ к Интернету (кажется справедливым, поскольку вы упоминаете сайт службы определения местоположения)

В таком случае существуют службы, аналогичные той, которая указана в комментарии, где IP-адрес запроса используется для генерации местоположения. Например, http://freegeoip.net/.

import requests
import json

send_url = 'http://freegeoip.net/json'
r = requests.get(send_url)
j = json.loads(r.text)
lat = j['latitude']
lon = j['longitude']

Недостатки

Только IP используется для создания местоположения.

Ответ 2

или, просто, как этот

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

Ответ 3

Другие упомянули несколько сервисов, но еще один - мой, 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 для более подробной информации.

Ответ 4

Поскольку http://freegeoip.net/json конечная точка API устарела и перестает работать 1 июля 2018 года. Итак, они выпускают новый API http://api.ipstack.com.

Итак, вы можете попробовать это с новым API:

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 запросов/месяц. Если ваше требование больше, вы можете обновить свою учетную запись.

Для получения дополнительной информации об этом новом API вы можете посетить по адресу https://github.com/apilayer/freegeoip

Ссылка: @JishnuM ответ

Ответ 5

Здесь находится модуль геокодирования 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

Ответ 6

играл с этим, поэтому благодаря всем полезным ответам в этом потоке (и SO вообще!) подумал, что я поделился бы своей короткой программой на тот случай, если кто-то захочет увидеть ее в сочетании с большим кругом calc

import geocoder

import requests
freegeoip = "http://freegeoip.net/json"
geo_r = requests.get(freegeoip)
geo_json = geo_r.json()

address=input('enter an address: ')
g= geocoder.google(address)
lat_ad=g.latlng[0]
lon_ad=g.latlng[1]

user_postition = [geo_json["latitude"], geo_json["longitude"]]
lat_ip=user_postition[0]
lon_ip=user_postition[1]

#Calculate the great circle distance between two points on the earth (specified in decimal degrees)

from math import radians, cos, sin, asin, sqrt
# convert decimal degrees to radians 
lon_ad, lat_ad, lon_ip, lat_ip = map(radians, [lon_ad, lat_ad, lon_ip, lat_ip])

# haversine formula 
dlon = lon_ip - lon_ad 
dlat = lat_ip - lat_ad 
a = sin(dlat/2)**2 + cos(lat_ad) * cos(lat_ip) * sin(dlon/2)**2
c = 2 * asin(sqrt(a)) 
km = 6367 * c
#end of calculation

#limit decimals
km = ('%.0f'%km)

print(address+' is about '+str(km)+' km away from you')

Ответ 7

С помощью API ipdata.co

В этом ответе используется "тестовый" API-ключ, который очень ограничен и предназначен только для тестирования нескольких вызовов. Зарегистрируйтесь для получения своего бесплатного ключа API и ежедневно получайте до 1500 запросов на разработку.

import requests
r = requests.get('https://api.ipdata.co?api-key=test').json()
r['country_name']
# United States

Ответ 8

@JishnuM ответил на вопросы удивительно.

2 цента от меня. Вам не нужно импортировать библиотеку json.

Вы можете сделать следующее:

freegeoip = "http://freegeoip.net/json"
geo_r = requests.get(freegeoip)
geo_json = geo_r.json()

user_postition = [geo_json["latitude"], geo_json["longitude"]]

print(user_postition)

Ответ 9

Расположение на основе IP-адреса дает только местоположение для вашего сервера. Чтобы найти местоположение в зависимости от вашего текущего местоположения, вам нужно предоставить браузеру доступ к местоположению. Это можно сделать с помощью селена.

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait

def getLocation():
    chrome_options = Options()
    chrome_options.add_argument("--use-fake-ui-for-media-stream")
    timeout = 20
    driver = webdriver.Chrome(chrome_options=chrome_options)
    driver.get("https://mycurrentlocation.net/")
    wait = WebDriverWait(driver, timeout)
    longitude = driver.find_elements_by_xpath('//*[@id="longitude"]')
    longitude = [x.text for x in longitude]
    longitude = str(longitude[0])
    latitude = driver.find_elements_by_xpath('//*[@id="latitude"]')
    latitude = [x.text for x in latitude]
    latitude = str(latitude[0])
    driver.quit()
    return (latitude,longitude)
print getLocation()

Учебник о том, как это сделать, можно найти здесь или найти репозиторий GitHub здесь.

Ответ 10

Конечные точки freegoip.net и api.ipstack.com, похоже, используют местоположение интернет-провайдера (ISP), а не местоположение моего устройства. Я попытался завить http://api.ipstack.com/check?access_key=YOUR_KEY, и я получил

{"ip":"106.51.151.31","type":"ipv4","continent_code":"AS","continent_name":"Asia","country_code":"IN","country_name":"India","region_code":"KA","region_name":"Karnataka","city":"Bengaluru","zip":"560008","latitude":12.9833,"longitude":77.5833,"location":{"geoname_id":1277333,"capital":"New Delhi","languages":[{"code":"hi","name":"Hindi","native":"\u0939\u093f\u0928\u094d\u0926\u0940"},{"code":"en","name":"English","native":"English"}],"country_flag":"http:\/\/assets.ipstack.com\/flags\/in.svg","country_flag_emoji":"\ud83c\uddee\ud83c\uddf3","country_flag_emoji_unicode":"U+1F1EE U+1F1F3","calling_code":"91","is_eu":false}}

Проверка местоположения lat, long на картах Google указывает, что это местоположение поставщика услуг, а не местоположение сервера/устройства.

Это решение по-прежнему применимо, но, вероятно, только для гранулярности города или страны, в зависимости от того, как провайдер организует и находит свои шлюзы.

Ответ 11

Ipregistry возвращает данные о местонахождении вместе с валютой, часовым поясом и т.д. Для вашего текущего адреса UP или указанного (отказ от ответственности, я запускаю службу). Существует также официальный клиент Python, доступный на PyPI:

$ pip install ipregistry
from ipregistry import IpregistryClient

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