CodeGym /Cours /Python SELF FR /Travailler avec des éléments dynamiques sur une page web

Travailler avec des éléments dynamiques sur une page web

Python SELF FR
Niveau 36 , Leçon 3
Disponible

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.

Python

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 :

Python

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.

Python

# 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 :

Python

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 :

Python

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.

Python

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 !

Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION