I selettori adattivi di Scrapling, messi alla prova: cosa recuperano davvero dopo un redesign

Ultimo aggiornamento il July 17, 2026
I selettori adattivi di Scrapling, messi alla prova: cosa recuperano davvero dopo un redesign
Riepilogo AI
Questa recensione di Scrapling mette alla prova la funzione di selettori adattivi senza esagerarne le capacità. Verifica che Scrapling possa ritrovare un elemento tracciato dopo il rename di una classe, mostrando però anche che si tratta di un tracking resiliente degli elementi, non del recupero automatico di un’intera pagina redesignata. La recensione copre l’attrito iniziale dell’extra fetchers, il recall dell’estrazione statica, l’estrazione di articoli, la gestione degli errori 500 e il confine tra fetch HTTP e modalità basata su browser. È particolarmente utile per gli sviluppatori che vogliono resilienza dei selettori su elementi specifici e devono capire il lavoro di tuning richiesto oltre al titolo della funzione.

Ai selettori adattivi spesso si dà il merito allo strumento sbagliato. In metà dei confronti tra scraper che leggo, la frase “sopravvive a un redesign del sito” finisce attaccata a qualche grande crawler AI che, in realtà, non lo fa. La libreria Python che mette questa funzione al centro è Scrapling, un progetto in forte crescita che al 2026-07-09 contava circa 68,7k stelle su GitHub.

Ho quindi fatto il test che conta davvero per una promessa del genere. Ho creato una pagina fixture, salvato un selettore e poi ho rinominato la classe dell’elemento target sotto al suo naso — proprio il tipo di modifica che, la mattina dopo un redesign, manda in tilt uno scraper senza farsi notare. Un selettore normale è tornato vuoto. Il match adattivo di Scrapling ha trovato comunque l’elemento. Questa parte è reale, e i numeri li vedrai tra poco. La parte che quasi nessuno misura è dove finisce il recupero, e quel confine, in pratica, è tutto il review.

Che cos’è davvero Scrapling

Scrapling HTTP and static extraction context

Scrapling si presenta come un framework di web scraping adattivo che gestisce “tutto, da una singola richiesta fino a una crawl su larga scala”. Tolto lo slogan, si divide in due livelli: un Fetcher HTTP che scarica le pagine e un Selector basato su lxml che le analizza, con CSS/XPath completi e i pratici pseudo-selettori ::text / ::attr(). Ha licenza BSD-3-Clause, quindi tra le più permissive del mondo open source. Ho testato la versione 0.4.10, che al momento era quella in rilascio: niente asterischi del tipo “hai benchmarkato qualcosa di vecchio”.

La parte interessante è il livello adattivo sopra al parser. Immagina un selettore normale: è un indirizzo scritto in modo fisso. “Prendi l’elemento con classe product-name.” Se rinomini l’edificio — cioè rinomini la classe — quell’indirizzo porta a un lotto vuoto. Scrapling invece può salvare l’impronta di un elemento in una prima esecuzione e, in una successiva, dopo che il markup è cambiato, ritrovare quell’elemento tramite la sua impronta invece che tramite l’indirizzo ormai morto. Secondo la documentazione di Scrapling sui selettori adattivi, la fase di match valuta la somiglianza tra tag, testo, attributi, elementi fratelli e posizione — nessun modello coinvolto, solo confronto strutturale con ciò che era stato salvato.

Vale la pena essere chiari sull’origine di questa funzione, perché cambia il modo in cui va letto il prodotto. Il riposizionamento adattivo è una capacità reale e documentata, non qualcosa che ho scoperto io — la documentazione del vendor spiega bene il meccanismo di salvataggio su SQLite e di match per somiglianza, e anche diversi approfondimenti indipendenti lo illustrano. Il concetto di selettori self-healing, inoltre, esisteva già nel mondo del test automation prima di Scrapling. La differenza è che Scrapling lo integra come funzione nativa della libreria: parser tradizionali come lxml, parsel e BeautifulSoup offrono selettori statici e nulla che si riposizioni da solo. Quindi si tratta di una funzione distintiva ma documentata, che ho riprodotto e stressato — non di una capacità che nessun altro ha mai avuto.

Il test adattivo, nel dettaglio

Scrapling selector break and adaptive re-match

Ecco il setup. Ho messo online un catalogo fixture e ho tracciato un elemento prodotto mentre la sua classe era product-name. Poi ho rinominato quella classe in product-title e ho rilanciato lo stesso codice. Un selettore .product-name normale ha restituito 0 elementi — esattamente il risultato vuoto che ti aspetteresti da un selettore puntato a una classe che non esiste più. Il nuovo matching adattivo di Scrapling ha recuperato l’elemento tracciato usando l’impronta salvata nella versione precedente. Il risultato grezzo è nel repo dei benchmark, in local_adaptive_selector.json.

Scrapling class rename diff

Prova Thunderbit per l’estrazione di dati web

Scrapling normal selector 0 vs adaptive 1 of 3

Ora arriva la parte che la maggior parte delle recensioni salta. Ho spinto il test oltre, con una prova sintetica su più elementi — tre elementi tracciati invece di uno. Scrapling ha riposizionato il primo elemento salvato, non tutti e tre. Non è un fallimento e non è un bug; la documentazione descrive il match automatico come tracking di elementi, un’impronta per ogni elemento salvato, quindi un risultato 1 su 3 nelle impostazioni predefinite è esattamente il comportamento previsto. Ma questo significa che la descrizione corretta è “tracking resiliente degli elementi”, non “recupero automatico dell’intera pagina dopo un redesign”. L’auto-match segue l’elemento che gli hai detto di seguire. La resilienza su più elementi è una regolazione che fai tu.

Questa distinzione conta più di quanto sembri. “Sopravvive ai cambiamenti del markup” è uno slogan. “Continua a seguire l’elemento di cui hai salvato l’impronta attraverso i cambiamenti del markup, mentre il resto lo gestisci tu” è la vera capacità che stai comprando. Se ti aspetti la prima cosa, resterai deluso. Se ti aspetti la seconda, fa il suo lavoro in modo pulito.

Setup: l’attrito di cui nessuno ti avverte

Questa mi è costata tempo vero, quindi la racconto prima che capiti anche a te. pip install scrapling installa il parser — e solo il parser. Nell’istante in cui ho scritto from scrapling.fetchers import Fetcher, si è rotto tutto per una catena di dipendenze mancanti: prima curl_cffi, poi playwright, poi browserforge, ognuna che compariva solo dopo aver risolto la precedente.

La soluzione è installare l’extra: pip install "scrapling[fetchers]", oppure usare il comando CLI scrapling install, che scarica l’intero stack di fetcher HTTP + browser. Dopo di che, tutto ha funzionato. Però la sequenza “installazione base sembra ok, poi esplode al primo fetch” è reale, e non viene proprio messa in evidenza all’inizio. Metti in conto da subito l’extra [fetchers] e le sue pesanti dipendenze transitive, e ti risparmi tutta la deviazione.

Cosa ha retto con l’estrazione HTTP semplice

Una volta disponibili i fetcher, il percorso di estrazione ordinario è stato solido — recall 1.0 su tutta la linea:

TestRisultato
Catalogo statico + paginazione12/12 prodotti
Estrazione articolotitolo + 3/3 paragrafi
API JSON dinamica8/8 elementi
Books to Scrape (pubblico)20 prodotti
Gestione HTTP 500status esposto chiaramente, nessun crash

Qui si vede bene l’impronta di lxml. CSS e XPath si comportano come dovrebbero, e i pseudo-selettori ::text / ::attr() mantengono il codice di estrazione corto e leggibile invece di trasformarlo in una pila di chiamate annidate. Il caso 500 è piccolo ma rivelatore: il Fetcher mi ha mostrato lo status code invece di lanciarmi uno stack trace, e questa è la differenza tra uno scraper che puoi mettere in schedule e uno che devi sorvegliare a mano. I numeri completi sono in scrapling-test-summary.json.

Nulla di tutto questo è spettacolare. È solo corretto, e il corretto è sottovalutato.

Cosa non fa, per scelta

Scrapling honest boundary

Il Fetcher HTTP non esegue JavaScript. L’ho puntato su una fixture renderizzata via JS e ho ottenuto 0 card; stesso 0 sulla pagina pubblica Quotes to Scrape JS. Non è un difetto — l’HTTP Fetcher scarica HTML, non controlla un browser, quindi il contenuto renderizzato lato client semplicemente non c’è quando lo cerchi. Scrapling offre un DynamicFetcher separato, basato su browser, per le pagine JS. In questa prova non l’ho usato, quindi non ti dirò come va. Semplicemente, non puntare il percorso HTTP a un’app renderizzata lato client aspettandoti di vedere i contenuti.

C’è anche un StealthyFetcher pensato per l’anti-detection. Lo considero una questione di compliance, punto e basta — non una feature da sventolare. Dove e come ti è consentito fare scraping dipende da te e dalla tua posizione legale, e questa review ha testato la capacità di estrazione, non l’elusione. Non l’ho eseguito e non lo sto valutando.

Pro e contro

Pro:

  • I selettori adattivi hanno davvero recuperato un elemento tracciato dopo il rename di una classe che riportava 0 con un selettore normale — il motivo distintivo per scegliere Scrapling.
  • Estrazione HTTP con recall 1.0 su pagine statiche, articoli e API JSON.
  • CSS/XPath puliti basati su lxml, con pseudo-selettori ::text / ::attr() facili da leggere.
  • Gestione elegante degli HTTP 500 — status visibile, nessun crash.
  • La versione testata coincide con l’ultima release, quindi niente problemi di drift di versione.
  • Licenza BSD-3-Clause permissiva, adatta anche a usi commerciali.

Contro:

  • L’auto-match segue un elemento salvato, non un’intera pagina — nel test con tre elementi ne ha recuperato uno. Le aspettative vanno tarate di conseguenza.
  • pip install scrapling installa solo il parser; per i fetcher serve l’extra [fetchers] e la sua pesante catena di dipendenze, cosa che ho scoperto nel modo più scomodo.
  • L’HTTP Fetcher non renderizza JavaScript; i contenuti client-side richiedono il DynamicFetcher basato su browser, che qui non ho testato.
  • La resilienza da titolo richiede comunque un tuning manuale nei casi con più elementi.

A chi serve — e chi dovrebbe evitarlo

Scrapling si merita il suo spazio se mantieni scraper su siti che cambiano spesso design e sei stufo che una semplice modifica di classe mandi in silenzio all’aria l’estrazione del giorno dopo. Se il tuo problema ricorrente è “i selettori si rompono ogni poche settimane e voglio solo che l’elemento che mi interessa continui a essere trovato”, è chiaramente pensato per te. Può anche funzionare come estrattore lxml pulito e leggero per pagine statiche e API JSON, anche se non attivi mai il livello adattivo.

Conviene però resettare le aspettative — o guardare altrove — in due casi. Se speravi che i selettori adattivi potessero auto-riparare un’intera pagina dopo un redesign — loro tracciano elementi, non ricostruiscono layout — ti serve un modello mentale diverso. E se i tuoi target sono pesanti di JavaScript e non vuoi mettere in piedi il DynamicFetcher basato su browser, il solo percorso HTTP non basta. In ogni caso, quando lo installi, aggiungi l’extra [fetchers] fin dal primo comando.

Dove si colloca un’API AI gestita per lo scraping

Scrapling è una libreria gratuita e open source che esegui e mantieni tu. Ti tieni il codice, la catena di dipendenze e il tuning — e in cambio non paghi nulla per richiesta e tieni tutto in casa. È una scelta reale e difendibile, e per molti team è quella giusta.

La domanda vera è: chi si prende in carico il problema della resilienza? La risposta di Scrapling è che te ne occupi tu: salvi l’impronta degli elementi e regoli il tracking. Un’API AI gestita per lo scraping risponde in modo diverso — la gestione del drift passa al server. È questo lo spazio che occupa lo stack developer di Thunderbit per i team tecnici. POST /extract restituisce JSON strutturato in base a uno schema JSON definito da te, assorbendo lato server rendering, anti-bot e drift del markup; un flag renderMode controlla quanta parte della pagina viene eseguita prima dell’estrazione. Per agenti AI e coding assistant c’è un server Thunderbit MCP — thunderbit_suggest_fields è gratuito e viene eseguito per primo per pianificare un’estrazione — e c’è anche una CLI via npx @thunderbit/thunderbit-cli per terminale, script e CI. Stesso motore AI dietro tutte e tre le interfacce.

Il vero trade-off non è meglio o peggio — è dove vuoi far vivere la logica di resilienza. Con Scrapling la tieni nel tuo codice, con impronte e tuning fatti da te, senza costi per chiamata, accettando però la manutenzione che ne deriva. Con un’API gestita deleghi la gestione del drift e paghi per richiesta. Piccolo, self-hosted, e ti piace controllare tu il tuning? Il controllo di Scrapling è la risposta giusta. Devi scalare su cento siti e preferisci non rincorrere le impronte dei selettori su ognuno? La soluzione gestita elimina quella categoria di manutenzione.

Se stai confrontando il panorama, il benchmark open source completo degli scraper mette Scrapling fianco a fianco con altri strumenti sugli stessi fixture, mentre la recensione di Scrapy e la recensione di Colly coprono altri due framework HTTP-first che vale la pena guardare.

Verdetto

Vale la pena usare Scrapling? Sì — se vuoi un estrattore Python open source il cui trucco principale è continuare a trovare un elemento tracciato anche quando il markup sotto di lui cambia, e hai ben chiara la forma di quel trucco. Ha recuperato un elemento che un selettore rotto non riusciva più a trovare, dopo una rinomina che avrebbe fatto perdere dati in silenzio a uno scraper normale. L’estrazione HTTP semplice è pulita e ha raggiunto il recall pieno su ogni fixture. La licenza è permissiva e la versione che ho testato era aggiornata.

Basta dimensionare bene la promessa e ne sarai soddisfatto. Traccia elementi, non ricostruisce automaticamente le pagine — il test con tre elementi ne ha recuperato uno. Installa l’extra [fetchers] fin dall’inizio, altrimenti ti schianti contro il muro delle dipendenze come è successo a me. E se le tue pagine richiedono JavaScript, quello è compito del fetcher basato su browser, non dell’HTTP. Dentro questi confini, Scrapling fa esattamente la cosa per cui è noto, e tra le librerie Python per scraping è quella che davvero include la funzione che tutti continuano ad attribuire ad altri.

Prova Thunderbit per l’estrazione di dati web Get Started Free

FAQ

I selettori adattivi di Scrapling sopravvivono davvero a un redesign del sito? Sì, sopravvivono al rename di una classe per un elemento tracciato — verificato nel test. Dopo aver rinominato product-name in product-title, un selettore normale ha restituito 0, mentre il re-match adattivo ha recuperato l’elemento tracciato. Ma traccia elementi salvati, non ricostruisce un’intera pagina: in un test sintetico con tre elementi ne ha recuperato uno. Consideralo quindi un tracking resiliente degli elementi, non un recupero automatico dell’intera pagina.

Perché pip install scrapling fallisce quando importo un fetcher? Perché l’installazione base include solo il parser. L’import di scrapling.fetchers innesca una catena di dipendenze mancanti — curl_cffi, poi playwright, poi browserforge. Esegui pip install "scrapling[fetchers]" (oppure il comando CLI scrapling install) per scaricare l’intero stack dei fetcher, e l’import funzionerà.

Scrapling può fare scraping di pagine renderizzate con JavaScript? Non con il Fetcher HTTP — ha restituito 0 sia sulla fixture JS sia sulla pagina pubblica Quotes JS, perché scarica HTML senza eseguire un browser. Scrapling fornisce un DynamicFetcher separato, basato su browser, per le pagine JS, che questo test non ha coperto, quindi non posso ancora valutarne le prestazioni.

Scrapling è veloce e accurato per l’estrazione normale? Nei test è stato accurato — recall 1.0 su cataloghi statici, pagine articolo e API JSON, con CSS/XPath puliti basati su lxml. Ha anche gestito un HTTP 500 esponendo lo status invece di andare in crash. Se non usi mai il livello adattivo, resta comunque un estrattore leggero e solido per contenuti statici.

Scrapling è gratuito per uso commerciale? Sì, ha licenza BSD-3-Clause, quindi permissiva e adatta anche al commerciale. Come sempre, verifica la licenza aggiornata nel repo prima di costruirci sopra.

Ke
Ke
CTO di Thunderbit | Senior Data Scientist ed esperto di ML Con quasi un decennio di esperienza nel machine learning e nella data science, Ke Shen è un ex studente della Columbia University ed ex Senior Data Scientist presso Walmart Labs. Grazie a una profonda competenza, riconosciuta dai suoi pari, in Python, R, Java e statistica, condivide insight collaudati sul passaggio di algoritmi AI complessi dalla teoria a un'architettura pronta per la produzione.
Indice
Thunderbit · Agente AI per dati web

Estrai dati da qualsiasi pagina in 1 clic

Scelto da oltre 250.000 utenti
piano gratuito disponibile
Estrai dati usando l'AI
Trasferisci facilmente i dati su Fogli Google, Airtable o Notion
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week