--- # 🎯 Objectifs du chapitre À la fin de ce chapitre, l’étudiant doit être capable de : - comprendre pourquoi certains sites **ne peuvent pas être scrapés avec `requests`** - comprendre le rôle de **JavaScript dans les pages web** - utiliser **Selenium** pour automatiser un navigateur - extraire des données d’une page web dynamique - combiner **Selenium + BeautifulSoup** --- # 1️⃣ Limites du scraping avec `requests` Dans les chapitres précédents, nous avons utilisé : ``` requests + BeautifulSoup ``` Mais certains sites web utilisent **JavaScript** pour charger les données. Exemple : ``` HTML initial → vide JavaScript → charge les articles ``` Dans ce cas : ```python requests.get(url) ``` ne récupère **pas les données visibles dans le navigateur**. --- ## Exemple de problème Le HTML téléchargé peut ressembler à : <div id="articles"> <!-- contenu chargé par JavaScript --> </div> ```html <div id="articles"> <!-- contenu chargé par JavaScript --> </div> ``` Les articles sont ajoutés **après le chargement de la page**. --- # 2️⃣ Solution : Selenium **Selenium** permet d’automatiser un navigateur réel. Le programme contrôle : ``` Chrome Firefox Edge ``` Selenium peut : - ouvrir un site web - cliquer sur des boutons - scroller la page - récupérer le contenu final --- ## Schéma de fonctionnement ``` Python ↓ Selenium ↓ Navigateur (Chrome) ↓ Chargement JavaScript ↓ HTML final ``` --- # 3️⃣ Installer Selenium Installation : ```python pip install selenium ``` --- ## Installer un navigateur automatisé Nous utilisons généralement : ``` ChromeDriver ``` ou ``` Firefox GeckoDriver ``` Aujourd’hui Selenium peut souvent télécharger le driver automatiquement. --- # 4️⃣ Premier programme Selenium Exemple simple : ```python from selenium import webdriver driver = webdriver.Chrome() driver.get("https://example.com") ``` Cela ouvre **un navigateur Chrome automatisé**. --- ## Lire le HTML de la page ``` html = driver.page_source print(html[:500]) ``` --- # 🧠 Mini-tâche 1 (5 minutes) Compléter : ```python from selenium import __________ driver = webdriver.________() driver.________("https://example.com") ``` --- # 5️⃣ Trouver des éléments dans la page Selenium permet de trouver des éléments avec : ``` find_element find_elements ``` Exemple : ```python title = driver.find_element("tag name", "h1") print(title.text) ``` --- ## Trouver plusieurs éléments ```python titles = driver.find_elements("tag name", "h2") for t in titles: print(t.text) ``` --- # 🧠 Mini-tâche 2 (5 minutes) Compléter : ```python titles = driver.________("tag name", "h2") for t in titles: print(t.________) ``` --- # 6️⃣ Attendre le chargement d’une page Les pages dynamiques peuvent prendre du temps à charger. On peut utiliser : ```python import time time.sleep(3) ``` Exemple : ```python driver.get("https://example.com") time.sleep(3) ``` --- ⚠️ Ce n’est pas toujours la meilleure solution, mais c’est simple pour commencer. --- # 7️⃣ Combiner Selenium et BeautifulSoup Une fois la page chargée, on peut utiliser **BeautifulSoup**. Exemple : ```python from bs4 import BeautifulSoup html = driver.page_source soup = BeautifulSoup(html, "html.parser") Ensuite on utilise les méthodes vues précédemment : find() find_all() ``` --- # 🧠 Mini-tâche 3 (10 minutes) Compléter : ```python html = driver.________ soup = BeautifulSoup(html, "________") titles = soup.________("h2") for t in titles: print(t.text) ``` --- # 8️⃣ Exemple : extraire des titres d’articles Code complet : ```python from selenium import webdriver from bs4 import BeautifulSoup import time driver = webdriver.Chrome() driver.get("https://example.com") time.sleep(3) html = driver.page_source soup = BeautifulSoup(html, "html.parser") titles = soup.find_all("h1") for t in titles: print(t.text) driver.quit() ``` --- # 🧠 Mini-tâche 4 (10 minutes) Modifier le script pour extraire : h1 h2 h3 --- # 9️⃣ Automatiser un clic Certains sites ont un bouton : ``` Load more ``` Selenium peut cliquer dessus. Exemple : ```python button = driver.find_element("id", "load-more") button.click() ``` --- Puis attendre : ``` time.sleep(2) ``` --- # 🧠 Mini-tâche 5 (10 minutes) Compléter : ``` button = driver.find_element("________", "load-more") button.________() ``` --- # 🧩 Mini-projet du chapitre (30–45 min) ## 🎯 Objectif Créer un scraper Selenium qui : 1️⃣ ouvre un site web 2️⃣ attend que la page charge 3️⃣ récupère le HTML 4️⃣ extrait les titres des articles --- ## Étapes 1️⃣ ouvrir : https://example.com 2️⃣ attendre 3 secondes 3️⃣ récupérer le HTML 4️⃣ extraire les titres --- # ✏️ Code à compléter ```python from selenium import webdriver from bs4 import BeautifulSoup import time driver = webdriver.________() driver.get("https://example.com") time.________(3) html = driver.________ soup = BeautifulSoup(html, "________") titles = soup.________("h1") for t in titles: print(t.________) driver.quit() --- # Résultat attendu Example Domain ``` --- # ⭐ Bonus Modifier le script pour extraire aussi : ``` h2 h3 ``` --- # ✅ Correction du mini-projet ```python from selenium import webdriver from bs4 import BeautifulSoup import time driver = webdriver.Chrome() driver.get("https://example.com") time.sleep(3) html = driver.page_source soup = BeautifulSoup(html, "html.parser") titles = soup.find_all("h1") for t in titles: print(t.text) driver.quit() ``` --- # 🔎 Explication ### Ouvrir le navigateur ``` webdriver.Chrome() ``` lance un navigateur contrôlé par Python. --- ### Charger une page ``` driver.get(url) ``` ouvre l’URL. --- ### Récupérer le HTML ``` driver.page_source ``` renvoie le HTML **après exécution du JavaScript**. --- ### Fermer le navigateur ``` driver.quit() ``` termine la session. --- # 🧠 Ce qu’il faut retenir Dans ce chapitre nous avons appris : ✔ pourquoi certains sites nécessitent Selenium ✔ automatiser un navigateur ✔ attendre le chargement d’une page ✔ récupérer le HTML final ✔ combiner Selenium et BeautifulSoup --- ## 🗓️ Historique > **Dernière mise à jour :** `12 mars 2026` > **Rédigé par :** [[Jizhen CAI]]