In un altro articolo abbiamo analizzato in quale linguaggio scrivere uno scraper e abbiamo confrontato i linguaggi tra loro. Qui scendiamo al livello di dettaglio successivo: un catalogo di librerie concrete. Se il linguaggio è già stato scelto, resta solo da individuare gli strumenti, ed ecco la loro panoramica: organizzata per linguaggio e per ruolo, con i link ai siti ufficiali.
Quattro ruoli delle librerie
Prima di elencare i singoli pacchetti, è importante capire che quasi ogni scraper si costruisce con strumenti di quattro tipi. Spesso una libreria non si usa da sola, ma in combinazione: ad esempio, il client HTTP scarica l’HTML e il parser lo analizza.
- Client HTTP. Inviano le richieste e ricevono la risposta (HTML, JSON). Veloci e leggeri, ma non eseguono JavaScript: vedono solo ciò che il server restituisce. Adatti alle pagine statiche e alle chiamate dirette all’API del sito.
- Parser HTML/XML. Trasformano la stringa HTML in un albero nel quale cercare i dati con selettori CSS o XPath. Da soli non scaricano nulla: ricevono in input un HTML già pronto.
- Automazione del browser (headless). Avviano un browser vero (di solito Chromium), eseguono JavaScript, sanno cliccare, scorrere la pagina, compilare moduli e attendere la comparsa degli elementi. Indispensabili per le SPA e i contenuti dinamici, ma pesanti in termini di risorse.
- Framework completi. Si fanno carico dell’intera pipeline: coda delle richieste, concorrenza, retry, elaborazione e salvataggio dei dati (pipeline). Pensati per attività su larga scala e ricorrenti, dove non conta una singola pagina, ma migliaia.
Di seguito, le librerie per linguaggio, raggruppate al loro interno secondo questi ruoli.
Python
Client HTTP: requests: il classico, sincrono e semplice; httpx: il sostituto moderno con supporto per async e HTTP/2; aiohttp: client asincrono per carichi elevati; curl_cffi: imita l’impronta TLS di un Chrome reale e aiuta a superare la protezione anti-bot di base senza browser.
Parser: BeautifulSoup: il più amichevole per chi inizia; lxml: veloce, scritto in C, con supporto XPath; parsel: il motore di selettori dell’ecosistema di Scrapy; selectolax: il più rapido sui grandi volumi; pyquery: sintassi in stile jQuery.
Automazione del browser: Playwright: la scelta moderna di default (async, attese automatiche); Selenium: il veterano, con una community enorme; SeleniumBase: uno strato sopra Selenium con modalità di mascheramento; nodriver: strumento stealth dell’autore di undetected-chromedriver (quest’ultimo è ormai in gran parte superato e fa più fatica ad aggirare le protezioni moderne).
Framework: Scrapy: lo standard maturo per il crawling su larga scala con pipeline; Crawlee for Python: un ibrido che alterna HTTP e browser; MechanicalSoup: gestione leggera di moduli e sessioni; Scrapling: un nuovo scraper adattivo, resistente ai cambi di layout.
JavaScript / Node.js
Client HTTP: il fetch nativo; axios: il client più popolare, con un’API comoda; got: leggero e veloce; undici: client ad alte prestazioni del team di Node.js.
Parser: cheerio: analisi rapida dell’HTML statico in stile jQuery; jsdom: emulazione completa del DOM (più pesante di cheerio); parse5 e htmlparser2: parser di basso livello su cui sono costruiti altri strumenti.
Automazione del browser: Puppeteer: controllo di Chrome/Chromium; Playwright: lo stesso, con supporto multi-browser e un’API pulita; puppeteer-extra: plugin, incluso stealth per il mascheramento.
Framework: Crawlee: il potente framework di Apify, con code, proxy e passaggio automatico HTTP/browser; node-crawler: un crawler classico con pool di richieste.
PHP
Client HTTP: Guzzle: lo standard de facto, compatibile PSR; Symfony HttpClient: client moderno dell’ecosistema Symfony; il cURL nativo.
Parser: Symfony DomCrawler: analisi con selettori CSS e XPath; DiDOM: veloce e semplice; Simple HTML DOM: la soglia d’ingresso più bassa, digerisce l’HTML «rotto».
Navigazione e browser: Symfony BrowserKit (classe HttpBrowser): emulazione del browser in puro PHP: segue i link e invia i moduli, ma non esegue JS (qui è confluito anche il vecchio Goutte); Symfony Panther e php-webdriver: controllo di un Chrome/Firefox reale per i contenuti dinamici; chrome-php: controllo diretto di Chrome.
Framework: Roach PHP: un equivalente completo di Scrapy per PHP, con pipeline e middleware; crwlr: framework fatto di «passi»-blocchi pronti da combinare in crawler.
Go (Golang)
Client HTTP: net/http: la potente libreria standard; resty: un wrapper comodo con un’API essenziale.
Parser: goquery: analisi in stile jQuery (selettori CSS); htmlquery: selezione tramite XPath.
Automazione del browser: chromedp: lo standard del settore, controllo di Chrome via DevTools Protocol; Rod: un’alternativa moderna con un’API comoda; playwright-go: il port di Playwright.
Framework: Colly: framework veloce e concorrente per i contenuti statici; Geziyor: framework con supporto per il rendering JS; Ferret: estrazione di dati tramite un linguaggio di query dichiarativo proprio.
C / C++
In questa nicchia non ci sono quasi framework di alto livello: la coppia «client HTTP + parser» si assembla a mano, in cerca della massima velocità e del minimo consumo di memoria.
Client HTTP: libcurl: la libreria fondamentale su cui poggiano i client della maggior parte dei linguaggi; CPR: un wrapper C++ moderno sopra libcurl, in stile requests di Python.
Parser: libxml2: parser maturo di HTML/XML; Gumbo: parser HTML5 di Google; lexbor: un motore HTML/CSS moderno e veloce; pugixml: parser XML leggero per sitemap e RSS.
L’esecuzione di JavaScript non c’è di serie: quando serve, si integra un motore browser embedded o un headless esterno.
C# / .NET
Client HTTP: HttpClient: il client di serie di .NET; RestSharp: un wrapper comodo per le richieste REST.
Parser: HtmlAgilityPack: il più popolare, tollera l’HTML «rotto» e supporta XPath; AngleSharp: conforme agli standard W3C, con querySelector come nel browser; Fizzler: motore di selettori CSS sopra HtmlAgilityPack.
Automazione del browser: PuppeteerSharp: il port di Puppeteer; Playwright for .NET: il port ufficiale di Playwright; Selenium WebDriver.
Framework: DotnetSpider: framework sulla scia di Scrapy; Abot: un crawler configurabile.
Java
Client HTTP: Apache HttpClient: lo standard maturo; OkHttp: un client moderno e veloce.
Parser: Jsoup: lo strumento principale per analizzare l’HTML in Java, con selettori CSS molto comodi.
Automazione del browser: HtmlUnit: browser headless scritto in Java puro, con supporto parziale di JS; Selenium e Playwright for Java: controllo di un browser reale.
Framework: WebMagic: framework in stile Scrapy; Crawler4j: un crawler semplice e veloce.
Ruby
Client HTTP: Faraday: client flessibile con middleware; HTTParty: essenziale e semplice.
Parser: Nokogiri: lo standard per l’analisi di HTML/XML in Ruby (CSS e XPath).
Automazione del browser: Ferrum: controllo di Chrome via CDP; Watir e Selenium: browser reale.
Navigazione e framework: Mechanize: segue i link e lavora con i moduli (senza JS); Kimurai: framework sulla scia di Scrapy, con supporto per i motori headless.
Rust
Client HTTP: reqwest: il principale client async; ureq: sincrono e semplice.
Parser: scraper: selettori CSS, nello spirito di BeautifulSoup/Cheerio; select: un parser di selettori alternativo.
Automazione del browser: fantoccini e thirtyfour: controllo del browser via WebDriver; headless_chrome e chromiumoxide: lavoro con Chrome via DevTools Protocol.
Framework: spider: un crawler concorrente ad alte prestazioni.
Tabella comparativa delle librerie
| Libreria | Linguaggio | Tipo | Esegue JS | Async / concorrenza | Cosa la distingue |
|---|---|---|---|---|---|
| requests | Python | Client HTTP | No | No | L’emblema della semplicità |
| httpx | Python | Client HTTP | No | Sì | Async + HTTP/2 |
| curl_cffi | Python | Client HTTP | No | Sì | Spoofing dell’impronta TLS |
| BeautifulSoup | Python | Parser | No | No | Soglia d’ingresso bassa |
| selectolax | Python | Parser | No | No | Il più veloce sui grandi volumi |
| Playwright | Python | Browser | Sì | Sì | Attese automatiche, multi-browser |
| Selenium | vari linguaggi | Browser | Sì | Parziale | Veterano, community enorme |
| Scrapy | Python | Framework | No* | Sì | Lo standard del crawling su larga scala |
| cheerio | JS / Node | Parser | No | No | Analisi jQuery rapida dello statico |
| Puppeteer | JS / Node | Browser | Sì | Sì | Controllo nativo di Chrome |
| Playwright | JS / Node | Browser | Sì | Sì | Multi-browser, API pulita |
| Crawlee | JS / Node | Framework | Sì | Sì | Passaggio automatico HTTP/browser |
| Guzzle | PHP | Client HTTP | No | Sì | Standard de facto in PHP |
| Symfony DomCrawler | PHP | Parser | No | — | Selettori CSS e XPath |
| Symfony Panther | PHP | Browser | Sì | No | Browser reale per PHP |
| Roach PHP | PHP | Framework | No* | Sì | L’equivalente di Scrapy per PHP |
| Colly | Go | Framework | No | Sì | Crawling concorrente veloce |
| goquery | Go | Parser | — | — | Sintassi jQuery |
| chromedp | Go | Browser | Sì | Sì | Lo standard per il dinamico in Go |
| Rod | Go | Browser | Sì | Sì | API moderna |
| libcurl | C / C++ | Client HTTP | No | Sì | Il fondamento di tutti i linguaggi |
| lexbor | C / C++ | Parser | — | — | Motore HTML/CSS veloce |
| HtmlAgilityPack | C# | Parser | — | — | Tollera l’HTML «rotto» |
| AngleSharp | C# | Parser | — | — | Conforme al W3C, querySelector |
| PuppeteerSharp | C# | Browser | Sì | Sì | Puppeteer per .NET |
| Jsoup | Java | Parser | — | — | Il parser principale in Java |
| HtmlUnit | Java | Browser | Parziale | Sì | Browser headless in puro Java |
| WebMagic | Java | Framework | No | Sì | In stile Scrapy per Java |
| Nokogiri | Ruby | Parser | — | — | Lo standard del parsing in Ruby |
| Ferrum | Ruby | Browser | Sì | Sì | Controllo di Chrome via CDP |
| Kimurai | Ruby | Framework | Sì | Sì | In stile Scrapy per Ruby |
| reqwest | Rust | Client HTTP | No | Sì | Il principale client async |
| scraper | Rust | Parser | — | — | Selettori CSS |
| thirtyfour | Rust | Browser | Sì | Sì | Controllo via WebDriver |
| spider | Rust | Framework | Sì | Sì | Prestazioni elevate |
* I framework Scrapy e Roach PHP, da soli, lavorano unicamente con l’HTML statico, ma il rendering JS si collega come plugin (Scrapy tramite scrapy-playwright; Roach tramite Browsershot). Il segno «—» in una colonna significa che il criterio non si applica a quel tipo di librerie.
Come assemblare uno stack funzionante
La logica in breve per scegliere gli strumenti in base al compito:
- Pagina statica o richiesta diretta all’API: bastano un client HTTP e un parser: ad esempio requests + BeautifulSoup, Guzzle + DomCrawler, net/http + goquery.
- Il contenuto si carica via JavaScript, servono clic e scroll: punta sull’automazione del browser: Playwright, Puppeteer, chromedp.
- Migliaia di pagine, esecuzione regolare, elaborazione e archiviazione dei dati: serve un framework: Scrapy, Crawlee, Colly, Roach PHP.
- Il sito blocca attivamente i bot: aggiungi un livello a parte: spoofing dell’impronta TLS (curl_cffi), modalità stealth (nodriver, puppeteer-extra), proxy. Funziona sopra qualsiasi libreria vista qui e non dipende dal linguaggio scelto.
Nei prossimi articoli analizzeremo le singole librerie con esempi pratici: raccolta dei dati, paginazione e gestione dei blocchi.