1. Comprendre les éléments dynamiques
Commençons par une petite excursion dans la nature du contenu dynamique. Imagine que tu es sur un site, et dès que tu fais défiler la page vers le bas, plus de données apparaissent, un peu comme un tapis volant magique qui s'étend constamment pour te permettre de voler. Cela s'appelle le chargement paresseux ou "lazy loading" — une technique astucieuse qui permet d'économiser des ressources en chargeant le contenu seulement quand cela est nécessaire. Compter sur un HTML statique dans de tels cas revient à espérer que ton chat te ramène le café du matin.
Qu'est-ce qu'un élément dynamique ?
Les éléments dynamiques sont les parties d'une page web qui changent sans qu'il soit nécessaire de recharger toute la page. Ils peuvent être chargés via des requêtes AJAX ou incorporés dans la page via JavaScript. Il est essentiel d'apprendre quelques stratégies pour travailler avec de tels éléments afin que ton application soit aussi dynamique que le contenu lui-même.
2. Stratégies d'interaction
Passons à la magie pratique. Pour gérer les éléments dynamiques, nous avons besoin d'outils qui comprennent : "La vie, c'est du mouvement, et je suis prêt pour ça". Dans notre arsenal magique, nous avons Selenium, car il permet d'interagir avec le navigateur presque comme un humain.
Travailler avec les requêtes AJAX
AJAX est une technologie qui permet de mettre à jour une partie d'une page web sans la recharger complètement. C'est pratique pour les utilisateurs, mais cela complique un peu la vie des développeurs de scraping. Cependant, nous avons une arme secrète — WebDriverWait
et expected_conditions
de Selenium.
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# Configurer le driver
driver = webdriver.Chrome()
driver.get("https://example-dynamic-site.com")
# Attendre que l'élément apparaisse
try:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "dynamic_element_id"))
)
print(element.text)
finally:
driver.quit()
Utilisation des méthodes d'attente
Lorsqu'on travaille avec des éléments dynamiques, il est important de donner au navigateur le temps d'"atteindre" l'état souhaité. Les méthodes d'attente comme WebDriverWait
combiné avec expected_conditions
permettent d'attendre en douceur le chargement de tous les éléments nécessaires. C'est comme te motiver à aller à la salle de sport — ça prend du temps, mais le résultat en vaut la peine.
Exemples :
-
presence_of_element_located
— attend que l'élément apparaisse dans le DOM. -
visibility_of_element_located
— attend que l'élément devienne visible. -
element_to_be_clickable
— attend que l'élément devienne cliquable.
Voici un exemple pour attendre que le bouton devienne cliquable :
button = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.XPATH, "//button[@id='submit']"))
)
button.click()
Faire défiler la page
Si ton contenu se charge lors du défilement, tu auras besoin de l'art du "scrolling". Selenium permet d'utiliser JavaScript pour faire défiler, ce qui aide à charger de nouvelles données.
# Scroll jusqu'à la fin de la page
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
Essaie d'implémenter un défilement dans une boucle pour charger tout le contenu :
SCROLL_PAUSE_TIME = 2
driver.get("https://example.com/dynamic-content")
last_height = driver.execute_script("return document.body.scrollHeight")
while True:
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
# Attendre que la page charge le contenu
WebDriverWait(driver, SCROLL_PAUSE_TIME)
new_height = driver.execute_script("return document.body.scrollHeight")
if new_height == last_height:
break
last_height = new_height
3. Exemples pratiques d'interaction
Maintenant que nous avons appris à attendre et observer, il est temps d'appliquer ces techniques en pratique pour capturer toutes ces données dynamiques.
Supposons que nous ayons une page de produits qui se charge en faisant défiler vers le bas. Nous devons extraire le nom et le prix de chaque produit :
products = []
while True:
# Défilement vers le bas
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
# Attendre le chargement des nouveaux éléments
WebDriverWait(driver, SCROLL_PAUSE_TIME)
# Extraction des données des produits
items = driver.find_elements(By.CLASS_NAME, "product-item")
for item in items:
name = item.find_element(By.CLASS_NAME, 'product-name').text
price = item.find_element(By.CLASS_NAME, 'product-price').text
products.append({'name': name, 'price': price})
# Vérification si quelque chose de nouveau a été chargé
# (méthode naïve : si la liste items n'a pas augmenté, on arrête)
if len(products) == last_known_count:
break
last_known_count = len(products)
Quand les éléments dynamiques ne se chargent pas aussi rapidement que nous le voudrions, il faut faire preuve de patience et d'habileté. WebDriverWait
avec son arsenal de conditions, le défilement de page et les injections JavaScript — c'est notre clé pour conquérir le monde du contenu dynamique. Comme disait un grand Jedi : "Patience, jeune padawan". Dans notre cas, la patience signifie un scraping réussi de toutes les données.
On termine la session comme après une bonne journée de boulot — soigneusement.
driver.quit()
N'oublie pas : à la fin, il est essentiel de vérifier que ton code fonctionne correctement, sans bugs ni erreurs. C'est seulement ainsi que tu pourras dire avec confiance : "Mission accomplie". Bonne chance dans ton voyage à travers le monde des données dynamiques !
GO TO FULL VERSION