Temps de lecture estimé : 5 minutes
Points clés à retenir
- Le module socket résout un domaine en IP mais ne géolocalise pas.
- ip-api.com gratuit : 45 requêtes par minute maximum.
- GeoLite2 en local supprime quota et dépendance réseau.
- La précision d’une IP varie de quelques km à des centaines.
- Une IP géolocalisée est une donnée personnelle au sens du RGPD.
Comprendre comment localiser une adresse IP avec Python
Pour localiser une adresse IP avec Python, il faut d’abord savoir ce qu’une adresse IP contient réellement. Une IPv4 tient sur 32 bits, sous la forme de quatre octets séparés par des points, comme 192.168.1.1. Une IPv6 tient sur 128 bits et s’écrit en hexadécimal.
Aucune de ces adresses ne contient de coordonnées. La localisation vient d’une base de données géo-IP qui associe des plages d’adresses à une ville ou une région. La résolution DNS, elle, ne fait que relier un nom de domaine à une adresse.
Une précision très variable
La précision va de quelques kilomètres à plusieurs centaines de kilomètres selon la base utilisée. Un VPN, un proxy ou une IP partagée par un opérateur brouillent encore le résultat.
Dans mes années de direction, j’ai appris que l’on décide mal avec une donnée dont on surestime la fiabilité. Ici, la ville renvoyée est une estimation, pas une adresse postale.

Les prérequis avant de coder
Il vous faut Python 3 et pip. Je crée toujours un environnement virtuel pour isoler les dépendances du projet.
- python -m venv venv crée l’environnement.
- pip install requests geoip2 installe les deux bibliothèques utilisées plus bas.
Le vrai choix se fait entre une API web (appel réseau via requests) et une base locale (GeoIP2). Je les compare plus loin.
Localiser une IP avec le module socket
Le module socket est natif, donc sans installation. La fonction gethostbyname() transforme un nom de domaine en adresse IP.
Le socket seul ne donne aucune géolocalisation. Il sert de première brique, pour obtenir l’IP d’un site avant de l’interroger.
La fonction gethostbyaddr() fait l’inverse : elle tente de retrouver le hostname d’une IP par requête DNS inversée. Le résultat dépend du réglage de l’opérateur et échoue souvent.
Localiser une adresse IP avec Python et une API
Avec requests, une seule ligne suffit pour interroger un service. J’ai testé le principe avec ip-api.com, gratuit et sans clé.
Le service autorise 45 requêtes par minute en usage gratuit non commercial. Au-delà, il faut passer à une offre payante.
Trois services, une même logique
- ip-api.com : gratuit, sans clé, réponse JSON directe.
- ipinfo.io : renvoie ip, hostname, city, region, country, loc, org, postal et timezone.
- ipapi.co : même principe, avec un JSON comparable.
Voici un exemple minimal :
import requests
r = requests.get(« http://ip-api.com/json/151.101.1.69 », timeout=5)
data = r.json()
print(data[« city »], data[« country »], data[« lat »], data[« lon »])
Pour une IP DigitalOcean, ip-api.com a renvoyé la ville de Slough, la région England et le code postal SL1. Ce résultat montre que l’on obtient souvent le datacenter, pas l’utilisateur.
Localiser une IP hors ligne avec GeoIP2
La base GeoLite2-City de MaxMind se télécharge après création d’un compte gratuit. Elle est mise à jour chaque semaine, d’après MaxMind.
import geoip2.database
with geoip2.database.Reader(« GeoLite2-City.mmdb ») as reader :
r = reader.city(« 151.101.1.69 »)
print(r.city.name, r.country.name, r.location.latitude, r.location.longitude)
L’avantage est net : aucune dépendance réseau, aucun quota et une latence très faible. En contrepartie, il faut penser à renouveler le fichier, sinon la précision se dégrade.
Comparer les méthodes et choisir la bonne
| Critère | API gratuite | Base locale GeoIP2 |
|---|---|---|
| Quota | 45 requêtes/minute (ip-api.com) | Aucun |
| Réseau | Requis | Non |
| Mise à jour | Gérée par le service | À faire soi-même |
| Mise en route | Immédiate | Compte et fichier à télécharger |
Pour ma part, je prends une API pour un script ponctuel ou un prototype. Dès que le volume grimpe, je bascule sur une base locale.
- Sécurité réseau : la base locale traite des milliers de lignes de logs sans quota.
- Ciblage marketing : la précision à la ville suffit rarement, restez au niveau du pays ou de la région.
- Application Flask ou Django : une API convient au début, la base locale ensuite.
Bonnes pratiques, sécurité et RGPD
Gérez les erreurs : un timeout, un code HTTP 429 ou un champ manquant ne doivent pas faire planter le script. Surveillez le quota de l’API utilisée.
Mettez aussi en place un cache. Une même IP interrogée dix fois consomme dix requêtes pour rien. Un simple dictionnaire ou un cache Redis règle le problème.
Ce que dit le RGPD
Le RGPD (Règlement UE 2016/679) considère la localisation dérivée d’une IP comme une donnée à caractère personnel. Il vous faut donc une base légale et, selon le cas, le consentement de l’utilisateur.
- Ne conservez que ce dont vous avez besoin, par exemple le pays plutôt que les coordonnées.
- Indiquez le traitement dans votre politique de confidentialité.
- Limitez la durée de conservation des IP dans vos logs.
Une base locale aide ici : l’IP de vos visiteurs ne part chez aucun tiers.
Exemple concret : une mini-application de géolocalisation
Ce script combine résolution DNS et appel API, puis l’expose dans une route Flask.
import socket, requests
from flask import Flask, jsonify
app = Flask(__name__)
@app.route(« /locate/<host> »)
def locate(host) :
try :
ip = socket.gethostbyname(host)
d = requests.get(f »http://ip-api.com/json/{ip} », timeout=5).json()
except (socket.gaierror, requests.RequestException) :
return jsonify(error= »lookup failed »), 502
return jsonify(ip=ip, city=d.get(« city »), country=d.get(« country »), lat=d.get(« lat »), lon=d.get(« lon »))
Appelez /locate/example.com et vous obtenez la ville, le pays et les coordonnées en JSON. Ajoutez le cache et la gestion du quota avant toute mise en production.
Vous avez maintenant trois façons de localiser une adresse IP avec Python, et les critères pour choisir entre elles.


