Localiser une adresse IP en Python : base locale, API, RDAP et DNS inverse

14 octobre 2026 · Par Lucas
Code Python pour localiser une adresse IP

Pour localiser une adresse IP en Python, le plus fiable est d’interroger une base de géolocalisation locale (au format MMDB) avec la bibliothèque geoip2 : pas de quota, pas d’appel réseau, une réponse en quelques microsecondes. Une API comme ip-api.com dépanne pour quelques requêtes, le RDAP donne le propriétaire du réseau, et le DNS inverse complète le portrait. Aucune de ces méthodes ne donne une adresse postale.

Les exemples ci-dessous ont tous tourné le 2 octobre 2026 sous Python 3, sur l’adresse 109.234.165.129, qui est celle d’un serveur de l’hébergeur o2switch. Chaque résultat affiché date de ce jour-là.

Avant tout : écarter les adresses privées

Une adresse comme 192.168.1.15 ou 10.0.0.2 n’existe que dans un réseau local : aucune base ne peut la situer. Le module standard ipaddress le détecte, sans rien installer.

import ipaddress

ipaddress.ip_address("192.168.1.15").is_private     # True
ipaddress.ip_address("109.234.165.129").is_private  # False

Si vous cherchez l’adresse publique et l’adresse locale de votre propre machine, consultez notre article récupérer l’adresse IP publique et privée en Python.

Méthode 1 : une base locale avec geoip2

La bibliothèque geoip2 de MaxMind sait lire les fichiers au format MMDB. On trouve deux bases gratuites. GeoLite2 de MaxMind exige un compte gratuit et une clé de licence pour être téléchargée, alors qu’IP to City Lite de DB-IP se télécharge sans compte ; elle est mise à jour chaque mois et publiée sous licence Creative Commons Attribution 4.0. Le fichier ville de DB-IP fait environ 60 Mo compressé, 127 Mo une fois décompressé.

pip install geoip2

import geoip2.database

with geoip2.database.Reader("dbip-city-lite-2026-10.mmdb") as base:
    r = base.city("109.234.165.129")
    print(r.country.iso_code, r.country.names["fr"], r.city.name)
    print(r.location.latitude, r.location.longitude)

Résultat obtenu : FR France Clermont-Ferrand, puis 45.758 3.127. La ville correspond au siège de l’hébergeur, pas forcément à la salle où tourne la machine.

A lire également :  Comment changer l’adresse du serveur DNS sur Windows et Mac ?

Dès que vous traitez des journaux de connexion ou plus de quelques dizaines d’adresses, privilégiez cette méthode : tout se passe en local, sans quota, et aucune donnée ne quitte votre machine. Il suffit de penser à remplacer le fichier chaque mois. Côté licence, DB-IP impose de citer la source, avec un lien vers db-ip.com quand les résultats s’affichent sur un site web.

Méthode 2 : une API de géolocalisation

Dans un script ponctuel, passer par une API évite de télécharger une base. ip-api.com répond en JSON, sans inscription, et accepte une langue de réponse.

pip install requests

import requests

ip = "109.234.165.129"
r = requests.get(f"http://ip-api.com/json/{ip}",
                 params={"lang": "fr", "fields": "status,country,city,isp,as"},
                 timeout=10)
print(r.json())

Résultat obtenu : {'status': 'success', 'country': 'France', 'city': 'Clermont-Ferrand', 'isp': 'O2switch Sarl', 'as': 'AS50474 O2SWITCH SAS'}.

Il y a deux contraintes. D’abord, la version gratuite se limite à un usage non commercial et à 45 requêtes par minute : passé ce seuil, l’accès est bloqué un temps, puis l’adresse appelante risque d’être bannie. Ensuite, elle ne marche qu’en HTTP, car le HTTPS est réservé à l’offre payante. Une application en production sera plus sûre avec une base locale ou une offre payante.

Le test montre aussi que les fournisseurs ne s’accordent pas. Le même jour, pour une adresse identique, ipinfo.io répondait Paris, tandis qu’ip-api et DB-IP donnaient Clermont-Ferrand. Une géolocalisation IP reste une estimation, et non une mesure.

Méthode 3 : le propriétaire du réseau avec le RDAP

Le RDAP, successeur du Whois, interroge le registre régional (le RIPE NCC pour l’Europe) qui a attribué le bloc d’adresses. Il ne donne pas une ville, mais il dit à qui appartient l’adresse, ce qui est souvent la vraie question. La bibliothèque ipwhois trouve seule le bon registre.

pip install ipwhois

from ipwhois import IPWhois

res = IPWhois("109.234.165.129").lookup_rdap(depth=1)
print(res["asn"], res["asn_description"])
print(res["network"]["name"], res["network"]["cidr"], res["asn_country_code"])

Voici la sortie : 50474 O2SWITCH - O2SWITCH SAS, FR, puis O2SWITCH 109.234.164.0/22 FR. L’adresse appartient donc à un bloc de 1 024 adresses attribué à o2switch et rattaché au système autonome AS50474.

A lire également :  192.168 1.39 Adresse IP

Méthode 4 : le DNS inverse

L’enregistrement PTR d’une adresse se lit avec le module standard socket. Souvent, hébergeurs et fournisseurs d’accès y placent leur nom, et parfois une ville ou un type de connexion.

import socket

print(socket.gethostbyaddr("109.234.165.129")[0])

Sortie du script : 109-234-165-129.reverse.odns.fr. Certaines adresses n’ont pas de PTR, prévoyez donc l’exception socket.herror.

Les quatre méthodes comparées

Méthode Bibliothèque Ce qu’on obtient Limites
Base locale MMDB geoip2 Pays, ville, coordonnées approximatives Fichier à mettre à jour chaque mois ; attribution DB-IP
API ip-api.com requests Pays, ville, fournisseur, AS 45 requêtes par minute, usage non commercial, HTTP seulement
RDAP ipwhois Titulaire du bloc, AS, pays d’enregistrement Pas de ville ; un appel réseau par adresse
DNS inverse socket (standard) Nom d’hôte du PTR Souvent absent ; indice, pas preuve

Un script complet, prêt à l’emploi

Ce script réunit les méthodes 1, 3 et 4, en écartant proprement les adresses privées. Il prend un fichier contenant une adresse par ligne et produit un CSV.

import csv, ipaddress, socket, sys
import geoip2.database
from ipwhois import IPWhois

BASE = "dbip-city-lite-2026-10.mmdb"

def localiser(ip, base):
    ligne = {"ip": ip, "pays": "", "ville": "", "reseau": "", "as": "", "ptr": ""}
    if ipaddress.ip_address(ip).is_private:
        ligne["pays"] = "adresse privée"
        return ligne
    r = base.city(ip)
    ligne["pays"], ligne["ville"] = r.country.iso_code or "", r.city.name or ""
    try:
        w = IPWhois(ip).lookup_rdap(depth=0)
        ligne["reseau"], ligne["as"] = w["network"]["name"], w["asn"]
    except Exception:
        pass
    try:
        ligne["ptr"] = socket.gethostbyaddr(ip)[0]
    except (socket.herror, socket.gaierror):
        pass
    return ligne

with geoip2.database.Reader(BASE) as base, open(sys.argv[1]) as f:
    sortie = csv.DictWriter(sys.stdout, fieldnames=["ip", "pays", "ville", "reseau", "as", "ptr"])
    sortie.writeheader()
    for ip in (l.strip() for l in f if l.strip()):
        sortie.writerow(localiser(ip, base))

Utilisation : python3 localiser.py adresses.txt > resultats.csv. Pour un gros volume, réservez le RDAP aux adresses qui vous intéressent vraiment, car chaque appel sollicite un registre public qui limite lui aussi les requêtes.

A lire également :  Les risques de sécurité liés à une IP publique exposée

Ce que la géolocalisation IP ne dit pas

C’est à un réseau qu’une adresse IP se rattache, non à une personne. La ville renvoyée correspond à l’endroit où le fournisseur déclare utiliser le bloc : souvent un nœud de raccordement, ou le siège de l’hébergeur. Derrière un VPN, un relais privé ou un réseau mobile, elle peut se tromper de plusieurs centaines de kilomètres. Notre guide sur la précision de la géolocalisation IP détaille ces limites, et la fiche géolocalisation IP du glossaire en donne la définition.

Questions fréquentes

Quelle bibliothèque Python pour la géolocalisation IP ?

geoip2, qui lit une base MMDB en local (GeoLite2 de MaxMind ou IP to City Lite de DB-IP). Côté propriétaire du réseau, ipwhois et sa requête RDAP.

Peut-on localiser une adresse IP sans API ?

Oui. Avec une base téléchargée et la bibliothèque geoip2, tout fonctionne hors ligne ; seul le fichier est à remplacer chaque mois.

La géolocalisation d’une IP donne-t-elle l’adresse d’une personne ?

Non. Au mieux, elle indique la ville où le fournisseur utilise le bloc d’adresses, et seul le fournisseur d’accès sait à quel abonné une adresse revenait à un instant donné.

Pourquoi deux services donnent-ils deux villes différentes ?

Les fournisseurs bâtissent chacun leur base sur des sources différentes, qu’il s’agisse de déclarations des opérateurs, de mesures de latence ou de données de partenaires. Pendant notre test, deux services plaçaient la même adresse à Clermont-Ferrand, un troisième à Paris.

Sources

  • Tests réalisés le 2 octobre 2026 avec Python 3, geoip2 4.8.1, ipwhois 1.3.0 et requests 2.32.4.
  • DB-IP : page consacrée à la base IP to City Lite (licence CC BY 4.0, mise à jour chaque mois, formats CSV et MMDB).
  • ip-api.com : conditions d’utilisation (usage non commercial, 45 requêtes par minute, SSL limité à l’offre pro).
  • RIPE NCC : réponse RDAP pour 109.234.164.0/22.

Audit gratuit

Un doute sur votre infrastructure ?

Des ingénieurs analysent gratuitement votre configuration réseau (DNS, exposition, sécurité) et vous renvoient un diagnostic actionnable sous 48 h.

Sans engagement. Pas de newsletter, pas de revente d’adresse. Destinataire : voir la politique de confidentialité.

Cette page vous a-t-elle aidé ? Soyez le premier à voter

Newsletter

Recevez nos guides IP & réseau

Nouveaux outils, définitions et astuces sécurité, directement par email. Pas de spam, désinscription en un clic.

Laisser un commentaire

Newsletter

Recevez nos guides IP & réseau

Nouveaux outils, définitions et astuces sécurité, directement par email. Pas de spam, désinscription en un clic.