Cartographier des données linguistiques avec Python – 4

Les cartes produites avec folium sont des cartes interactives au format HTML. Changer l’extension au moment de l’enregistrement du fichier ne permet pas d’obtenir un fichier image, par exemple : un fichier sera bien créé, mais il ne pourra pas être lu.

Pour avoir un aperçu de la carte dans un format image de type PNG, il existe toujours la solution de réaliser manuellement une capture d’écran. Cette manipulation peut représenter une perte de temps (et d’énergie) certaine, en particulier si on veut générer des aperçus pour documenter les différentes étapes de création d’une carte.

Il peut alors être plus pratique d’automatiser la prise de capture d’écran, en l’intégrant au code Python.

Prérequis

Pour utiliser le code présenté dans cet article, il vous faudra une carte enregistrée au format HTML. Je n’expliquerai pas ici comment faire, vous trouverez toutes les informations nécessaires dans les articles précédents :

Des cartes sont également téléchargeables dans le répertoire Gitlab cartographie_linguistique_python. Par ailleurs, comme pour les autres articles consacrés à la cartographie, le code sera disponible sous forme de notebook Jupyter.

Attention : Pour pouvoir utiliser webdriver, en plus d’installer et importer la bibliothèque selenium1, il est nécessaire d’installer le driver correspondant au navigateur déclaré. Ici ce sera Firefox, vous aurez donc besoin de geckodriver.

En plus de webdriver, il faudra importer les modules os et time (librairie standard).

Construction du code Python

Le code utilisé pour cet article est librement téléchargeable sur Gitlab sous forme de notebook Jupyter. Son fichier d’entrée au format HTML et son fichier de sortie au format PNG sont également disponibles.

Le point de départ est une carte enregistrée dans un fichier HTML2, et le but sera d’obtenir une image de ce type, enregistrée au format PNG :

Il s’agit d’une image d’aperçu, statique. Les éléments interactifs de la version HTML (liens, tooltips, popups, etc.) ne seront pas conservés.

Fichier d’entrée

Le fichier d’entrée est une carte des langues japoniques, semblable à celle présentée dans cet article. Elle a été créée à partir des mêmes données, issues de Glottolog3 et regroupées dans le fichier japo1237.tsv (téléchargement).

Capture d’écran

Les étapes à suivre pour prendre la capture sont les suivantes :

  1. Déclaration d’un navigateur (webdriver).
  2. Accès à la page.
  3. Attente du chargement des contenus de la page.
  4. Enregistrement d’une capture d’écran dans un fichier image.

Le principe de fonctionnement du webdriver de selenium (documentation non-officielle) est de simuler un navigateur web, qui permettra alors de naviguer de façon scriptée, via le code Python. J’ai choisi ici le navigateur Firefox, il faut alors instancier un objet webdriver.Firefox(), ici associé à la variable browser.

Le navigateur est maintenant prêt4, et peut accéder à une URL avec la fonction get(). L’URL à ouvrir dans le cas présent ne correspond pas à une page web mais à un fichier enregistré localement, ce qui fera office d’URL sera donc quelque chose de type :

file://chemin_du_repertoire_contenant_le_fichier/nom_du_fichier.html

En d’autres termes, le chemin d’accès absolu du fichier, précédé de file://. Si, comme dans le notebook, votre carte est enregistrée dans le même répertoire que le code (script ou notebook), vous pouvez récupérer le chemin d’accès du répertoire courant avec os.getcwd()5. Avec le navigateur nommé browser, et l’URL à atteindre url_fichier, l’accès se fait donc comme suit :

browser.get(url_fichier)

Il n’est pas visible, mais puisque le navigateur accède maintenant au fichier, il ne reste plus qu’à capturer l’image ! Ce n’est pas tout à fait vrai. La prise de la capture se fait avec la fonction browser.save_screenshot(), qui prend en paramètre le chemin d’accès du fichier de sortie. Le navigateur est certes en train d’accéder au fichier d’entrée, mais si save_screenshot() était appelée immédiatement, voici ce que contiendrait le fichier PNG :

On y entrevoit la carte, mais il est évident que l’affichage est incomplet. C’est parce que le fichier HTML n’a pas eu le temps de charger avant la capture. Il faut donc marquer une petite pause dans l’exécution du script, ce que permet de faire la fonction time.sleep(). Dans l’exemple, j’ai donné un délai de 3 secondes, ce qui est plus que suffisant. J’avais associé le chemin du fichier de sortie à la variable mon_image, il est maintenant possible d’enregistrer l’image dans la carte dans un fichier PNG, comme ceci :

browser.save_screenshot(mon_image)

Le navigateur (browser) n’est plus utile, il peut être refermé avec browser.quit().

Si vous avez téléchargé le notebook et exécuté son code sans le modifier, vous avez normalement obtenu un fichier apercu_carte_japonic.png, contenant cette image.

Adapter le script à un projet

Si votre projet implique de produire régulièrement des aperçus en utilisant la méthode de capture décrite ici, il est bien sûr pertinent d’écrire une fonction. Je propose celle-ci dans le notebook :

def capture_carte(url_carte, image, delai):
    browser = webdriver.Firefox()
    browser.get(url_carte)
    time.sleep(delai)
    browser.save_screenshot(image)
    browser.quit()

Elle peut être appelée avec les variables définies précédemment :

capture_carte(url_fichier, mon_image, delai)

Il est à noter que si cet article présente l’enregistrement de l’image d’une carte parce qu’il se situe dans la continuité des autres articles consacrés à la cartographie de données linguistiques, le principe peut s’appliquer à d’autres contenus.

On peut par exemple capturer l’image d’une carte en ligne :

carte_en_ligne = 'https://alxdrdelaporte.github.io/works/carte_hmongmien_polygone.html'
capture_carte(carte_en_ligne, 'apercu_carte_hmongmien_polygone.png', delai)

Ou de n’importe quelle page web accessible :

capture_carte('https://gitlab.com/tekipaki-blog/cartographie_linguistique_python', 'apercu_gitlab.png', delai)
Carte en ligne (voir en ligne)
Page web (répertoire Gitlab)
Citer ce billet : “Cartographier des données linguistiques avec Python – 4”, par Alexander Delaporte. Publié sur Tekipaki le 26/02/2021. Lien : https://tekipaki.hypotheses.org/1418.
  1. Ici importer seulement webdriver est suffisant : from selenium import webdriver. []
  2. nom_de_la_carte.save('chemin_du_fichier.html') []
  3. Glottolog 4.3 par Hammarström, Harald & Forkel, Robert & Haspelmath, Martin & Bank, Sebastian sous licence Creative Commons Attribution 4.0 International License []
  4. À condition que les installations nécessaires aient été effectuées (voir documentation). []
  5. Pour Current Working Directory. []

Auteur/autrice : Alexander Delaporte

Ingénieur d'études au Centre de recherches linguistiques sur l'Asie Orientale

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.