Interrogation de data.gouv.fr via son API

16/11/2016

Petite expérimentation des possbilités offertes par l'API de la plateforme Open Data, data.gouv.fr.

Souscription dataset FinessDans le billet Analyse des données Finess publiées en Open Data, j’indiquais que le service de notification des mises à jour n’avait jamais fonctionné (pour moi en tout cas). Je suis pourtant identifié comme “suiveur”, mais le résultat est qu’aucun mail ne m’est jamais parvenu pour m’annoncer la mise à disposition d’une nouvelle version des données publiées.

Cependant, le site data.gouv.fr met à disposition une API pour accéder aux jeux de données (datasets). Les “datasets” sont donc utilisables de façon programmable ! Merci à l’équipe Etalab pour cette mise en place qui ouvre des nombreuses possibilités.

Pour développer un service de téléchargement automatique si une version nouvelle est disponible (en accompagnant ce téléchargement d'une notification par exemple), façon DIY, un simple script shell, avec un peu de curl ou de HTTPie pour faire les requêtes HTTP et l'utilitaire jq pour analyser le JSON, est simple à mettre en oeuvre.

Sur le site data.gouv.fr, à la page du jeu de données, en affichant les détails, l'ID du jeu de données devient accessible : 53699569a3a729239d2046eb ID dataset Finess

Analyse du fichier JSON de l'API

En suivant la documentation de l’API, la requête

# http https://www.data.gouv.fr/api/1/datasets/53699569a3a729239d2046eb/

permet d’obtenir les données JSON du jeu de valeurs JSON.

Pour extraire les URL de ce jeu de données

# URL=https://www.data.gouv.fr/api/1/datasets/53699569a3a729239d2046eb/
# http $URL | jq '.resources[].url'

On obtient

"https://www.data.gouv.fr/s/resources/extraction-du-fichier-national-des-etablissements-sanitaires-et-sociaux-finess-par-etablissements/20151222-100753/etalab_cs1100502.pdf"
"https://www.data.gouv.fr/s/resources/extraction-du-fichier-national-des-etablissements-sanitaires-et-sociaux-finess-par-etablissements/20160404-105326/etalab_cs1100507.pdf"
"https://www.data.gouv.fr/s/resources/extraction-du-fichier-national-des-etablissements-sanitaires-et-sociaux-finess-par-etablissements/20160920-110218/etalab_cs1100502_stock_20160920-0445.csv"
"https://www.data.gouv.fr/s/resources/extraction-du-fichier-national-des-etablissements-sanitaires-et-sociaux-finess-par-etablissements/20160920-110448/etalab_cs1100507_stock_20160920-0440.csv"
"https://www.data.gouv.fr/s/resources/extraction-du-fichier-national-des-etablissements-sanitaires-et-sociaux-finess-par-etablissements/20160323-130907/etalab_stock_et_historique_2004-2015.zip"

Pour connaître les dates de mise à jour, il suffit de filtrer les données des blocs resources et de ne garder que les ID et les dates de dernière modification :

# http $URL | jq '.resources[] | .id + " : " + .last_modified'

Programme de téléchargement

Il est alors possible de faire un programme shell, permettant de comparer la date de dernière mise à jour des données publiées sur le site data.gouv.fr avec une date donnée en paramètre (par exemple la date de la veille).

Ainsi en lançant le programme suivant

# sh down_finess.sh `date -v-1d +"%Y-%m-%d"`

Le programme shell enchaîne :

Exemples

Positionnement d'une date de référence antérieure à celle du fichier de données :

# sh down_finess.sh 2016-09-10
Fichier     : etalab_cs1100507_stock_20160920-0440.csv
Date de MAJ : 2016-09-20T11:04:57
Date de REF : 2016-09-10
Telechargement du fichier de donnees  etalab_cs1100507_stock_20160920-0440.csv  dans  /tmp/finess
Donnees controlees, checksum OK

Positionnement d'une date de référence postérieure à celle du fichier de données :

# sh down_finess.sh `date -v-1d +"%Y-%m-%d"`
Fichier     : etalab_cs1100507_stock_20160920-0440.csv
Date de MAJ : 2016-09-20T11:04:57
Date de REF : 2016-11-15
Fichier distant plus ancien =  2016-09-20T11:04:57

Code

Le code du programme shell est disponible en libre accès sur github, dans le repo opendata-finess.