---
# 🎯 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]]