OpenData: importer les noms de domaines de l'AFNIC
Dans le cadre de l’initiative Open Data .fr, l’AFNIC met à disposition des fichiers de données actualisés régulièrement sur tous les noms de domaines qu’elle gère, ce qui permet à quiconque de produire notamment des statistiques.
Voyons comment importer ces données dans une base PostgreSQL.
Les fichiers sont au format ZIP contenant chacun un seul fichier CSV.
Les colonnes sont documentées dans le guide d’utilisation (PDF).
Le fichier principal “Fichier A” contient une ligne par domaine, soit à mars 2017 un peu plus de 4,5 millions de lignes:
$ wc -l 201703_OPENDATA_A-NomsDeDomaineEnPointFr.csv
4539091 201703_OPENDATA_A-NomsDeDomaineEnPointFr.csv
Comme souvent dans les fichiers CSV, les noms de colonnes figurent à la première ligne. Il s’agit de:
"Nom de domaine";"Pays BE";"Departement BE";"Ville BE";"Nom BE";"Sous domaine";"
Type du titulaire";"Pays titulaire";"Departement titulaire";"Domaine IDN";"Date
de création";"Date de retrait du WHOIS"
Les caractères sont au format iso-8859-1
, et il y a un certain nombres d’accents dans le fichier, il faut donc en tenir compte pour l’import.
J’ai choisi de créer une seule table avec ces noms simplifiés:
Les contenus peuvent être importés sans préfiltrage dans cette structure avec le COPY
de PostgreSQL. L’import passe sans erreur en une quinzaine de secondes sur un serveur basique. Les commandes:
SET datestyle TO european;
SET client_encoding TO 'LATIN1';
\copy domain_fr from '201703_OPENDATA_A-NomsDeDomaineEnPointFr.csv' with (format csv, header, delimiter ';')
RESET client_encoding;
Faisons quelques requêtes au hasard pour tester les données.
Le champ idn
est à 0 ou 1 suivant qu’il s’agit d’un nom de domaine internationalisé, c’est-à-dire qui peut contenir des
caractères Unicode au-delà du bloc “Basic Latin”. Pour voir combien sont concernés:
SELECT idn,count(*) from domain_fr GROUP BY idn;
idn | count
-----+---------
0 | 4499573
1 | 39517
(2 rows)
Pour voir la progression de ce type de domaine par année de création (et constater d’ailleurs qu’en nombre d’ouvertures c’est plutôt en régression après l’année de démarrage):
annee | count
------------+-------
2012-01-01 | 20001
2013-01-01 | 6900
2014-01-01 | 4734
2015-01-01 | 3754
2016-01-01 | 3353
2017-01-01 | 775
(6 rows)
On peut aussi apprendre par exemple, quels sont les bureaux d’enregistrement (prestataires) les plus actifs. Regardons le top 10 pour 2016:
nom_be | count
-------------------------------------------------------------------------+--------
OVH | 207393
1&1 Internet SE | 74446
GANDI | 63861
ONLINE SAS | 15397
LIGNE WEB SERVICES - LWS | 14138
AMEN / Agence des Médias Numériques | 13907
KEY-SYSTEMS GmbH | 12558
PAGESJAUNES | 11500
Ascio Technologies Inc. Danmark - filial af Ascio Technologies Inc. USA | 9303
InterNetX GmbH | 9028
Sans surprise on retrouve les hébergeurs français populaires, avec OVH loin devant, mais aussi 1&1 (allemand) en deuxième.
L’Open Data ouvre la possibilité de croiser des données de sources diverses. Par exemple on pourrait être intéressé par les relations entre les villes françaises et ces noms de domaines.
Un fichier CSV des communes de France peut-être récupéré via l’OpenData gouvernemental. Celui-là est en UTF-8.
Ici on va importer seulement le nom et département des communes. Puis on va utiliser le module PostgreSQL pg_trgm (trigrammes) pour son opérateur de comparaison approchée de chaînes de caractères.
On va chercher à titre d’exemple les domaines contenant le terme metz
et qui
ont une correspondance lexicale avec une ville du département 57 (Moselle).
Le degré de similarité de l’opérateur %
peut être réglé via le paramètre
de configuration pg_trgm.similarity_threshold
(ou à l’ancienne via la fonction
set_limit()
).
Par défaut c’est 0,3. Plus la valeur est proche de 1, plus
les résultats sont resserrés autour de la correspondance exacte.
Ca donne 33 résultats:
domaine | nom_commune
-------------------------------+---------------------
agmetzervisse.fr | Metzervisse
aikido-longeville-les-metz.fr | Longeville-lès-Metz
a-metz.fr | Metz
a-metz.fr | Metz
a-metz.fr | Metz
aquabike-metzervisse.fr | Metzervisse
aumetz.fr | Aumetz
canton-metzervisse.fr | Metzervisse
i-metz.fr | Metz
i-metz.fr | Metz
i-metz.fr | Metz
institut-metzervisse.fr | Metzervisse
judo-metzervisse.fr | Metzervisse
lorry-les-metz.fr | Lorry-lès-Metz
lorry-metz-57.fr | Lorry-lès-Metz
mairie-longeville-les-metz.fr | Longeville-lès-Metz
mairie-longeville-les-metz.fr | Longeville-lès-Metz
metzervisse.fr | Metzervisse
metzervisse1972.fr | Metzervisse
metz.fr | Metz
metz.fr | Metz
metz.fr | Metz
metzinger.fr | Metzing
metzmetz.fr | Metz
metzmetz.fr | Metz
metzmetz.fr | Metz
mjc-metzeresche.fr | Metzeresche
mma-longeville-les-metz.fr | Longeville-lès-Metz
mma-montigny-les-metz.fr | Montigny-lès-Metz
montigny-les-metz.fr | Montigny-lès-Metz
moulins-les-metz.fr | Moulins-lès-Metz
pompiers-metzervisse.fr | Metzervisse
rx-montigny-les-metz.fr | Montigny-lès-Metz
On voit clairement l’effet de la correspondance approchée avec “lorry-metz-57.fr” qui se trouve apparié avec “Lorry-lès-Metz”.
Un certain nombre de domaines (4684 exactement) commençent par la chaîne “mairie-“.
On peut à nouveau utiliser l’opérateur de proximité des chaînes de caractères pour chercher, sur un département particulier, quelles communes ont choisi le nommage du type mairie-nom-de-la-commune:
Résultats:
domaine | nom_commune
----------------------------------+-----------------------
mairie-beaulieu-sur-mer.fr | Beaulieu-sur-Mer
mairie-la-turbie.fr | La Turbie
mairie-le-cannet.fr | Le Cannet
mairie-mandelieu-la-napoule.fr | Mandelieu-la-Napoule
mairie-roquefort-les-pins.fr | Roquefort-les-Pins
mairie-roquefort-les-pins.fr | Roquefort-les-Pins
mairie-roquesteron.fr | Roquesteron
mairie-saint-jean-cap-ferrat.fr | Saint-Jean-Cap-Ferrat
mairie-saint-martin-du-mont.fr | Saint-Martin-du-Var
mairie-saint-paul.fr | Saint-Paul
mairie-villefranche-sur-mer.fr | Villefranche-sur-Mer
mairie-villefranche-sur-saone.fr | Villefranche-sur-Mer
mairie-villeneuve-loubet.fr | Villeneuve-Loubet
(13 rows)
A vous de jouer pour d’autres requêtes!