Vous cherchez à implémenter une meilleure géo-localisation avec Python.
HOSTIP.INFO est un projet open source ayant pour objectif de créer/gérer une base de données. Mapper des adresses IP sur des villes. Leur page about explique les sources de données utilisées pour remplir cette base de données.
À l'aide de HostIP, il existe deux manières d'obtenir des données de localisation à partir d'une adresse IP:
Ils ont également un RESTFUL API: bien conçu et facile à utiliser: il suffit de passer votre adresse IP après le i *** p = *** dans la chaîne de requête GET):
import urllib
response = urllib.urlopen('http://api.hostip.info/get_html.php?ip=12.215.42.19&position=true').read()
print(response)
Deuxièmement, le site Web du projet permet également le téléchargement complet de sa base de données .
Ce n'est pas une lib Python. Mais http://ipinfodb.com/ fournit un service Web pouvant être facilement encapsulé par du code Python avec urllib par exemple.
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
Vous devez demander une clé d'API gratuite. Voir le API doc pour plus de détails.
Vous trouverez ces modules utiles: GeoIP de MaxMind et sa version pure , ainsi que pytz .
J'ai posté ceci dans une autre question qui avait été enterrée, mais liée ici:
#!/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")
Envoyez les requêtes HTTP GET à: freegeoip.net/{format}/{ip_or_hostname} pour recevoir une sortie JSON que Python peut analyser.
Je reçois les clés JSON suivantes, qui devraient suffire à vos besoins:
Trouvé https://freegeoip.net/ ; échantillon python ci-dessous.
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 est également un très bon moyen de le faire.
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()
Je pense que freegeip est une bonne option. Vous trouverez ci-dessous le code Python 3.4.2 permettant d’obtenir l’emplacement et le fuseau horaire.
>>> 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'
"Geopy permet aux développeurs de localiser facilement les coordonnées d'adresses, de villes, de pays et de points de repère dans le monde entier à l'aide de géocodeurs tiers et d'autres sources de données, telles que les wikis.
geopy prend actuellement en charge six géocodeurs: Google Maps, Yahoo! Cartes, Windows Local Live (Terre virtuelle), geocoder.us, GeoNames, pages MediaWiki (avec l'extension GIS) et pages Semantic MediaWiki. "
J'utilise ipinfodb, il est gratuit (inscription requise) et a une limite de 2 requêtes par seconde et semble être précis.
essayer:
http://api.ipinfodb.com/v3/ip-city/?key= {{API_KEY}} & ip = 190.188.221.244 & timezone = true
résultats:
OK ;; 190.188.221.244; AR; ARGENTINE; BUENOS AIRES; LA PLATA; -; - 34,931; -57,949; -03: 00
Vous pouvez utiliser des demandes pour appeler mon service https://ipdata.co
import requests
ip = '1.1.1.1'
response = requests.get('https://api.ipdata.co/{}'.format(ip)).json()
response['time_zone']