Présentation de Selenium
Comme l'indique le site officiel de Selenium, Selenium est une suite d'outils destinés à l'automatisation des navigateurs web, initialement conçue pour les tests multi-navigateurs.
L'API développée par l'équipe Selenium utilise le protocole WebDriver pour prendre le contrôle d'un navigateur web, comme Chrome ou Firefox, et effectuer différentes tâches, telles que :
- Remplir des formulaires
- Faire défiler la page
- Prendre des captures d'écran
- Cliquer sur des boutons
Vous vous demandez peut-être comment tout cela se traduit en matière de web scraping. C'est très simple, en réalité.
L'extraction de données peut parfois être un véritable casse-tête. De nos jours, les sites web sont souvent conçus comme des applications monopages, même lorsque cela n'est pas nécessaire. Ils affichent des CAPTCHA plus souvent que nécessaire et vont même jusqu'à bloquer les adresses IP des utilisateurs lambda.
En bref, la détection des bots est une fonctionnalité très frustrante qui ressemble à un bug.
Selenium peut vous aider dans ces cas-là en comprenant et en exécutant du code JavaScript, et en automatisant de nombreux processus fastidieux du web scraping, comme le défilement de la page, la capture d'éléments HTML ou l'exportation des données récupérées.
Installation
Pour montrer la véritable puissance de Selenium et de Python, nous allons extraire des informations du subreddit /r/learnprogramming. Outre l'extraction de données, je vais également vous montrer comment implémenter la connexion. Maintenant que nous avons une bonne compréhension de l'outil principal et du site web que nous allons utiliser, voyons quels autres prérequis nous devons installer :
1. Python. Nous utiliserons Python 3.0. Cependant, n'hésitez pas à utiliser Python 2.0 en effectuant quelques ajustements mineurs. Vous pouvez le télécharger et l'installer à partir d'ici.
2. Le package Selenium. Vous pouvez installer le package Selenium à l'aide de la commande suivante :
pip3 install selenium
3. Le package Pandas. Il servira à extraire et à stocker les données récupérées dans un fichier .csv. Veuillez exécuter la commande suivante pour l'installer sur votre appareil.
pip3 install pandas
4. Le package BeautifulSoup. Utilisé pour analyser les documents HTML et XML. Il suffit d'exécuter cette ligne :
pip3 install beautifulsoup
5. Google Chrome. Consultez ce lien pour en savoir plus sur la manière de le télécharger et de l'installer.
6. Chrome Driver. Il nous aidera à configurer le pilote Web pour Selenium. Veuillez suivre ce lien pour télécharger et installer la dernière version de Chrome Driver. N'oubliez pas de noter le chemin d'accès où vous l'avez installé.
Lancement du navigateur
C'est parti. Créez un nouveau fichier scraper.py et importez le package Selenium en copiant la ligne suivante :
from selenium import webdriver
Nous allons maintenant créer une nouvelle instance de Google Chrome en écrivant :
driver = webdriver.Chrome(LOCATION)
Remplacez LOCATION par le chemin d'accès où se trouve le pilote Chrome sur votre ordinateur. Veuillez consulter la documentation Selenium pour trouver le chemin d'accès le plus précis pour le pilote Web, en fonction du système d'exploitation que vous utilisez.
La dernière étape consiste à accéder au site web dont nous souhaitons extraire les données. Dans notre cas, il s'agit de https://www.reddit.com/r/learnprogramming/top/?t=month. Copiez la ligne suivante dans le fichier Python nouvellement créé :
driver.get("https://www.reddit.com/r/learnprogramming/top/?t=month")
En exécutant la commande suivante dans une fenêtre de terminal :
python3 scraper.py
Une nouvelle instance de Google Chrome devrait maintenant s'ouvrir, avec la mention « Chrome est contrôlé par un logiciel de test automatisé » en haut de la page.
Recherche de données spécifiques
Comme vous l’avez sans doute déjà deviné, nous allons extraire les données du subreddit /r/learnprogramming dans ce tutoriel. Nous allons enregistrer le titre des publications, leur auteur et le nombre de votes positifs, puis les stocker dans un nouveau fichier .csv. Voyons où ils se trouvent sur la page HTML et comment nous pouvons les extraire.
Une fois que Google Chrome a enfin chargé la page, faisons un clic droit sur n’importe quel message et sélectionnons « Inspecter ». Nous pouvons trouver le conteneur HTML du message sous le nom de classe _1oQyIsiPHYt6nx7VOmd1sz.
Vous pouvez également exécuter Google Chrome sans interface utilisateur graphique et enregistrer le contenu HTML de la page en ajoutant quelques lignes de code. Nous allons définir l'option headless sur true pour le pilote Chrome (afin de supprimer l'interface graphique) et une taille de fenêtre de 1080 pixels (pour obtenir le code HTML correct pour notre cas d'utilisation).
Les deux dernières lignes de code ferment Chrome immédiatement après avoir terminé l'enregistrement du code HTML de la page.
Le nouveau fichier scraper.py ressemblera à ceci :
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options()
options.headless = True
options.add_argument("--window-size=1920,1080")
driver = webdriver.Chrome("./chromedriver")
driver.get("https://www.reddit.com/r/learnprogramming/top/?t=month")
print(driver.page_source)
driver.quit()WebElement
Un WebElement est un objet Selenium qui représente un élément HTML. Comme vous le verrez dans le tutoriel suivant, nous pouvons effectuer de nombreuses actions sur ces éléments. En voici quelques-unes :
- Cliquer dessus à l'aide de la méthode .click()
- Saisir du texte dans un élément de saisie spécifique en appelant la méthode .send_keys()
- Lire le texte d'un élément à l'aide de element.text
- Vérifier si un élément est affiché sur la page en appelant .is_displayed() sur celui-ci
Un exemple de Selenium en action
Maintenant que notre projet est configuré, nous pouvons enfin passer au scraping.
Connexion
Nous allons démontrer la puissance de Selenium en nous connectant à notre compte Reddit et en récupérant les données présentées précédemment. Commençons par demander à Selenium de cliquer sur le bouton de connexion en haut de la page. Après avoir inspecté le code HTML de la page, nous pouvons voir que le nom de classe du bouton de connexion est _2tU8R9NTqhvBrhoNAXWWcP.
login_button = driver.find_element_by_class_name('_2tU8R9NTqhvBrhoNAXWWcP')
login_button.click()
Cela ouvrira la fenêtre modale de connexion où nous pouvons voir les champs de saisie de l'identifiant et du mot de passe que nous devons remplir. Continuons avec les lignes suivantes :
driver.switch_to_frame(driver.find_element_by_class_name('_25r3t_lrPF3M6zD2YkWvZU'))
driver.find_element_by_id("loginUsername").send_keys('USERNAME')
driver.find_element_by_id("loginPassword").send_keys('PASSWORD')
driver.find_element_by_xpath("//button[@type='submit']").click()
Si nous inspectons l'élément modal, nous pouvons voir que son conteneur est une iframe. C'est pourquoi nous devons passer en mode « frame » dans la première partie du code, car sélectionner les champs de saisie sans cela entraînerait une erreur.
Ensuite, nous récupérons les champs de saisie et leur fournissons les identifiants appropriés avant de cliquer sur le bouton de soumission. Cela nous ramènera à la page /r/learnprogramming, mais nous serons désormais connectés et prêts à voter !
Prendre une capture d'écran
Prendre une capture d'écran avec Selenium et Python est assez simple. Il suffit d'écrire la commande suivante dans le fichier scraper.py après avoir déclaré le pilote Web.
driver.save_screenshot('screenshot.png')
Il est utile de savoir que vous pouvez définir la taille de la fenêtre Google Chrome en ajoutant les lignes de code suivantes :
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_argument("--window-size=1920,1080")
Voici à quoi ressemblera la capture d'écran dans notre cas :

Extraire des données
Comme nous l'avons déjà mentionné, nous devons récupérer le titre des publications, leur auteur et le nombre de votes positifs. Commençons par importer les paquets BeautifulSoup et Pandas, puis créons trois tableaux vides pour chaque type d'information dont nous avons besoin.
from bs4 import BeautifulSoup
import pandas as pd
titles = []
upvotes=[]
authors = []
Nous allons utiliser BeautifulSoup pour analyser le document HTML en écrivant les lignes suivantes :
content = driver.page_source
soup = BeautifulSoup(content, features="html.parser")
Après avoir inspecté le document HTML et choisi les bons sélecteurs, nous allons maintenant récupérer les titres, les votes positifs et les auteurs, puis les attribuer au tableau correspondant :
for element in soup.findAll('div', attrs={'class': '_1oQyIsiPHYt6nx7VOmd1sz'}):
title = element.find('h3', attrs={'class': '_eYtD2XCVieq6emjKBH3m'})
upvote = element.find('div', attrs={'class': '_3a2ZHWaih05DgAOtvu6cIo'})
author = element.find('a', attrs={'class': '_23wugcdiaj44hdfugIAlnX'})
titles.append(title.text)
upvotes.append(upvote.text)
authors.append(author.text)
Enfin, nous allons stocker ces informations dans un fichier CSV à l'aide du package Pandas que nous avons importé précédemment.
df = pd.DataFrame({'Post title': titles, 'Author': authors, 'Number of upvotes': upvotes})
df.to_csv('posts.csv', index=False, encoding='utf-8')
Et voilà ! Jetons un œil au fichier exporté :
Il semble contenir toutes les informations dont nous avons besoin.
Astuce bonus : parfois, nous avons besoin de plus de données que celles fournies par le site web lors du premier chargement. La plupart du temps, l'action de récupération des données se déclenche lorsque l'utilisateur fait défiler la page vers le bas. Si vous devez faire défiler la page vers le bas pour obtenir plus de données, vous pouvez utiliser la méthode .execute_script() comme ceci :
scrollDown = "window.scrollBy(0,2000);"
driver.execute_script(scrollDown)
Conclusion
J'espère que vous avez pris autant de plaisir que moi à créer ce scraper web. La programmation n'est pas toujours amusante, mais créer de petits scripts comme celui-ci me rappelle mes débuts et rend le processus beaucoup plus divertissant.
Cela dit, le script que nous avons réussi à créer dans ce tutoriel ne peut pas faire beaucoup de travail difficile. Il lui manque quelques fonctionnalités essentielles qui rendent le web scraping fluide. Se connecter à l'aide de proxys mobiles ou résidentiels et résoudre les CAPTCHA n'en sont que quelques exemples.
Si vous recherchez une méthode plus professionnelle pour extraire des données, jetez un œil à ce que WebScrapingAPI peut faire et voyez par vous-même si cela vous convient. Il existe une offre gratuite, donc le seul investissement requis est 30 minutes de votre temps.
Merci d'avoir pris le temps de lire cet article. Bon scraping !




