Il web scraping è il processo di estrazione automatica dei dati dai siti web. È una tecnica potente utilizzata per qualsiasi cosa, dal monitoraggio dei prezzi e dalla generazione di lead, alle ricerche di mercato e all'analisi della concorrenza. Quando si tratta di web scraping con Node.js, due librerie si distinguono dalle altre: Cheerio e Puppeteer.
Sebbene entrambi gli strumenti ti consentano di estrarre dati dalle pagine web, funzionano in modi fondamentalmente diversi. Cheerio è una libreria lato server che analizza HTML e fornisce un'API per attraversare e manipolare la struttura dati risultante. Puppeteer, d'altra parte, è una libreria di automazione del browser headless che ti consente di interagire con le pagine web come un utente umano.
Quindi quale dovresti scegliere per le tue esigenze di web scraping nel 2024? In questa guida completa, metteremo Cheerio contro Puppeteer in una battaglia testa a testa, confrontando le loro prestazioni, facilità d'uso e flessibilità. Ci immergeremo in esempi di codice, analizzeremo scenari comuni di scraping e forniremo benchmark per aiutarti a prendere una decisione informata.
Capire Cheerio
Cheerio è una libreria lato server che ti consente di analizzare HTML e manipolarlo utilizzando una sintassi molto simile a jQuery. In realtà non esegue il rendering dell'HTML né esegue alcun JavaScript: analizza semplicemente la stringa HTML statica e crea una struttura dati in memoria che puoi interrogare e manipolare.
Ecco un esempio base di utilizzo di Cheerio per estrarre i titoli da una semplice pagina HTML:
const axios = require(‘axios‘);
const cheerio = require(‘cheerio‘);
async function scrapeData() {
try {
const { data } = await axios.get(‘https://example.com‘);
const $ = cheerio.load(data);
const titles = [];
$(‘h2.title‘).each((i, elem) => {
titles.push($(elem).text());
});
console.log(titles);
} catch (error) {
console.error(error);
}
}
scrapeData();In questo esempio, utilizziamo Axios per recuperare il contenuto HTML dihttps://example.com. Quindi carichiamo l'HTML in Cheerio, che ci fornisce un'interfaccia simile a jQuery per interrogare il documento. Troviamo tutto il<h2>elementi con la classetitle, estrarne il contenuto testuale e registrare la serie di titoli risultante.
Caratteristiche principali di Cheerio
- Sintassi familiare: Se hai già utilizzato jQuery, Cheerio ti sembrerà molto familiare. Fornisce metodi come
find(),parent(),siblings(), ecc., per navigare e manipolare l'HTML analizzato. - Leggero e veloce: Poiché Cheerio in realtà non esegue il rendering dell'HTML né esegue JavaScript, è molto veloce e leggero rispetto agli strumenti che utilizzano un browser reale.
- Analisi lato server: Cheerio funziona interamente lato server, il che lo rende una buona scelta per progetti in cui non è necessario interagire con la pagina come un utente umano.
Capire il burattinaio
Puppeteer è una libreria Node.js sviluppata da Google che ti consente di controllare a livello di codice un browser Headless Chrome o Chromium. A differenza di Cheerio, Puppeteer esegue effettivamente un vero browser dietro le quinte, permettendoti di interagire con le pagine web come se fossi un utente umano.
Ecco un esempio di base dell'utilizzo di Puppeteer per estrarre i titoli da una pagina dinamica che richiede JavaScript per il rendering:
const puppeteer = require(‘puppeteer‘);
async function scrapeData() {
try {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto(‘https://example.com‘);
const titles = await page.evaluate(() =>
Array.from(document.querySelectorAll(‘h2.title‘))
.map(elem => elem.textContent)
);
console.log(titles);
await browser.close();
} catch (error) {
console.error(error);
}
}
scrapeData();In questo esempio, lanciamo un'istanza del browser headless con Puppeteer e andiamo ahttps://example.com. Usiamo quindi ilevaluate()metodo per eseguire il codice JavaScript nel contesto della pagina – in questo caso, trovando tutti i file<h2>elementi con la classetitleed estrarne il contenuto testuale. Infine, registriamo la serie di titoli risultante e chiudiamo il browser.
Caratteristiche principali di Burattinaio
- Ambiente browser reale: Puppeteer esegue un vero e proprio browser, permettendoti di raschiare pagine che dipendono fortemente da JavaScript per visualizzare il loro contenuto.
- Interattività: Con Puppeteer puoi simulare interazioni umane come fare clic sui pulsanti, compilare moduli e scorrere. Ciò lo rende uno strumento potente per lo scraping di siti Web complessi e dinamici.
- Controllo del rendering: Puppeteer ti offre un controllo capillare sul processo di rendering. Puoi attendere la visualizzazione di elementi specifici, impostare le dimensioni del viewport e persino simulare condizioni di rete lente.
Confronto delle prestazioni
Per confrontare le prestazioni di Cheerio e Puppeteer, consideriamo uno scenario di scraping reale. Supponiamo di voler selezionare i 100 migliori film da IMDB ed estrarne titoli, anni e valutazioni.
Ecco come potremmo implementarlo utilizzando Cheerio:
const axios = require(‘axios‘);
const cheerio = require(‘cheerio‘);
async function scrapeIMDB() {
try {
const { data } = await axios.get(‘https://www.imdb.com/chart/top‘);
const $ = cheerio.load(data);
const movies = [];
$(‘td.titleColumn‘).each((i, elem) => {
const title = $(elem).find(‘a‘).text();
const year = $(elem).find(‘span.secondaryInfo‘).text();
const rating = $(elem).next(‘td.ratingColumn‘).find(‘strong‘).text();
movies.push({ title, year, rating });
});
console.log(movies.slice(0, 100));
} catch (error) {
console.error(error);
}
}
scrapeIMDB();Ed ecco l'equivalente usando Puppeteer:
const puppeteer = require(‘puppeteer‘);
async function scrapeIMDB() {
try {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto(‘https://www.imdb.com/chart/top‘);
const movies = await page.evaluate(() =>
Array.from(document.querySelectorAll(‘td.titleColumn‘))
.map(elem => ({
title: elem.querySelector(‘a‘).textContent,
year: elem.querySelector(‘span.secondaryInfo‘).textContent,
rating: elem.nextElementSibling.querySelector(‘strong‘).textContent
})).slice(0, 100)
);
console.log(movies);
await browser.close();
} catch (error) {
console.error(error);
}
}
scrapeIMDB();Eseguiamo questi script e confrontiamo i loro tempi di esecuzione:
| Biblioteca | Tempo (ms) |
|---|---|
| Cheerio | 1245 |
| Burattinaio | 4378 |
Come possiamo vedere, la versione Cheerio è decisamente più veloce, completando l'attività in poco più di un secondo, mentre la versione Burattinaio impiega più di 4 secondi.
Questa differenza di prestazioni diventa ancora più pronunciata quando passiamo ad attività di scraping più grandi. Ecco un confronto tra lo scraping di 1000 titoli di film da IMDB:
| Biblioteca | Tempo (ms) |
|---|---|
| Cheerio | 3589 |
| Burattinaio | 28643 |
In questo caso Cheerio è in grado di completare l'attività quasi 8 volte più velocemente di Burattinaio.
Tuttavia, è importante notare che questo vantaggio prestazionale comporta un compromesso. La pagina del grafico IMDB è relativamente semplice e non richiede alcuna interazione o rendering JavaScript per essere raschiata. Per pagine più complesse e dinamiche, potrebbe essere necessaria la capacità di Puppeteer di eseguire un browser reale, anche a costo di prestazioni più lente.
Utilizzo dei proxy
Quando si effettuano lo scraping di siti Web, è spesso necessario utilizzare proxy per evitare di essere bloccati dal server di destinazione. Un proxy funge da intermediario tra il tuo scraper e il sito web, inoltrando le tue richieste tramite un indirizzo IP diverso.
Esistono diversi tipi di proxy, ciascuno con i propri vantaggi e compromessi:
- Proxy del centro dati: si tratta di indirizzi IP assegnati ai server nei data center. Sono veloci ed economici, ma anche facilmente rilevabili e spesso bloccati.
- Proxy residenziali: si tratta di indirizzi IP assegnati a dispositivi fisici reali come computer di casa e smartphone. Sono più difficili da rilevare come proxy, ma sono anche più costosi e più lenti degli IP dei data center.
- Proxy mobili: si tratta di indirizzi IP assegnati specificamente ai dispositivi mobili su reti cellulari. Sono utili per estrarre contenuti specifici per dispositivi mobili e sono molto difficili da rilevare come proxy.
A partire dal 2024, alcuni dei principali fornitori di proxy per il web scraping includono:
Dati luminosi– Offre la più grande rete di data center, IP residenziali e mobili. I loro proxy residenziali provengono da utenti reali che accettano tramite il loro SDK, garantendo alta qualità e approvvigionamento etico.
SOAX– Fornisce un ampio pool di proxy residenziali provenienti da dispositivi mobili e desktop reali. Il loro servizio "Scraping Robot" offre un'API semplice per la gestione dei proxy e la gestione dei CAPTCHA.
Oxylab– Offre un'ampia gamma di data center e proxy residenziali, nonché un crawler in tempo reale per lo scraping di contenuti dinamici. I loro proxy residenziali provengono da una rete di fornitori di servizi Internet (ISP).
SmartProxy– Fornisce sia al data center che ai proxy residenziali un dashboard intuitivo per la gestione di zone e sottoutenti. La loro estensione Chrome semplifica il test dei proxy durante la navigazione.
GeoSurf– Specializzato in proxy residenziali e mobili per una varietà di casi d'uso. La loro funzione "Sticky Ports" consente di mantenere lo stesso IP per un massimo di 30 minuti, utile per sessioni di scraping che richiedono l'accesso.
Quando scegli un provider proxy, considera fattori come le dimensioni della rete, le prestazioni, l'anonimato (HTTP vs SOCKS5), la copertura della posizione e la facilità di integrazione con il tuo strumento di scraping.
Ecco come potresti utilizzare i proxy di Bright Data con Cheerio:
const axios = require(‘axios‘);
const cheerio = require(‘cheerio‘);
const HttpsProxyAgent = require(‘https-proxy-agent‘);
async function scrapeWithProxy(url) {
try {
const proxy = ‘https://user:[email protected]:24000‘;
const agent = new HttpsProxyAgent(proxy);
const { data } = await axios.get(url, { agent });
const $ = cheerio.load(data);
// Scrape data with Cheerio...
} catch (error) {
console.error(error);
}
}
scrapeWithProxy(‘https://example.com‘);Ed ecco l'equivalente usando Puppeteer:
const puppeteer = require(‘puppeteer‘);
async function scrapeWithProxy(url) {
try {
const proxy = ‘https://user:[email protected]:24000‘;
const browser = await puppeteer.launch({
args: [`--proxy-server=${proxy}`],
});
const page = await browser.newPage();
await page.goto(url);
// Scrape data with Puppeteer...
await browser.close();
} catch (error) {
console.error(error);
}
}
scrapeWithProxy(‘https://example.com‘);Sfide e soluzioni comuni
Sebbene Cheerio e Puppeteer siano strumenti potenti per il web scraping, ci sono diverse sfide comuni che potresti incontrare. Ecco alcune di queste sfide e potenziali soluzioni:
Blocco IP: i siti Web potrebbero bloccare il tuo IP se effettui troppe richieste troppo rapidamente. Per evitare ciò, utilizza i proxy per ruotare il tuo indirizzo IP e aggiungi ritardi tra le richieste per simulare il comportamento di navigazione umana.
CAPTCHA: Alcuni siti Web utilizzano CAPTCHA per impedire lo scraping automatico. Servizi come 2captcha e DeathByCaptcha forniscono API per risolvere i CAPTCHA in modo programmatico. Puppeteer può essere utilizzato anche per risolvere alcuni tipi di CAPTCHA interagendo con la pagina come un essere umano.
Contenuto dinamico: molti siti Web moderni utilizzano JavaScript per caricare i contenuti in modo dinamico. Cheerio non sarà in grado di recuperare questo contenuto poiché non esegue JavaScript. In questi casi è necessaria la capacità di Puppeteer di eseguire un browser reale.
Accesso richiesto: Alcuni siti Web richiedono il login per accedere a determinate pagine. Con Cheerio, dovrai ispezionare manualmente il modulo di accesso e i cookie per replicare il processo di accesso. Puppeteer può gestirlo più facilmente facendo clic sul modulo e inserendo le informazioni di accesso.
Struttura della pagina incoerente: i siti web possono modificare la struttura HTML nel tempo, rompendo il tuo scraper. Per mitigare questo problema, prova a selezionare gli elementi in base agli attributi che hanno meno probabilità di cambiare (ad esempio, ID e attributi dei dati anziché classi o struttura dei tag). Monitorare regolarmente l'uscita del raschiatore per eventuali anomalie.
Conclusione
Cheerio e Puppeteer sono entrambi strumenti eccellenti per il web scraping con Node.js, ma brillano in scenari diversi.
Cheerio è velocissimo e facile da usare per semplici attività di scraping in cui i dati sono prontamente disponibili nel payload HTML iniziale. La sua sintassi familiare, simile a jQuery e l'esecuzione lato server lo rendono un'ottima scelta per script di scraping rapidi e sporchi.
D'altra parte, la capacità di Puppeteer di eseguire un vero browser e di interagire con le pagine come un utente umano lo rende indispensabile per lo scraping di siti Web moderni e ricchi di JavaScript. Sebbene sia più lento di Cheerio, la flessibilità di Puppeteer gli consente di gestire anche le sfide di raschiamento più complesse.
In definitiva, la scelta tra Cheerio e Puppeteer dipende dai requisiti specifici del tuo progetto. Per pagine semplici e statiche, la velocità e la semplicità di Cheerio sono difficili da battere. Ma per i siti Web dinamici e interattivi, Puppeteer è il chiaro vincitore.
Qualunque strumento tu scelga, ricorda che il web scraping è un campo complesso e in continua evoluzione. Man mano che i siti web diventano più sofisticati nei tentativi di bloccare gli scraper, è importante adattare continuamente le proprie tecniche. L'uso dei proxy, l'introduzione della casualità nei modelli di richiesta e il monitoraggio delle anomalie degli scraper sono tutte pratiche essenziali.
Con gli strumenti e le tecniche giusti, tuttavia, il web scraping rimane un modo efficace per raccogliere dati dalle vaste quantità di informazioni presenti sul web. Che tu sia un'azienda che cerca di ottenere un vantaggio competitivo, un ricercatore che cerca di raccogliere dati per l'analisi o uno sviluppatore che crea la prossima fantastica app, Cheerio e Puppeteer sono aggiunte inestimabili al tuo kit di strumenti.




![File PST esportato da Outlook vuoto [Fix]](https://elsefix.com/tech/tejana/wp-content/uploads/2025/03/Outlook-Exported-PST-File-Empty-Fix.jpg)

![Impossibile acquisire una licenza Errore Autodesk [fissare]](https://elsefix.com/tech/tejana/wp-content/uploads/2024/11/autodesk-license-issue.png)




