CodeGym /Corsi /Python SELF IT /Lavorare con elementi dinamici su una pagina web

Lavorare con elementi dinamici su una pagina web

Python SELF IT
Livello 36 , Lezione 3
Disponibile

1. Comprendere gli elementi dinamici

Iniziamo con una piccola introduzione sulla natura del contenuto dinamico. Immagina di essere su un sito, e non appena scorri la pagina verso il basso, compaiono più dati, come un tappeto volante magico che si espande costantemente, permettendoti di volare sopra di esso. Questo si chiama "lazy loading" — una tecnica furba che aiuta a risparmiare risorse, caricando il contenuto solo quando necessario. Affidarsi a HTML statico in questi casi è come sperare che il tuo gatto ti porti il caffè al mattino.

Cosa sono gli elementi dinamici?

Gli elementi dinamici sono quelle parti di una pagina web che cambiano senza dover aggiornare l'intera pagina. Possono essere caricati tramite richieste AJAX o integrati nella pagina tramite JavaScript. È importante apprendere diverse strategie per lavorare con tali elementi, in modo che la tua applicazione sia tanto dinamica quanto il contenuto stesso.

2. Strategie di interazione

Passiamo alla magia pratica. Per gestire gli elementi dinamici, abbiamo bisogno di strumenti che capiscano: "La vita è movimento, e io sono pronto per affrontarla". Nel nostro arsenale magico ci sarà Selenium, dato che consente di interagire col browser quasi come farebbe una persona.

Lavorare con richieste AJAX

AJAX è una tecnologia che permette di aggiornare una parte della pagina web senza doverla ricaricare completamente. È comodo per gli utenti, ma complica un po' la vita degli sviluppatori di scraper. Tuttavia, abbiamo un'arma segreta — WebDriverWait e expected_conditions di 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

# Configuriamo il driver
driver = webdriver.Chrome()
driver.get("https://example-dynamic-site.com")

# Aspettare che l'elemento compaia
try:
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "dynamic_element_id"))
    )
    print(element.text)
finally:
    driver.quit()

Uso dei metodi di attesa

Lavorando con elementi dinamici, è importante dare al browser il tempo di "raggiungere" lo stato desiderato. I metodi di attesa, come WebDriverWait combinati con expected_conditions, ci permettono di attendere tranquillamente che tutti gli elementi necessari siano caricati. È come portarsi in palestra — serve tempo, ma il risultato ne vale la pena.

Esempi:

  • presence_of_element_located — aspetta che l'elemento compaia nel DOM.
  • visibility_of_element_located — aspetta che l'elemento diventi visibile.
  • element_to_be_clickable — aspetta che l'elemento diventi cliccabile.

Ecco un esempio per aspettare che un pulsante sia cliccabile:

Python

button = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.XPATH, "//button[@id='submit']"))
)
button.click()

Scorrere la pagina

Se il tuo contenuto si carica mentre scorri, avrai bisogno dell'arte dello "scrolling". Selenium consente di utilizzare JavaScript per lo scrolling, il che aiuta a caricare nuovi dati.

Python

# Scorrere fino in fondo alla pagina
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

Prova a implementare lo scrolling in loop per caricare tutto il contenuto:

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);")

    # Aspetta per caricare il contenuto della pagina
    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. Esempi pratici di interazione

Ora che abbiamo imparato ad aspettare e osservare, è il momento di mettere queste abilità in pratica e catturare tutti questi dati dinamici.

Supponiamo che ci sia una pagina con prodotti che viene caricata mentre scorriamo verso il basso. Dobbiamo estrarre il nome e il prezzo di ogni prodotto:

Python

products = []

while True:
    # Scorrere verso il basso
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

    # Aspetta il caricamento di nuovi elementi
    WebDriverWait(driver, SCROLL_PAUSE_TIME)

    # Estrazione dei dati dei prodotti
    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})

    # Controllare se è stato caricato qualcosa di nuovo
    # (modo ingenuo: se la lunghezza di items non aumenta, esce dal ciclo)
    if len(products) == last_known_count:
        break
    last_known_count = len(products)

Quando gli elementi dinamici non si caricano così rapidamente come vorremmo, occorre avere pazienza e astuzia. WebDriverWait con il suo arsenale di condizioni, lo scrolling della pagina e le iniezioni JavaScript sono la nostra chiave per conquistare il mondo del contenuto dinamico. Come diceva il grande Jedi: "Pazienza, mio giovane padawan". Nel nostro caso, pazienza significa uno scraping di successo di tutti i dati.

Concludiamo la sessione proprio come si fa dopo una giornata di lavoro ben riuscita — con cura.

Python

driver.quit()

Non dimenticare: alla fine è importante assicurarsi che il tuo codice funzioni correttamente, senza errori o problemi. Solo così puoi dire con sicurezza: "Missione compiuta". Buona fortuna nel tuo viaggio nel mondo dei dati dinamici!

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