Ищете реализацию лучшего геолокации с Python.
Какие библиотеки python могут указать мне приблизительное местоположение и часовой пояс с учетом IP-адреса?
Ответ 1
Hostip.info - проект с открытым исходным кодом с целью создания/поддержки базы данных отображение IP-адресов в городах. Их страница рассказывает о источниках данных, которые были использованы для заполнения этой базы данных.
Используя HostIP, есть два способа получить данные местоположения с IP-адреса:
У них также есть хорошо спроектированный и простой в использовании RESTFUL API: просто передайте свой IP-адрес после я *** p = *** в строке запроса GET):
import urllib
response = urllib.urlopen('http://api.hostip.info/get_html.php?ip=12.215.42.19&position=true').read()
print(response)
Во-вторых, веб-сайт проекта также предоставляет полную базу данных для загрузки.
Ответ 2
Это не Python lib. Но http://ipinfodb.com/ предоставляет веб-сервис, который может быть легко обернут кодом Python с помощью urllib, например.
http://api.ipinfodb.com/v3/ip-city/?key=<your_api_key>&ip=74.125.45.100
http://api.ipinfodb.com/v3/ip-country/?key=<your_api_key>&ip=74.125.45.100
Вам нужно запросить бесплатный ключ API. Подробнее см. API doc.
Ответ 3
Вы можете найти эти модули полезными: MaxMind GeoIP и чистая версия, а также pytz.
Ответ 4
Я разместил это в другом вопросе, который был похоронен, но связан здесь:
#!/usr/bin/env python
from urllib2 import urlopen
from contextlib import closing
import json
# Automatically geolocate the connecting IP
url = 'http://freegeoip.net/json/'
try:
with closing(urlopen(url)) as response:
location = json.loads(response.read())
print(location)
location_city = location['city']
location_state = location['region_name']
location_country = location['country_name']
location_zip = location['zipcode']
except:
print("Location could not be determined automatically")
Отправьте HTTP GET-запросы на: freegeoip.net/{format}/{ip_or_hostname}, чтобы получить вывод JSON, который может обрабатывать Python.
Я получаю следующие ключи JSON, которых должно быть достаточно для того, что вам нужно:
- ф
- country_code
- COUNTRY_NAME
- region_code
- REGION_NAME
- город
- почтовый индекс
- широта
- долготы
- metro_code
- код_города
Ответ 5
Найдено https://freegeoip.net/; Пример Python ниже.
import requests
FREEGEOPIP_URL = 'http://freegeoip.net/json/'
SAMPLE_RESPONSE = """{
"ip":"108.46.131.77",
"country_code":"US",
"country_name":"United States",
"region_code":"NY",
"region_name":"New York",
"city":"Brooklyn",
"zip_code":"11249",
"time_zone":"America/New_York",
"latitude":40.645,
"longitude":-73.945,
"metro_code":501
}"""
def get_geolocation_for_ip(ip):
url = '{}/{}'.format(FREEGEOPIP_URL, ip)
response = requests.get(url)
response.raise_for_status()
return response.json()
Ответ 6
IP API также очень хороший способ сделать это.
import urllib
ip= '12.24.36.48'
url = 'http://ip-api.com/json/' + ip
req = urllib.request.Request(url)
out = urllib.request.urlopen(req).read()
Ответ 7
Я думаю, 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'
Ответ 8
Я использую ipinfodb, является бесплатным (требуется регистрация) и имеет 2 запроса на 1 секунду и кажется точным.
попробовать:
http://api.ipinfodb.com/v3/ip-city/?key= {{API_KEY}} & ip = 190.188.221.244 & timezone = true
возвращает:
ОК; 190.188.221.244; AR; ARGENTINA; BUENOS AIRES; LA PLATA; -; - 34.931; -57.949; -03: 00
Ответ 9
" Geopy позволяет разработчикам находить координаты адресов, городов, стран и ориентиров по всему миру, сторонних геокодеров и других источников данных, таких как вики.
В настоящее время география включает поддержку шести геокодеров: Google Maps, Yahoo! Карты, Windows Local Live (Виртуальная Земля), geocoder.us, GeoNames, MediaWiki (с расширением GIS) и страницы Semantic MediaWiki. "
Ответ 10
Установить модуль python pygeoip
C:>pip install pygeoip
Загрузите двоичный файл GeoLite City здесь: https://dev.maxmind.com/geoip/legacy/geolite/
Тогда:
>>> import pygeoip
>>> g = pygeoip.GeoIP('GeoLiteCity.dat')
>>> ip = '134.222.199.110' #just an example
>>> g.record_by_addr(ip)['latitude']
52.38239999999999
>>> g.record_by_addr(ip)['longitude']
4.899499999999989
>>> g.record_by_addr(ip)['time_zone']
'Europe/Amsterdam'
В отличие от решения freegeoip, которое я вижу в других комментариях, этот параметр не имеет ограничений на количество IP-адресов в час, может использоваться локально без подключения к Интернету, а геокоординаты, как правило, более точны.
Ответ 11
Вы можете использовать запросы для совершения звонка на мою службу https://ipdata.co
import requests
ip = '1.1.1.1'
response = requests.get('https://api.ipdata.co/{}'.format(ip)).json()
response['time_zone']
Ответ 12
У Maxmind есть официальный пакет API, который интегрируется с их веб-сервисом geoip или базами данных геолита. Вам нужно будет либо загрузить их бесплатную базу геолита, либо создать бесплатную пробную учетную запись.
Если вы зарегистрируете учетную запись, вы получите поощрительный кредит в размере 5 долларов США (платные запросы стоят около 0,0001 доллара США каждый). Войдите в свою учетную запись, нажмите "Мой лицензионный ключ" и создайте лицензионный ключ.
Затем установите пакет:
$ pip install geoip2
И проверьте API:
Тестовая функция адаптирована из документов
import geoip2.webservice
account_id = 1 # enter your real account id here
api_key = "enter your real api/license key here"
TEST_IP = '128.101.101.101'
def lookup_ip(ip=TEST_IP):
# This creates a Client object that can be reused across requests.
client = geoip2.webservice.Client(account_id, api_key)
# Replace "insights" with the method corresponding to the web service
# that you are using, e.g., "country", "city".
response = client.insights(ip)
print("country iso code: {0}".format(response.country.iso_code))
print("country name: {0}".format(response.country.name))
print("subdivisions most specific name: {0}".format(response.subdivisions.most_specific.name))
print("subdivisions most specific iso code: {0}".format(response.subdivisions.most_specific.iso_code))
print("city name: {0}".format(response.city.name))
print("postal code:{0}".format(response.postal.code))
print("coordinates: ({0}, {1})".format(response.location.latitude, response.location.longitude))
return response
if __name__ == "__main__":
resp = lookup_ip()
input("")