¿Qué bibliotecas de Python pueden indicarme la ubicación y la zona horaria aproximadas con una dirección IP?

Buscando implementar una mejor ubicación geográfica con Python.

Hostip.info es un proyecto de código abierto con el objective de crear / mantener una base de datos que asigne direcciones IP a las ciudades . Su página sobre explica las fonts de datos en las que se basa para completar esta base de datos.

Usando HostIP, hay dos formas de obtener datos de ubicación de una dirección IP:

También tienen una API RESTFUL bien diseñada y fácil de usar: simplemente pase su dirección IP después de i *** p = *** en la cadena de solicitud GET):

 import urllib response = urllib.urlopen('http://api.hostip.info/get_html.php?ip=12.215.42.19&position=true').read() print(response) 

En segundo lugar, el sitio web del proyecto también pone a disposición su base de datos completa para descargar.

No es una libra de Python. Pero http://ipinfodb.com/ proporciona un servicio web que puede ser fácilmente envuelto por el código Python con urllib, por ejemplo.

 http://api.ipinfodb.com/v3/ip-city/?key=&ip=74.125.45.100 http://api.ipinfodb.com/v3/ip-country/?key=&ip=74.125.45.100 

Necesitas solicitar una clave API gratis. Ver la documentación de la API para más detalles.

Puede encontrar estos módulos útiles: el GeoIP de MaxMind y su versión pura , así como pytz .

Publiqué esto en otra pregunta que había sido enterrada, pero enlazada aquí:

 #!/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") 

Envíe las solicitudes HTTP GET a: freegeoip.net/{format}/{ip_or_hostname} para recibir una salida JSON que Python puede analizar.

Obtengo las siguientes claves JSON, que deberían ser suficientes para lo que necesita:

  • ip
  • código de país
  • nombre del país
  • código de región
  • nombre_región
  • ciudad
  • código postal
  • latitud
  • longitud
  • código_metro
  • codigo de AREA

Encontrado https://freegeoip.net/ ; muestra de python a continuación.

 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() 

IP API también es una muy buena manera de hacerlo.

 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() 

introduzca la descripción de la imagen aquí

Creo que freegeip es una buena opción. A continuación se muestra el código de Python 3.4.2 para obtener la ubicación y la zona horaria.

 >>> 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' 

Estoy usando ipinfodb, es gratuito (se requiere registro) y tiene 2 consultas por límite de segundos y parece ser preciso.

tratar:

http://api.ipinfodb.com/v3/ip-city/?key= {{API_KEY}} & ip = 190.188.221.244 & timezone = true

devoluciones:

OK ;; 190.188.221.244; AR; ARGENTINA; BUENOS AIRES; LA PLATA; -; – 34.931; -57.949; -03: 00

Geopy facilita a los desarrolladores la localización de coordenadas de direcciones, ciudades, países y puntos de referencia en todo el mundo mediante geocodificadores de terceros y otras fonts de datos, como wikis.

geopy actualmente incluye soporte para seis geocodificadores: Google Maps, Yahoo! Mapas, Windows Local Live (Virtual Earth), geocoder.us, GeoNames, páginas MediaWiki (con la extensión GIS) y páginas Semantic MediaWiki.

Instalar el módulo Python Pygeoip

 C:>pip install pygeoip 

Descargue el archivo binario de GeoLite City desde aquí: https://dev.maxmind.com/geoip/legacy/geolite/

Entonces:

 >>> 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'

Contrariamente a la solución de Freegeoip que veo en los otros comentarios, esta opción no tiene límites en el número de IP por hora, se puede usar localmente sin conexión a Internet y los geocoordinados son generalmente más precisos.

Podría usar solicitudes para hacer una llamada a mi servicio https://ipdata.co

 import requests ip = '1.1.1.1' response = requests.get('https://api.ipdata.co/{}'.format(ip)).json() response['time_zone']