Eseguire lo scraping di un sito che utilizza AJAX è più complesso rispetto al classico web scraping. Il contenuto non si trova nel HTML iniziale: arriva in un secondo momento, tramite JavaScript. Uno scraper semplice, quindi, non rileva nulla, ed è necessario adottare un approccio adeguato per recuperare questi dati dinamici.

AJAX e web scraping: perché sono diversi?
il scraping del web consiste nell'analizzare il codice HTML di una pagina web per estrarne automaticamente i dati utili. Funziona molto bene su un sito statico. Il problema si presenta con AJAX (per Asynchronous JavaScript and XML), una tecnologia che consente di caricare o aggiornare i contenuti senza ricaricare l'intera pagina.
Come funziona AJAX?
Il browser (o browser) invia piccole richieste asincrone al server in background. Il server restituisce i dati, spesso in formato JSON. La pagina visualizza quindi queste informazioni al volo, senza ricaricare il resto. È questo che rende il web più veloce e più interattivo.

Perché lo scraping AJAX è più complesso?
Quando un sito utilizza AJAX, il contenuto caricato non compare nel codice sorgente HTML iniziale. Viene iniettato successivamente dal JavaScript, una volta aperta la pagina. Uno scraper classico recupera solo il contenuto statico : quindi non vede i dati dinamici aggiunte in seguito.
Per recuperarli, ti serve uno strumento in grado di eseguire il JavaScript. In pratica, ci sono tre approcci principali:
- Riprodurre direttamente i richieste AJAX, ovvero le chiamate XHR che caricano i dati.
- Guidare un browser senza testa come Selenium Dove Playwright, che garantisce la resa (o rendering) della pagina proprio come un vero browser.
- Rivolgersi a un API di scraping tutto in uno.
Quali sono i metodi e gli strumenti di scraping AJAX?
Metodo 1: riprodurre le richieste AJAX
È il metodo più efficace per recuperare dati dinamici. Invece di caricare l'intera pagina, tu intercetta le richieste AJAX inviate al server, poi le riproduci direttamente per ottenere i dati grezzi, spesso in formato JSON.
Per individuare queste chiamate, apri gli strumenti di sviluppo del tuo browser, quindi la scheda Rete con il filtro XHR. Lì troverai l'URL esatto dell'endpoint, i intestazioni e il formato della risposta.
I punti di forza di questa tecnica:
- Molto veloce e leggera, poiché non richiede il rendering completo della pagina.
- Lei aggira i problemi legati al rendering JavaScript.
I suoi limiti:
- Di più complesso da realizzare piuttosto che un browser headless.
- Chiede una analisi approfondita richieste, intestazioni e parametri. Alcuni siti richiedono un token o delle intestazioni obbligatorie.
Per quanto riguarda le librerie, puoi scegliere in base al linguaggio:
- Web scraping con Python : la biblioteca
requests. - Web scraping con JavaScript : la biblioteca
axios.

Metodo 2: utilizzare un browser headless
È il metodo più semplice per scraper pagine dinamiche. Si automatizza un vero browser web senza interfaccia grafica. Visualizza la pagina esattamente come farebbe un utente, esegue il JavaScript, avvia le richieste AJAX e visualizza il contenuto finale.
Vantaggi:
- Tu scrapes esattamente ciò che vede l'utente, contenuto caricato compreso.
- Questo è facile da implementare, anche su un sito molto dinamico.
Gli inconvenienti:
- Questo è più lento piuttosto che una richiesta diretta.
- Questo è ad alto consumo di risorse, perché stai avviando un browser completo.
Gli strumenti più utilizzati per questo approccio:
- Selenium : uno strumento versatile, con una lunga tradizione e ben documentato.
- Playwright : moderno, veloce e compatibile con diversi browser.
- Puppeteer : specializzato in Chrome e Chromium.

Puoi combinare un browser headless con BeautifulSoup (modulo bs4) : il browser carica la pagina e garantisce il rendering di JavaScript, poi tu parses il codice HTML generato con la libreria.
Metodo 3: API di scraping "tutto in uno"
Alcune piattaforme offrono servizi completi di scrapingtra strumenti gratuiti o a pagamento presenti sul mercato. Tra questi si possono citare Bright Data, ZenRows, ScrapingBee Dove Crawlbase. Gestiscono automaticamente il Rendering JavaScript, loro deleghe e l'Estrazione dati : invii un URL e loro ti restituiscono il contenuto finale.
Vantaggi:
- Semplici e affidabili, anche su larga scala.
- Non devi occuparti né della gestione dell'infrastruttura né dei proxy.
Gli inconvenienti:
- il il costo può essere elevato a seconda del volume.
- Hai minore controllo sul processo.

Come eseguire lo scraping di un sito con AJAX?
Ecco come effettuare concretamente lo scraping di un sito che carica i propri articoli tramite AJAX, con due esempi di codice in Pitone : uno con requests, uno con un browser senza testa.
1. Individuare le richieste AJAX negli strumenti di sviluppo
Il contenuto caricato tramite AJAX non si trova nel HTML originale. È quindi necessario individuare la chiamata di rete che recupera i dati.
- Apri i strumenti di sviluppo del tuo browser (tasto F12 oppure clic con il tasto destro del mouse e poi “Ispeziona”).
- Vai alla scheda Rete (Network) quindi aggiorna la pagina.
- Osserva i richieste generate dal sito, comprese quelle che si occupano del carico degli articoli.
- Filtro sulle query di tipo XHR Dove fetch : sono proprio queste che recuperano i dati in background.
Clicca sulla query corretta per visualizzarne il URL, suoi intestazioni e la sua risposta. Nella maggior parte dei casi, la risposta è in formato JSON, a volte in HTML.
2. Scegliere il metodo di scraping
Una volta individuata la richiesta AJAX, hai due opzioni.
- Riprodurre la query : puoi riprodurre direttamente la chiamata in Python utilizzando la libreria requests. Si recuperano i dati grezzi in JSON oppure in HTML, senza browser. È il metodo più veloce.
- Browser headless : se il sito richiede l'esecuzione di JavaScript o interazioni complesse (clic, scorrimento), si utilizza Selenium Dove Playwright. Lo strumento carica la pagina proprio come farebbe un utente reale.
3. Riprodurre la richiesta AJAX con requests
Ecco il codice di base per riprodurre la chiamata identificata nella scheda “Rete”.
import requests
# URL della richiesta AJAX individuata negli strumenti di sviluppo
url = 'https://example.com/ajax-endpoint'
# Parametri della richiesta (da adattare ai dati osservati)
params = {
'page': 1,
'category': 'technology'
}
# Intestazioni da copiare dalla scheda Rete (User-Agent, Referer, token...)
headers = {
'User-Agent': 'Mozilla/5.0',
'X-Requested-With': 'XMLHttpRequest'
}
# Invio della richiesta GET
response = requests.get(url, params=params, headers=headers)
# Verifica dello stato della risposta
if response.status_code == 200:
data = response.json()
print(data)
else:
print(f"Errore {response.status_code}")
Dettagli riga per riga:
- import requests : carica la libreria che invia le richieste HTTP.
- url : sostituisci questo indirizzo con l'endpoint AJAX individuato nel scheda "Rete".
- headers : copia le intestazioni visualizzate nella scheda Rete. Alcuni siti richiedono un User-Agent, un Referer o un token CSRF per accettare la richiesta.
- UN stato 200 significa che la richiesta è andata a buon fine.
- response.json() converte la risposta JSON in un dizionario Python.
- print(data) : visualizza i dati estratti (elenco degli articoli, prezzi, ecc.).
- else : visualizza il codice di errore se la chiamata non va a buon fine (ad esempio 403 Dove 404).
4. Scraping con un browser headless (Selenium + BeautifulSoup)
Quando la riproduzione della query non è sufficiente, un browser senza testa esegue il codice JavaScript al posto tuo. A quel punto recuperi l'HTML generato e poi lo parses insieme a BeautifulSoup (modulo bs4).
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup
import time
# Avviare Chrome in modalità headless (senza interfaccia)
options = Options()
options.add_argument("--headless")
driver = webdriver.Chrome(options=options)
# Aprire la pagina che carica i propri contenuti tramite AJAX
driver.get("https://example.com")
# Attendere che JavaScript carichi i dati
time.sleep(3)
# Analizzare l'HTML renderizzato con BeautifulSoup
soup = BeautifulSoup(driver.page_source, "html.parser")
articles = soup.find_all("div", class_="article")
for article in articles:
print(article.get_text())
driver.quit()
Qui, Selenium un vero pilota Chrome che garantisce il rendering della pagina, e driver.page_source restituisce il codice HTML una volta caricato il contenuto AJAX. Playwright e Puppeteer funzionano secondo lo stesso principio, ma con una sintassi diversa.
5. Estrarre i dati dal JSON o dall'HTML generato
Una volta ottenuta la risposta, isoli le informazioni utili in base al formato.
- Risposta in formato JSON : utilizza response.json() per ottenere un dizionario Python, quindi accede ai valori tramite le relative chiavi.
- Risposta in HTML : passa per BeautifulSoup (modulo
bs4) con find Dove select per selezionare gli elementi in base alla loro classe o al loro ID.
Quale metodo di scraping AJAX scegliere?
Ogni approccio ha i suoi punti di forza a seconda del tuo livello e del tuo progetto. Ecco un breve confronto.
| Metodo | Velocità | Complessità | Costo | Ideale per… |
|---|---|---|---|---|
| Riproduzione della richiesta | Molto veloce | Alto | Debole | Scraping su larga scala, dati strutturati |
| Browser headless | Lenta | Significare | Debole | Siti complessi, progetti rapidi, principianti |
| API di scraping | Veloce | Molto basso | Elevato | Progetti critici, senza manutenzione dell'infrastruttura |
In pratica: inizia con la riproduzione della richiesta se l'endpoint AJAX restituisce un JSON corretto. Passa al browser senza testa non appena il JavaScript diventa indispensabile.
Quali sono le sfide dello scraping AJAX e le relative soluzioni?
Estrarre i dati da un sito in AJAX pone dei problemi che lo scraping tradizionale non incontra. Ecco le principali sfide e, soprattutto, come superarle.
Sfida 1: il contenuto invisibile a prima vista
Quando carichi una pagina AJAX, il Il codice HTML iniziale è spesso vuoto : i dati arrivano solo dopo l'esecuzione del JavaScript. La soluzione è utilizzare un browser headless come Selenium, Playwright Dove Puppeteer, che garantisce il rendering completa della pagina prima di leggerne il contenuto.
Sfida 2: le query semplici che falliscono
Riprodurre la richiesta AJAX non è sempre sufficiente. Molti siti proteggono la propria API, e la tua richiesta può restituire un errore 403 mentre il browser, invece, riceve correttamente la risposta. Nella tua richiesta mancano alcune informazioni. In pratica, spesso è necessario:
- Copia i headers obbligatori visualizzati nella scheda Network (come User-Agent Dove Referer).
- Aggiungere il gettone CSRF oppure i cookie di sessione, quando il server li richiede.
- Controllare il codice di stato della risposta per individuare rapidamente il problema.
Sfida 3: la gestione dei tempi di carico
I dati caricati tramite AJAX possono richiedere tempo per apparire. Se lo scraper legge la pagina troppo presto, non trova nulla. Due approcci a seconda delle esigenze:
- Una pausa fissa (uno sleep (in secondi) prima di visualizzare la pagina. Semplice, ma poco affidabile.
- Una attesa condizionata, molto più pulito, tramite i attende di Selenium : l’aspettativa implicita attende automaticamente che gli elementi siano disponibili, mentre l’richiesta esplicita attende precisamente un elemento o una condizione specifica prima di proseguire.
Sfida 4: eseguire lo scraping su larga scala senza essere bloccati
Per poche pagine, nessun problema. Ma se estrai dati da migliaia di pagine, il sito finisce per individuarti e bloccarti. Per resistere a lungo:
- Fai indirizzare le tue richieste tramite proxy per variare gli indirizzi IP.
- Rispetta un intervallo tra le chiamate invece di inviare tutto in una volta sola.
- Gestisce la impaginazione e il scorrimento infinito a poco a poco, proprio come un vero visitatore.
Il segreto è mantenere un profilo basso. Più il tuo comportamento assomiglia a quello di un essere umano, meno rischi di essere disconnesso.
Domande frequenti
È possibile utilizzare BeautifulSoup per estrarre dati da un sito web che utilizza AJAX?
Non direttamente. BeautifulSoup è una libreria di analisi statica : legge solo l'HTML caricato inizialmente. Poiché AJAX inserisce il contenuto tramite JavaScript, devi integrarla con uno strumento in grado di eseguire quel codice JavaScript, come Selenium Dove Playwright. Il browser headless recupera l'HTML renderizzato, dopodiché si passa questo contenuto a BeautifulSoup per il parsing.
Un'altra opzione: intercettare direttamente i richieste AJAX e recuperare la risposta JSON, spesso più semplice da elaborare rispetto all'HTML.
Come gestire gli errori di autenticazione o le intestazioni di sessione su un sito AJAX?
Un sito protetto può restituire un errore 401 (non consentito) oppure 403 (vietato) quando le tue richieste non includono quelli giusti Biscotti o intestazioni HTTP. La soluzione: intercettare queste informazioni durante la navigazione iniziale, per poi riutilizzarli nelle tue richieste AJAX simulate. Molti siti richiedono inoltre un token CSRF o un'intestazione X-Requested-With, senza il quale il server rifiuta la richiesta. È proprio per questo che una semplice richiesta requests si incaglia proprio dove passa la nave.
Come si fa a estrarre i dati da un sito con lo scorrimento infinito o con il pulsante “Carica altro”?
Il caricamento infinito è una forma di caricamento AJAX. Per automatizzarlo, hai due approcci:
- Identificare la richiesta AJAX che carica i contenuti aggiuntivi e poi li riproduce direttamente (spesso un URL con un parametro di impaginazione).
- Oppure simulare clic sul pulsante “Carica altro” tramite un browser headless come Selenium Dove Puppeteer, fino a quando non saranno stati recuperati tutti i dati.
Esistono estensioni Chrome per lo scraping AJAX?
Sì. Parecchi estensioni Chrome facilitano lo scraping AJAX per esigenze semplici, senza dover scrivere una sola riga di codice. Le più note:
- Web Scraper
- Data Miner
- Instant Data Scraper

Qual è la differenza tra un “wait” esplicito e uno implicito con Selenium o Playwright?
- UN attesa implicita È un'attesa globale, applicata a tutti gli elementi. Il tuo script attende per un certo periodo di tempo prima di generare un errore se un elemento non viene visualizzato.
- UN attesa esplicita è un'attesa condizionale, mirata a un elemento specifico. Attende solo fino a quando non viene soddisfatta una condizione.
In pratica, il attesa esplicita è preferibile: evita ritardi inutili e riduce gli errori quando il contenuto AJAX impiega molto tempo a caricarsi.
In breve, lo scraping con AJAX richiede un po’ più di abilità, ma con i metodi giusti non ti sfuggirà nulla. E tu? Quale metodo usi per fare scraping sui siti AJAX? Condividi i tuoi consigli nei commenti.





