Temps de lecture estimé : 11 minutes
Points clés à retenir
- Une IP ne donne pas d’adresse exacte : seulement une approximation au niveau pays, région et ville, avec une marge d’erreur variable.
- requests + une API REST (ipapi.co, ip-api.com) constitue le point d’entrée le plus rapide pour démarrer.
- Timeout et gestion d’erreurs sont aussi critiques que le code lui-même — ne jamais les traiter comme optionnels.
- Un proxy ou VPN peut invalider la localisation. Anticiper ce cas dans la logique applicative.
- Le RGPD s’applique dès que l’IP est reliée à un utilisateur identifiable : base légale, durée de conservation, politique de confidentialité.
Savoir comment localiser une adresse IP en Python ouvre des cas d’usage concrets dans n’importe quel projet web : adaptation du contenu selon la zone géographique, filtrage antifraude, analyse de trafic entrant. Mais entre la promesse de certains tutoriels et ce que les données permettent, la différence est souvent brutale.
Le mythe vs la réalité : une adresse IP ne révèle pas l’adresse postale d’un utilisateur. Dans le meilleur des cas, elle indique un pays, une région et une ville. Avec une marge d’erreur qui dépend de la qualité de la base de données interrogée. C’est le point de départ honnête de tout projet de géolocalisation IP.
Comprendre la localisation d’une adresse IP
Ce que l’on peut savoir avec une IP
Une adresse IP est un identifiant réseau, pas un marqueur géographique précis. Ce qu’on peut en tirer concrètement : le pays d’origine dans la grande majorité des cas, la région dans environ 80 % des situations selon les bases disponibles, la ville avec une marge d’erreur non négligeable. Zéro garantie de précision fine n’existe sans une base de données fraîche et une source fiable.
La documentation officielle reste souvent vague sur un point essentiel : la localisation dépend du FAI (fournisseur d’accès Internet) qui a déclaré son bloc d’adresses auprès des registres régionaux. Si l’opérateur a centralisé ses déclarations dans une seule ville, toutes les IPs du bloc y seront rattachées. Même pour des utilisateurs répartis sur tout le territoire.
Les limites de précision par pays, ville et fournisseur
La précision décroît à mesure que l’on affine la granularité : pays → région → ville → quartier. Au niveau pays, la fiabilité dépasse généralement 95 %. Au niveau ville, elle peut tomber à 60-70 %, selon les études publiées par MaxMind sur leurs propres bases de données GeoIP.
On en parle peu, mais c’est souvent là que tout se joue dans les projets antifraude : un proxy ou VPN peut masquer la position réelle de l’utilisateur. Un utilisateur français qui sort via un VPN grand public basé à Amsterdam sera détecté aux Pays-Bas. La détection de VPN est un sujet à part entière, hors du périmètre d’une simple géolocalisation IP.
Les différences entre IP publique et IP privée
Une IP publique est routable sur Internet et peut être géolocalisée. Une IP privée (plages 192.168.x.x, 10.x.x.x, 172.16-31.x.x) identifie un appareil dans un réseau local. Elle ne sort jamais vers l’extérieur et ne dit rien sur la localisation géographique.
Une adresse IPv4 est composée de 4 octets (exemple : 91.198.174.2). Une adresse IPv6, format de plus en plus répandu, compte 128 bits organisés en 8 groupes hexadécimaux. Les deux formats peuvent être géolocalisés, mais les bases de données IPv6 sont souvent moins complètes que leurs équivalentes IPv4.
Préparer Python pour l’analyse IP
Les bibliothèques utiles pour les requêtes réseau
Pour la grande majorité des cas d’usage, requests suffit. Cette bibliothèque HTTP de référence permet d’interroger n’importe quelle API REST de géolocalisation avec une dizaine de lignes de code. Pour des projets plus avancés, httpx offre le support asynchrone. Utile si l’on traite des volumes importants en parallèle.
Si l’on préfère éviter les dépendances aux API distantes, geoip2 (la bibliothèque officielle de MaxMind) permet d’interroger une base de données locale au format MMDB. Plus robuste en production, mais elle nécessite de maintenir la base à jour — MaxMind propose des mises à jour hebdomadaires gratuites pour leur version GeoLite2.
Les formats de données à récupérer
Les APIs de géolocalisation retournent du JSON. Les 3 champs de base utiles dans la majorité des cas : country (code ISO pays), region et city. Certaines APIs enrichissent la réponse avec le code postal, les coordonnées GPS, le FAI et le fuseau horaire — des champs à collecter uniquement si le besoin est documenté.
Prévoir dès la conception que certains champs peuvent être vides. Une IP d’un réseau d’entreprise retournera souvent le siège social déclaré, pas la localisation du salarié en télétravail. Le parsing doit gérer ces cas sans planter le script.
Les précautions de base avant d’interroger une API
Avant le premier appel : vérifier que l’IP est bien publique (pas une plage privée), définir un timeout de 5 à 10 secondes pour éviter tout blocage réseau, et prévoir un fallback si l’API est indisponible. 1 requête par utilisateur ou par session suffit généralement. Appeler l’API à chaque page vue est inutile et épuise rapidement les quotas gratuits.
Localiser une adresse IP avec une API
Récupérer les données géographiques d’une IP
Concrètement, ça donne quoi en pratique ? Voici un exemple minimal avec requests et l’API ipapi.co (gratuite jusqu’à 1 000 requêtes par jour) :
import requests
def localiser_ip(ip):
try:
response = requests.get(
f"https://ipapi.co/{ip}/json/",
timeout=8
)
response.raise_for_status()
data = response.json()
return {
"pays": data.get("country_name"),
"region": data.get("region"),
"ville": data.get("city"),
"fai": data.get("org")
}
except requests.RequestException as e:
print(f"Erreur réseau: {e}")
return None
Ce script couvre l’essentiel : appel API avec timeout, gestion d’exception, retour structuré. En conditions normales, 200 à 300 millisecondes suffisent pour obtenir une réponse depuis une API publique bien dimensionnée.
Lire les champs essentiels : pays, région, ville, FAI
La clé country_name retourne le nom complet du pays. country_code retourne le code ISO à 2 lettres. Préférable pour les comparaisons programmatiques. org ou isp indique le fournisseur d’accès : utile pour distinguer une IP résidentielle d’une IP datacenter, souvent synonyme de bot ou de scraper.
Gérer les réponses incomplètes ou absentes
Utiliser systématiquement .get("champ") plutôt que ["champ"] pour éviter les KeyError sur des champs absents. Si l’API retourne un champ error dans le JSON, c’est souvent le signe que l’IP est invalide, réservée, ou que le quota est atteint. Logguer ces cas plutôt que les ignorer silencieusement.
Utiliser des bibliothèques Python dédiées
En tant qu’ancien startuper, je me suis longtemps planté sur ce point : choisir une API gratuite pour un prototype, puis se retrouver à migrer en urgence quand le volume dépassait le quota. Voici une comparaison honnête des principales options.
| Solution | Simplicité | Précision | Coût | Cas d’usage idéal |
|---|---|---|---|---|
| ipapi.co | Très simple | Bonne | Gratuit jusqu’à 1 000/j | Prototype, faible volume |
| ip-api.com | Très simple | Bonne | Gratuit (non commercial) | Tests, usage personnel |
| MaxMind GeoLite2 | Intermédiaire | Très bonne | Gratuit (base locale) | Production, fort volume |
| ipinfo.io | Simple | Bonne | Gratuit jusqu’à 50 000/mois | Applications web moyennes |
Exemple avec requests et une API simple
L’approche requests + API REST convient pour la majorité des projets. Elle ne nécessite aucune installation de base de données locale, fonctionne immédiatement et peut être testée avec curl avant d’écrire la moindre ligne de Python. C’est le bon point d’entrée pour valider un besoin avant d’investir dans une solution plus robuste.
Exemple avec geoip2 selon le besoin
La bibliothèque geoip2 s’installe via pip install geoip2 et interroge un fichier .mmdb local. Aucune latence réseau, aucun quota, fonctionnement hors ligne. La contrainte : télécharger et mettre à jour la base régulièrement. Dans un contexte applicatif actif, une mise à jour toutes les 24 heures assure la fraîcheur des données.
import geoip2.database
with geoip2.database.Reader('GeoLite2-City.mmdb') as reader:
response = reader.city('91.198.174.2')
print(response.country.name) # France
print(response.city.name) # Paris
Comparer la simplicité, la précision et le coût
La règle pratique : API distante pour les phases de développement et les trafics modérés, base locale pour la production à fort volume. Le coût de la migration entre les deux est faible si le code est bien découplé dès le départ — une fonction localiser_ip() qui isole l’appel, pas dix appels dispersés dans le code.
Trouver l’IP d’un utilisateur ou d’un serveur
Récupérer l’IP côté serveur web
Dans une application Flask, l’IP du visiteur est accessible via request.remote_addr. Dans FastAPI, via request.client.host. Cette valeur correspond à l’IP qui a établi la connexion TCP — pas nécessairement l’IP réelle si un proxy ou un load balancer est présent en amont.
Pour récupérer l’IP réelle dans ce contexte, on consulte l’en-tête X-Forwarded-For. Attention : cet en-tête peut contenir plusieurs IPs séparées par des virgules (chaîne de proxys). La première est généralement l’IP client.
def get_client_ip(request):
x_forwarded = request.headers.get('X-Forwarded-For')
if x_forwarded:
return x_forwarded.split(',')[0].strip()
return request.remote_addr
Filtrer les proxys et en-têtes trompeurs
On en parle peu, mais c’est souvent là que tout se joue dans les applications exposées à des acteurs malveillants : X-Forwarded-For peut être falsifié côté client. Ne jamais se baser sur cet en-tête seul pour des décisions de sécurité. Croiser avec l’IP de connexion TCP, ou utiliser un service de détection de proxy dédié, est indispensable dans ce cas.
Comprendre les enjeux de sécurité et de confidentialité
Une adresse IP est une donnée personnelle au sens du RGPD dès lors qu’elle est associée à un utilisateur identifiable. Cela implique une base légale pour la collecter, une durée de conservation définie et une mention dans la politique de confidentialité. La vraie question n’est pas « comment » traiter cette donnée, mais « pourquoi » — et si ce pourquoi est documenté quelque part dans l’organisation.
Automatiser et fiabiliser le résultat
Ajouter la gestion d’erreurs et les délais
Un script de géolocalisation sans gestion d’erreurs est un script qui tombera en production. Les cas à couvrir : timeout réseau (l’API ne répond pas dans les délais fixés), erreur HTTP 4xx ou 5xx, réponse JSON malformée, IP invalide ou privée passée par erreur. Encapsuler dans un try/except avec un retour None propre vaut mieux qu’une exception non gérée qui coupe le flux applicatif.
Vérifier la cohérence des données retournées
Une vérification basique de cohérence : si l’API retourne un pays vide, une ville sans région, ou des coordonnées GPS à (0, 0), c’est le signal de données dégradées. Mettre en place un schéma de validation simple. Avec pydantic par exemple. Évite de propager des valeurs erronées dans le reste du système.
Journaliser les résultats pour un usage durable
Un journal d’erreurs aide à diagnostiquer les IP non résolues et à identifier des patterns : pic de requêtes depuis un pays inhabituel, augmentation des erreurs API, dérive du quota. Le module logging de la bibliothèque standard Python suffit dans la plupart des cas. Stocker le résultat en cache (Redis ou fichier) évite de rappeler l’API sur la même IP dans la même session.
Cas d’usage et bonnes pratiques
Antifraude et segmentation géographique
La géolocalisation IP est utile en antifraude pour détecter une incohérence géographique (un compte parisien qui se connecte depuis une IP en Asie du Sud-Est), identifier des IPs datacenter souvent associées à des bots, ou signaler des connexions depuis des zones à risque élevé pour certains types de transactions.
Support client et personnalisation
Côté expérience utilisateur, la géolocalisation IP permet de pré-sélectionner la langue d’affichage, d’adapter la devise ou les options de livraison, ou d’orienter vers le bon support local. Ces adaptations doivent rester réversibles : un utilisateur doit toujours pouvoir corriger la détection automatique, surtout s’il utilise un VPN.
Respect du cadre légal et des données personnelles
Concrètement, ça donne quoi en pratique pour le RGPD ? Trois règles simples : collecter seulement les champs nécessaires (pas les coordonnées GPS si seul le pays est utile), ne pas stocker l’IP brute plus longtemps que nécessaire, et documenter la finalité dans la politique de confidentialité. Une IP anonymisée — les deux derniers octets masqués. Suffit souvent pour les usages statistiques.
La géolocalisation IP est un outil de contexte, pas d’identification. Elle permet d’orienter, pas de certifier. Garder cette distinction en tête évite des décisions mal calibrées et des risques juridiques évitables.
Questions Fréquentes
Comment localiser une adresse IP en Python ?
La méthode la plus directe consiste à utiliser requests pour interroger une API REST comme ipapi.co ou ip-api.com. On envoie un GET sur l’endpoint avec l’IP en paramètre, on parse le JSON retourné, on extrait les champs pays, région et ville. Un timeout de 5 à 8 secondes et une gestion des exceptions réseau sont indispensables pour un usage en production.
Quelle bibliothèque Python utiliser pour géolocaliser une IP ?
Pour un usage simple avec API distante, requests suffit. Pour un usage en production sans dépendance réseau, geoip2 de MaxMind avec la base GeoLite2 locale est plus robuste. Pour des volumes très importants, ajouter un cache Redis devant l’appel géolocalisation évite de saturer les quotas.
Peut-on connaître la ville exacte d’une adresse IP ?
Non. La localisation au niveau ville est approximative et dépend de la déclaration faite par le FAI aux registres Internet. La précision au niveau pays dépasse généralement 95 %, mais elle peut tomber à 60-70 % au niveau ville. Ne pas concevoir une application qui nécessite une précision inférieure à la ville sans source complémentaire.
Comment récupérer l’IP d’un visiteur avec Python ?
Dans Flask, via request.remote_addr. Dans FastAPI, via request.client.host. Si un proxy ou load balancer est en amont, consulter l’en-tête X-Forwarded-For et prendre la première IP de la liste. Ne pas utiliser cet en-tête seul dans un contexte de sécurité — il peut être falsifié par le client.
Quelle est la différence entre IPv4 et IPv6 ?
IPv4 utilise 4 octets (32 bits), soit environ 4,3 milliards d’adresses possibles. IPv6 utilise 128 bits, ce qui offre un espace d’adressage quasi illimité. Les deux formats peuvent être géolocalisés, mais les bases de données IPv6 sont souvent moins complètes. La plupart des APIs modernes gèrent les deux formats sans configuration supplémentaire.
Une adresse IP permet-elle d’identifier une personne ?
Pas directement. Seul le FAI peut faire le lien entre une IP et un abonné, sur réquisition judiciaire. La CNIL et le RGPD considèrent néanmoins l’IP comme une donnée personnelle dès lors qu’elle est croisée avec d’autres données permettant l’identification. Elle doit être traitée avec les mêmes précautions qu’un email ou un identifiant utilisateur.
Faut-il une API payante pour localiser une IP ?
Non pour la majorité des cas d’usage. Des APIs comme ipapi.co (1 000 requêtes/jour), ip-api.com (usage non commercial) ou ipinfo.io (50 000 requêtes/mois) proposent des plans gratuits largement suffisants pour un trafic modéré. Pour la production à fort volume, MaxMind GeoLite2 en base locale est une alternative sans quota et sans latence réseau.
Ce que la géolocalisation IP peut faire — et ce qu’on ne devrait pas lui demander
Les outils pour localiser une adresse IP en Python sont accessibles, bien documentés et souvent gratuits pour démarrer. Une dizaine de lignes de code suffisent pour un premier résultat. Ce qui fait la différence entre un script qui tombe en production et un système fiable, c’est la gestion des cas limites : IP privées passées par erreur, champs absents dans la réponse, quotas atteints, VPN qui fausse la localisation. Intégrer la contrainte RGPD dès la conception évite de devoir refactoriser sous pression. La géolocalisation IP est un outil de contexte pour construire de meilleures expériences — à condition de ne pas lui en demander plus qu’elle ne peut donner.



