Guida generale al web scraping 11 min di lettura

Librerie per il web scraping

Catalogo di librerie per lo scraping in Python, JavaScript, PHP, Java, C# e Go: cosa scegliere per pagine statiche, contenuti dinamici e API.

TW
Team Web-Scraping.it
Raccolta dati per le esigenze del business
Pubblicato il 31 gennaio 2025

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 Async + HTTP/2
curl_cffi Python Client HTTP No 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 Attese automatiche, multi-browser
Selenium vari linguaggi Browser Parziale Veterano, community enorme
Scrapy Python Framework No* Lo standard del crawling su larga scala
cheerio JS / Node Parser No No Analisi jQuery rapida dello statico
Puppeteer JS / Node Browser Controllo nativo di Chrome
Playwright JS / Node Browser Multi-browser, API pulita
Crawlee JS / Node Framework Passaggio automatico HTTP/browser
Guzzle PHP Client HTTP No Standard de facto in PHP
Symfony DomCrawler PHP Parser No Selettori CSS e XPath
Symfony Panther PHP Browser No Browser reale per PHP
Roach PHP PHP Framework No* L’equivalente di Scrapy per PHP
Colly Go Framework No Crawling concorrente veloce
goquery Go Parser Sintassi jQuery
chromedp Go Browser Lo standard per il dinamico in Go
Rod Go Browser API moderna
libcurl C / C++ Client HTTP No 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 Puppeteer per .NET
Jsoup Java Parser Il parser principale in Java
HtmlUnit Java Browser Parziale Browser headless in puro Java
WebMagic Java Framework No In stile Scrapy per Java
Nokogiri Ruby Parser Lo standard del parsing in Ruby
Ferrum Ruby Browser Controllo di Chrome via CDP
Kimurai Ruby Framework In stile Scrapy per Ruby
reqwest Rust Client HTTP No Il principale client async
scraper Rust Parser Selettori CSS
thirtyfour Rust Browser Controllo via WebDriver
spider Rust Framework 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.