Navigation web automatique avec Python

Dans cet article de la série d’articles consacrés à la cartographie de données linguistiques avec Python, la librairie selenium était exploitée pour réaliser des captures d’écran.

Ce n’est pas sa seule utilité : le webdriver de selenium permet de naviguer sur une page web de façon automatisée, et donc de mettre en place divers degrés d’interaction. Ceci peut être par exemple utile si, lors de la constitution d’un corpus web, vous voulez récupérer des contenus qui n’apparaissent qu’après un clic sur un élément de la page.

Voici deux exemples d’utilisation de selenium pour obtenir l’accès à des contenus qui nécessitent une interaction avec la page web.

Le script Python présenté dans cet article est mis à disposition sur Github et sur Gitlab. Il ne prend pas de fichier en entrée et ne produit pas de fichier en sortie, mais il est nécessaire d’avoir une connexion Internet pour qu’il fonctionne correctement.

Bien entendu, avant d’extraire des contenus web, il faut s’assurer d’en avoir le droit ! Pour l’exemple montré ici, pas de problème, je vous propose de partir de l’URL https://alxdrdelaporte.github.io/ : il s’agit de ma propre page Github, sur laquelle j’héberge des démonstrations et fichiers de sortie HTML.

Voici comment se présente la page d’accueil lorsqu’on accède à l’URL :

Page d'accueil de https://alxdrdelaporte.github.io/
Affichage par défaut de la page d’accueil (alxdrdelaporte.github.io).

Automatiser l’appui sur les touches du clavier

J’ai ajouté un script qui donne la possibilité de modifier l’affichage de cette page d’accueil, simplement en entrant une séquence de touches sur le clavier.

Connaissez-vous le Konami Code ? Déclencheur d’easter eggs dans un certain nombre de jeux vidéo Konami, cette séquence bien implantée dans la culture populaire se compose des touches suivantes, dans l’ordre : haut, haut, bas, bas, gauche, droite, gauche, droite, b, a.

Afficher la page d’accueil de alxdrdelaporte.github.io et taper le Konami Code au clavier modifie l’aspect graphique de la page, comme ceci :

Aspect sobre et élégant de la page d’accueil (alxdrdelaporte.github.io) après avoir entré le Konami Code.

Cette manipulation peut être effectuée manuellement, mais il est également possible de l’automatiser. Pour vérifier que la commande a fonctionné, une solution serait de prendre une capture d’écran, comme expliqué ici. Mais puisque nous sommes maintenant dans une perspective de constitution d’un hypothétique corpus textuel, nous allons plutôt chercher à récupérer le texte du message Félicitations, vous avez trouvé le Konami code qui apparaît en haut de la page lorsque le Konami Code est pris en compte.

Dans le code source, l’élément qui contient ce message porte un attribut id dont la valeur est konamicongrats1.

L'élément porte l'id "konamicongrats"
L’élément konamicongrats dans le code HTML.

Cet identifiant va permettre de récupérer précisément le contenu de cet élément.

En résumé, voici les étapes de navigation à automatiser :

  1. Accéder à l’URL.
  2. Entrer au clavier la séquence haut, haut, bas, bas, gauche, droite, gauche, droite, b, a.
  3. Repérer l’élément dont l’id est konamicongrats.
  4. Récupérer son texte.

Dans le script mis à disposition (sur Github et Gitlab), ce traitement est pris en charge par la fonction enter_konamicode().

Comme expliqué ici, la navigation automatique s’effectue en déclarant une instance de webdriver. Pour utiliser Firefox, il faut disposer de geckodriver en plus de selenium. Par exemple, avec un dossier ./webdrivers contenant geckodriver :

driver = webdriver.Firefox("./webdrivers/", options=options)

Cet objet, nommé driver2, peut maintenant recevoir des instructions pour la navigation. Pour entrer le Konami Code sur cette page, il faut lui “envoyer” une suite d’appuis sur des touches de clavier. C’est ce que va faire enter_konamicode(), qui prend en paramètre l’URL de la page de départ3.

Après avoir accédé à l’URL avec driver.get(url), il faut identifier l’élément de la page qui va recevoir les commandes. Dans le cas où on ne cherche pas à manipuler un élément en particulier, on peut cibler body.

body = driver.find_element_by_tag_name("body")

Les entrées clavier sont à envoyer avec send_keys(), qui prend en argument la ou les touches sur lesquelles “appuyer”. Pour entrer le Konami Code, qui se compose de 10 touches, il est plus pratique de passer par une liste. De plus, la classe Keys de webdriver permet d’indiquer les touches spéciales de façon lisible et intuitive4 :

konamicode = [Keys.ARROW_UP, Keys.ARROW_UP,
              Keys.ARROW_DOWN, Keys.ARROW_DOWN,
              Keys.ARROW_LEFT, Keys.ARROW_RIGHT,
              Keys.ARROW_LEFT, Keys.ARROW_RIGHT,
              "b", "a"]

Cette liste de commandes peut maintenant être envoyée à body :

body.send_keys(konamicode)

Il ne reste plus qu’à cibler le message déclenché par le Konami Code, c’est-à-dire l’élément dont l’id est konamicongrats, et récupérer son contenu textuel. C’est assez explicite donc je ne détaille pas davantage :

konamialert = driver.find_element_by_id("konamicongrats")
message = konamialert.text

La fonction complète ressemble à ceci :

def enter_konamicode(url):
    driver.get(url)
    body = driver.find_element_by_tag_name("body")
    konamicode = [Keys.ARROW_UP, Keys.ARROW_UP,
                  Keys.ARROW_DOWN, Keys.ARROW_DOWN,
                  Keys.ARROW_LEFT, Keys.ARROW_RIGHT,
                  Keys.ARROW_LEFT, Keys.ARROW_RIGHT,
                  "b", "a"]
    body.send_keys(konamicode)
    time.sleep(1)
    konamialert = driver.find_element_by_id("konamicongrats")
    message = konamialert.text
    return message

Si vous appelez cette fonction sur l’URL https://alxdrdelaporte.github.io/ et affichez le résultat dans la console5, vous obtiendrez bien le message Félicitations, vous avez trouvé le Konami Code.

La console Python affiche "Félicitations, vous avez trouvé le Konami Code".

Bien qu’il soit présent dans le HTML source, le contenu de l’élément konamicongrats n’apparaît sur la page qu’à condition que la séquence de touches ait été détectée6, ce qui confirme que la manipulation a fonctionné.

Cliquer sur un lien et changer de page

Cliquer sur un lien n’apportera pas de difficulté supplémentaire, puisqu’il existe une fonction click(). Le plus important est de trouver comment repérer dans le code source le lien auquel on souhaite accéder.

Par exemple, toujours sur cette page, il y a une série de liens représentés par des icônes.

Le premier lien, représenté par une icône WordPress, mène vers ce carnet (soit l’URL https://tekipaki.hypotheses.org/). Pour cliquer dessus et y accéder, il est par exemple possible d’exploiter le fait que les éléments a correspondant à ces liens portent tous la même classe (px-2.fa-lg.text-dark).

Les liens dans le HTML de la page

Dans le code source de la page, le lien vers Tekipaki est le premier élément porteur de cette classe. Il est alors possible de le récupérer comme suit :

link = driver.find_element_by_class_name("px-2.fa-lg.text-dark")

Cliquer sur le lien se fera alors avec link.click(). C’est ce qu’effectue la fonction go_to_tekipaki() dans le script mis à disposition (sur Github et Gitlab). Elle renvoie ensuite un message incluant le titre de la page, son URL et sa description : Bravo, vous êtes bien sur Tekipaki ! https://tekipaki.hypotheses.org/ Carnet d’Alexander Delaporte, ingénieur d’études au Centre de recherches linguistiques sur l’Asie Orientale.

Pour cliquer sur un autre élément porteur de la même classe, .find_elements_by_class_name() peut être utilisé. La sélection du lien sur lequel cliquer se fera alors avec un index, par exemple pour le lien vers Gitlab (troisième icône) :

links = driver.find_elements_by_class_name("px-2.fa-lg.text-dark")
link = links[2]
link.click()

Lorsqu’on met en place une navigation scriptée incluant des clics sur des liens hypertextes, l’attribut .current_url de webdriver (soit ici, driver.current_url) est très utile. Il renvoie l’URL courante et permet ainsi de vérifier si la navigation se passe comme prévu.

Citer ce billet : “Navigation web automatique avec Python”, par Alexander Delaporte. Publié sur Tekipaki le 08/04/2021. Lien : https://tekipaki.hypotheses.org/1475.
  1. Vous pouvez le voir directement en faisant un clic droit dessus puis Examiner l’élément dans votre navigateur. Le code HTML de la page d’accueil est aussi visible ici. []
  2. C’est le nom qui lui est donné dans la documentation (non-officielle), mais tout autre nom de variable autorisé est acceptable. []
  3. En l’occurrence, https://alxdrdelaporte.github.io/. []
  4. Pour y accéder, il faut l’importer en début de script avec from selenium.webdriver.common.keys import Keys. La liste des touches spéciales est disponible sur cette page. []
  5. print( enter_konamicode("https://alxdrdelaporte.github.io/") ) []
  6. D’ailleurs, si vous commentez la ligne body.send_keys(konamicode) dans le script avant d’appeler la fonction, elle renverra une chaîne de caractères vide. []

Auteur/autrice : Alexander Delaporte

Ingénieur d'études au Centre de recherches linguistiques sur l'Asie Orientale et chercheur associé BnF 2019-2021

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.