Scarnox · Blog

Come fare scraping di siti web renderizzati con JavaScript

Molti siti moderni inviano un documento HTML quasi vuoto e costruiscono i contenuti nel browser con JavaScript. Se il tuo scraper scarica la pagina e non trova prodotti, prezzi né testo di articoli, il contenuto esiste, ma arriva più tardi. Questa guida mostra come capire che tipo di pagina hai, come trovare una via più rapida del browser dove esiste, e come fare scraping delle pagine renderizzate con Playwright in Python. Si chiude con una nota su cosa fare quando una pagina renderizzata mostra un captcha.

Passo 1: verifica se il contenuto è nell'HTML

Apri la pagina con view-source: nel browser, oppure scaricala con una richiesta HTTP semplice, e cerca nel sorgente un pezzo di testo che vedi sullo schermo. Sono comuni tre esiti:

Passo 2: chiama l'endpoint JSON, se esiste

Quando una pagina recupera i dati da un endpoint, chiamare direttamente quell'endpoint è di solito l'opzione migliore. È più piccolo, più veloce e più stabile della pagina renderizzata. Copia l'URL della richiesta, verifica quali intestazioni richiede il sito e prova da uno script. Fallo solo dove i termini del sito lo consentono, e rispetta eventuali limiti di frequenza o autenticazioni che il sito si aspetta. Un endpoint non documentato può cambiare senza preavviso, quindi scrivi il parser in modo che fallisca in modo esplicito quando cambia la forma della risposta.

Passo 3: renderizza la pagina quando è necessario

Se il contenuto richiede davvero il browser, pilota un browser headless. Playwright è una buona scelta per Python. L'esempio seguente apre un elenco di prodotti, attende che il contenuto compaia e legge il testo di ogni scheda:

from playwright.sync_api import sync_playwright

URL = "https://example.com/products"  # una pagina di cui puoi fare scraping

with sync_playwright() as p:
    browser = p.chromium.launch(headless=True)
    page = browser.new_page()
    page.goto(URL, wait_until="domcontentloaded", timeout=60_000)
    # Attendi l'elemento che conferma l'arrivo dei dati.
    page.wait_for_selector(".product-card", timeout=30_000)
    titles = page.locator(".product-card h2").all_inner_texts()
    browser.close()

for title in titles:
    print(title)

Attendere un selettore specifico è molto più affidabile di una sleep fissa. Una pausa fissa è troppo breve in una giornata lenta, oppure fa perdere tempo in una veloce. Scegli l'elemento che compare solo quando i dati sono stati caricati.

Passo 4: gestisci lo scorrimento infinito e la paginazione

Alcune pagine caricano altri elementi mentre scorri. Scorri fino in fondo, attendi che il numero di elementi cresca, e fermati quando smette di crescere. Le pagine con paginazione numerata sono più semplici: trova il link alla pagina successiva, seguilo e fermati all'ultima pagina. Imposta sempre un numero massimo di pagine o di scorrimenti, così un bug non può tenere il tuo crawler in esecuzione per sempre.

def scroll_until_done(page, selector: str, max_rounds: int = 20) -> int:
    previous = -1
    for _ in range(max_rounds):
        count = page.locator(selector).count()
        if count == previous:
            break
        previous = count
        page.mouse.wheel(0, 4000)
        page.wait_for_timeout(1500)  # dai tempo al lotto successivo di caricarsi
    return previous

Passo 5: mantieni il browser economico

Renderizzare è costoso. Blocca immagini, font e contenuti multimediali che non ti servono, e riutilizza un solo browser per molte pagine invece di avviarne uno nuovo ogni volta. Chiudi pagine e contesti quando hai finito, così la memoria non cresce durante un'esecuzione lunga.

def block_heavy_assets(route):
    if route.request.resource_type in ("image", "font", "media"):
        route.abort()
    else:
        route.continue_()

page.route("**/*", block_heavy_assets)

Passo 6: quando una pagina renderizzata mostra un captcha

A volte la pagina renderizzata presenta un captcha prima di mostrare qualsiasi contenuto. Se quel captcha è PopularCaptcha, il tipo attivo su Scarnox, leggi la sitekey dalla pagina, richiedi un token e inseriscilo nel campo del modulo che il sito si aspetta. La guida Python per PopularCaptcha illustra questo passaggio. Gli altri widget non sono ancora attivi, quindi controlla tipi di captcha spiegati prima di pianificare su uno di essi.

Fai attenzione al browser stesso. Un browser headless che sembra chiaramente automatizzato può attivare più controlli, non meno. Leggi rilevamento del browser headless per i segnali da tenere d'occhio, e preferisci caricamenti di pagina più lenti e meno frequenti.

Scraping responsabile

Passi successivi

Inizia con il credito di prova gratuito, senza carta: crea un account e prova il flusso PopularCaptcha su una pagina di tua proprietà. Per le tariffe attuali, consulta la pagina dei prezzi.