Retour au blog
Guides
Robert SfichiLast updated on Mar 31, 20268 min read

Comment créer un outil de scraping Web avec Python et Selenium

Comment créer un outil de scraping Web avec Python et Selenium

De nombreux développeurs préfèrent créer leur propre outil de web scraping plutôt que d'utiliser les solutions existantes. Si vous demandez à la plupart d'entre eux quel langage de programmation ils préfèrent, vous entendrez très certainement le nom de Python à maintes reprises.

Python est devenu le favori du public grâce à sa syntaxe souple et à la multitude de bibliothèques qui simplifient le travail de web scraping. Aujourd’hui, nous allons parler de l’une de ces bibliothèques.

Ce guide explique comment commencer à extraire des données avec Selenium et Python. Nous allons créer un script Python qui se connectera à un site web, extraira certaines données, les mettra en forme de manière claire et les enregistrera dans un fichier CSV.

Si vous souhaitez avoir un aperçu plus général de l'utilisation de Python pour le web scraping, consultez notre guide complet sur la création d'un scraper avec Python. Revenez ensuite ici pour que nous puissions approfondir le sujet !

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 !

À propos de l'auteur
Robert Sfichi, Développeur full-stack @ WebScrapingAPI
Robert SfichiDéveloppeur full-stack

Robert Sfichi fait partie de l'équipe de WebScrapingAPI ; il contribue au développement du produit et aide à mettre en place des solutions fiables au service de la plateforme et de ses utilisateurs.

Commencez à créer

Prêt à faire évoluer votre système de collecte de données ?

Rejoignez plus de 2 000 entreprises qui utilisent WebScrapingAPI pour extraire des données Web à l'échelle de l'entreprise, sans aucun coût d'infrastructure.