Comment construire un scraper Web avec Python et Selenium

Robert Sfichi le 06 Jul 2021

De nombreux développeurs choisissent de créer leur propre scraper web plutôt que d'utiliser les produits disponibles. Si vous demandez à la plupart d'entre eux quel est leur langage de programmation préféré, vous entendrez probablement Python un grand nombre de fois.

Python est devenu le favori du public en raison de sa syntaxe permissive et de l'abondance 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 construirons un script Python qui se connectera à un site web, récupérera des données, les mettra en forme et les stockera dans un fichier CSV.

Si vous voulez un aperçu plus général de la façon dont Python peut être utilisé pour le web scraping, vous devriez consulter notre guide ultime pour construire un scraper avec Python. Ensuite, revenez ici pour que nous puissions nous plonger dans les détails !

Vue d'ensemble du sélénium

Comme l'indique le site officiel de Selenium, Selenium est une suite d'outils d'automatisation des navigateurs web qui a d'abord été introduite comme outil de test inter-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, comme par exemple :

  • Remplir les formulaires
  • Défilement
  • Faire des captures d'écran
  • Cliquer sur les boutons

Vous vous demandez peut-être comment tout cela se traduit dans le domaine du web scraping. C'est très simple.

L'extraction de données peut parfois être une véritable plaie. De nos jours, les sites web sont construits comme des applications à page unique, même si cela n'est pas nécessaire. Ils font apparaître des CAPTCHA plus fréquemment que nécessaire et bloquent même les adresses IP des utilisateurs réguliers.

En bref, la détection des robots est une fonction très frustrante qui ressemble à un bogue.

Selenium peut aider dans ces cas en comprenant et en exécutant le code Javascript et en automatisant de nombreux processus fastidieux du web scraping, comme le défilement de la page, la saisie des éléments HTML ou l'exportation des données récupérées.

Installation

Pour montrer la puissance réelle de Selenium et de Python, nous allons récupérer des informations sur le subreddit /r/learnprogramming. Outre l'extraction de données, je vous montrerai également comment l'ouverture de session peut être mise en œuvre. Maintenant que nous avons une bonne compréhension de l'outil principal et du site web que nous allons utiliser, voyons quels sont les autres pré-requis que nous devons installer :

1. Python. Nous utiliserons Python 3.0. Cependant, vous pouvez utiliser Python 2.0 en y apportant de légères modifications. Vous pouvez le télécharger et l'installer ici.

2. Paquet Selenium. Vous pouvez installer le paquet Selenium à l'aide de la commande suivante :

pip3 install selenium

3. Paquet Pandas. Il sera utilisé pour extraire et stocker les données collectées dans un fichier .csv. Veuillez exécuter la commande suivante pour l'installer sur votre appareil.

pip3 install pandas

4. Paquet 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 du pilote Chrome. N'oubliez pas de sauvegarder le chemin dans lequel vous l'avez installé.

Démarrage du navigateur

Commençons par les choses sérieuses. 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 au pilote Chrome sur votre ordinateur. Veuillez consulter la documentation de Selenium pour trouver le chemin 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 voulons 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 s'ouvrir et indiquer "Chrome est contrôlé par un logiciel de test automatisé" en haut de la page.

Localiser des données spécifiques

Comme vous l'avez probablement déjà compris, nous allons scraper le subreddit /r/learnprogramming dans ce tutoriel. Nous enregistrerons le titre des messages, leur auteur, le nombre de votes positifs et les stockerons 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 chargé la page, faisons un clic droit sur n'importe quel message et cliquons sur "Inspecter". Nous pouvons trouver le conteneur HTML du message sous le nom de classe _1oQyIsiPHYt6nx7VOmd1sz.

blog-image

Vous pouvez également exécuter Google Chrome sans interface graphique et enregistrer le contenu HTML de la page en ajoutant quelques lignes de code. Nous allons définir l'option headless à true pour le pilote Chrome (pour 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 quittent Chrome juste après avoir fini d'enregistrer le 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()

Élément Web

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 :

  • En cliquant sur l'objet à l'aide de la méthode .click()
  • Fournir du texte à un élément d'entrée spécifique en appelant la méthode .send_keys()
  • Lire le texte d'un élément en utilisant element.text
  • Vérifier si un élément est affiché sur la page en appelant .is_displayed() sur lui

Un exemple de Selenium en action

Maintenant que notre projet est en place, nous pouvons enfin commencer à gratter.

Connexion

Nous allons 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 faire cliquer Selenium 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()
blog-image

Cela ouvrira la fenêtre modale de connexion dans laquelle nous pourrons voir les informations sur l'utilisateur et le 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 au cadre dans la première partie du code, car la sélection des entrées sans cela entraînera une erreur.

Ensuite, nous récupérons les éléments d'entrée et leur fournissons les informations d'identification appropriées avant de cliquer sur le bouton de soumission. Cela nous ramène à la page /r/learnprogramming, mais nous sommes maintenant connectés et prêts à voter !

Faire une capture d'écran

Prendre une capture d'écran en utilisant Selenium et Python est assez facile. Tout ce que vous avez à faire est 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 de 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 :

blog-image

Extraction des données

Comme nous l'avons dit précédemment, nous devons obtenir le titre, l'auteur et le nombre de votes positifs des articles. Commençons par importer les paquets BeautifulSoup et Pandas et 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é avec succès le document HTML et choisi les bons sélecteurs, nous allons maintenant récupérer les titres, les votes positifs et les auteurs et les assigner au bon tableau :

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 stockerons les informations dans un fichier CSV à l'aide du paquet 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')

Voilà, c'est fait ! Jetons un coup d'œil au fichier exporté :

blog-image

Il semble contenir toutes les informations dont nous avons besoin.

Astuce : 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 l'écran pour obtenir plus de données, vous pouvez utiliser la méthode .execute_script() comme suit :

scrollDown = "window.scrollBy(0,2000) ;"
driver.execute_script(scrollDown)

Réflexions finales

J'espère que vous avez pris autant de plaisir que moi à créer ce scraper web. La programmation n'est pas toujours une partie de plaisir, mais la création de petits scripts comme celui-ci me rappelle mes débuts et rend le processus beaucoup plus divertissant.

Pourtant, le script que nous avons réussi à construire dans ce tutoriel ne peut pas faire beaucoup de travail. Il lui manque quelques fonctionnalités essentielles pour que le web scraping soit parfait. La connexion à l'aide de proxys mobiles ou résidentiels et la résolution des CAPTCHAs n'en sont que quelques-unes.

Si vous cherchez un moyen plus professionnel d'extraire des données, jetez un coup d'œil à ce que WebScrapingAPI peut faire et voyez par vous-même s'il y a une correspondance. Il existe une formule gratuite, de sorte que le seul investissement consiste à consacrer 30 minutes de votre temps.

Merci d'avoir pris le temps de lire ce document. Bon grattage !

Nouvelles et mises à jour

Restez au courant des derniers guides et nouvelles sur le web scraping en vous inscrivant à notre lettre d'information.

We care about the protection of your data. Read our <l>Privacy Policy</l>.Privacy Policy.

Articles connexes

vignette
GuidesComment récupérer les données des produits Amazon : Un guide complet des meilleures pratiques et des outils

Explorez les complexités du scraping des données de produits Amazon avec notre guide approfondi. Des meilleures pratiques aux outils tels que l'API Amazon Scraper, en passant par les considérations juridiques, apprenez à relever les défis, à contourner les CAPTCHA et à extraire efficacement des informations précieuses.

Suciu Dan
avatar de l'auteur
Suciu Dan
15 minutes de lecture
vignette
GuidesTutoriel Scrapy Splash : Maîtriser l'art du scraping de sites web rendus en JavaScript avec Scrapy et Splash

Apprenez à récupérer des sites web dynamiques en JavaScript à l'aide de Scrapy et de Splash. De l'installation à l'écriture d'un spider, en passant par la gestion de la pagination et des réponses Splash, ce guide complet propose des instructions pas à pas pour les débutants comme pour les experts.

Ștefan Răcila
avatar de l'auteur
Ștefan Răcila
6 minutes de lecture
vignette
GuidesApprendre à contourner la détection de Cloudflare avec le meilleur navigateur Selenium

Apprenez quel est le meilleur navigateur pour contourner les systèmes de détection de Cloudflare lorsque vous faites du web scraping avec Selenium.

Mihnea-Octavian Manolache
avatar de l'auteur
Mihnea-Octavian Manolache
9 minutes de lecture