Unter Web Scraping versteht man das automatische Extrahieren von Daten von Websites. Es handelt sich um eine leistungsstarke Technik, die für alles von der Preisüberwachung und Lead-Generierung bis hin zur Marktforschung und Wettbewerbsanalyse eingesetzt wird. Beim Web Scraping mit Node.js stechen zwei Bibliotheken hervor: Cheerio und Puppeteer.
Mit beiden Tools können Sie zwar Daten aus Webseiten extrahieren, sie funktionieren jedoch auf grundlegend unterschiedliche Weise. Cheerio ist eine serverseitige Bibliothek, die HTML analysiert und eine API zum Durchlaufen und Bearbeiten der resultierenden Datenstruktur bereitstellt. Puppeteer hingegen ist eine Headless-Browser-Automatisierungsbibliothek, die es Ihnen ermöglicht, wie ein menschlicher Benutzer mit Webseiten zu interagieren.
Welches sollten Sie also für Ihre Web-Scraping-Anforderungen im Jahr 2024 wählen? In diesem umfassenden Leitfaden lassen wir Cheerio und Puppeteer in einem direkten Kampf gegeneinander antreten und vergleichen deren Leistung, Benutzerfreundlichkeit und Flexibilität. Wir tauchen in Codebeispiele ein, gehen gängige Scraping-Szenarien durch und stellen Benchmarks bereit, die Ihnen helfen, eine fundierte Entscheidung zu treffen.
Cheerio verstehen
Cheerio ist eine serverseitige Bibliothek, mit der Sie HTML analysieren und mit einer jQuery-ähnlichen Syntax bearbeiten können. Es rendert den HTML-Code nicht wirklich und führt kein JavaScript aus – es analysiert lediglich die statische HTML-Zeichenfolge und erstellt eine In-Memory-Datenstruktur, die Sie abfragen und bearbeiten können.
Hier ist ein einfaches Beispiel für die Verwendung von Cheerio zum Ausschneiden der Titel aus einer einfachen HTML-Seite:
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 diesem Beispiel verwenden wir Axios, um den HTML-Inhalt von abzurufenhttps://example.com. Anschließend laden wir den HTML-Code in Cheerio, wodurch wir eine jQuery-ähnliche Schnittstelle zum Abfragen des Dokuments erhalten. Wir finden alles<h2>Elemente mit der Klassetitle, extrahieren Sie ihren Textinhalt und protokollieren Sie das resultierende Array von Titeln.
Hauptmerkmale von Cheerio
- Vertraute Syntax: Wenn Sie jQuery schon einmal verwendet haben, wird sich Cheerio sehr vertraut anfühlen. Es bietet Methoden wie
find(),parent(),siblings()usw. zum Navigieren und Bearbeiten des analysierten HTML-Codes. - Leicht und schnell: Da Cheerio den HTML-Code nicht wirklich rendert oder JavaScript ausführt, ist es im Vergleich zu Tools, die einen echten Browser verwenden, sehr schnell und leichtgewichtig.
- Serverseitiges Parsen: Cheerio läuft vollständig serverseitig und ist daher eine gute Wahl für Projekte, bei denen Sie nicht wie ein menschlicher Benutzer mit der Seite interagieren müssen.
Puppenspieler verstehen
Puppeteer ist eine von Google entwickelte Node.js-Bibliothek, mit der Sie einen Headless-Chrome- oder Chromium-Browser programmgesteuert steuern können. Im Gegensatz zu Cheerio betreibt Puppeteer hinter den Kulissen tatsächlich einen echten Browser, der es Ihnen ermöglicht, mit Webseiten zu interagieren, als wären Sie ein menschlicher Benutzer.
Hier ist ein einfaches Beispiel für die Verwendung von Puppeteer zum Auslesen der Titel einer dynamischen Seite, für deren Darstellung JavaScript erforderlich ist:
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 diesem Beispiel starten wir eine Headless-Browser-Instanz mit Puppeteer und navigieren zuhttps://example.com. Wir verwenden dann dieevaluate()Methode zum Ausführen von JavaScript-Code im Kontext der Seite – in diesem Fall das Finden aller<h2>Elemente mit der Klassetitleund Extrahieren ihres Textinhalts. Abschließend protokollieren wir das resultierende Array von Titeln und schließen den Browser.
Hauptmerkmale von Puppenspieler
- Echte Browserumgebung: Puppeteer führt einen echten Browser aus, mit dem Sie Seiten durchsuchen können, deren Inhalt stark von JavaScript abhängt.
- Interaktivität: Mit Puppeteer können Sie menschliche Interaktionen wie das Klicken auf Schaltflächen, das Ausfüllen von Formularen und das Scrollen simulieren. Dies macht es zu einem leistungsstarken Tool zum Scrapen komplexer, dynamischer Websites.
- Rendering-Steuerung: Puppeteer gibt Ihnen eine detaillierte Kontrolle über den Renderprozess. Sie können warten, bis bestimmte Elemente angezeigt werden, die Größe des Ansichtsfensters festlegen und sogar langsame Netzwerkbedingungen simulieren.
Leistungsvergleich
Um die Leistung von Cheerio und Puppeteer zu vergleichen, betrachten wir ein reales Scraping-Szenario. Angenommen, wir möchten die 100 besten Filme aus der IMDB heraussuchen und ihre Titel, Jahre und Bewertungen extrahieren.
So könnten wir dies mit Cheerio umsetzen:
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();Und hier ist das Äquivalent mit 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();Lassen Sie uns diese Skripte ausführen und ihre Ausführungszeiten vergleichen:
| Bibliothek | Zeit (ms) |
|---|---|
| Cheerio | 1245 |
| Puppenspieler | 4378 |
Wie wir sehen können, ist die Cheerio-Version deutlich schneller und erledigt die Aufgabe in etwas mehr als einer Sekunde, während die Puppeteer-Version mehr als 4 Sekunden benötigt.
Dieser Leistungsunterschied wird noch deutlicher, wenn wir auf größere Scraping-Aufgaben skalieren. Hier ist ein Vergleich von 1000 Filmtiteln aus der IMDB:
| Bibliothek | Zeit (ms) |
|---|---|
| Cheerio | 3589 |
| Puppenspieler | 28643 |
Cheerio kann die Aufgabe in diesem Fall fast achtmal schneller erledigen als Puppeteer.
Es ist jedoch wichtig zu beachten, dass dieser Leistungsvorteil mit einem Kompromiss verbunden ist. Die IMDB-Diagrammseite ist relativ einfach und erfordert zum Scrapen keine Interaktion oder JavaScript-Rendering. Für komplexere, dynamische Seiten kann die Fähigkeit von Puppeteer erforderlich sein, einen echten Browser auszuführen, auch auf Kosten einer langsameren Leistung.
Verwendung von Proxys
Beim Scraping von Websites ist es oft notwendig, Proxys zu verwenden, um eine Blockierung durch den Zielserver zu vermeiden. Ein Proxy fungiert als Vermittler zwischen Ihrem Scraper und der Website und leitet Ihre Anfragen über eine andere IP-Adresse weiter.
Es gibt verschiedene Arten von Proxys, jede mit ihren eigenen Vorteilen und Nachteilen:
- Rechenzentrums-Proxys: Dies sind IP-Adressen, die Servern in Rechenzentren zugewiesen werden. Sie sind schnell und günstig, aber auch leicht erkennbar und werden häufig blockiert.
- Wohn-Proxies: Dabei handelt es sich um IP-Adressen, die realen, physischen Geräten wie Heimcomputern und Smartphones zugewiesen werden. Sie sind als Proxys schwerer zu erkennen, aber auch teurer und langsamer als IPs von Rechenzentren.
- Mobile Proxys: Hierbei handelt es sich um IP-Adressen, die speziell mobilen Geräten in Mobilfunknetzen zugewiesen werden. Sie eignen sich zum Scrapen mobilspezifischer Inhalte und sind nur sehr schwer als Proxys zu erkennen.
Zu den Top-Proxy-Anbietern für Web Scraping (Stand 2024) gehören:
Helle Daten– Bietet das größte Netzwerk von Rechenzentrums-, Privat- und Mobil-IPs. Ihre Wohn-Proxys stammen von echten Benutzern, die sich über ihr SDK anmelden, um eine qualitativ hochwertige und ethische Beschaffung zu gewährleisten.
SOAX– Bietet einen großen Pool an Privat-Proxys, die von echten Mobil- und Desktop-Geräten stammen. Ihr „Scraping Robot“-Dienst bietet eine einfache API für die Verwaltung von Proxys und den Umgang mit CAPTCHAs.
Oxylabs– Bietet eine breite Palette von Rechenzentrums- und Privat-Proxys sowie einen Echtzeit-Crawler zum Scrapen dynamischer Inhalte. Ihre privaten Proxys stammen von einem Netzwerk von Internetdienstanbietern (ISPs).
SmartProxy– Bietet sowohl Rechenzentrums- als auch Privat-Proxys ein benutzerfreundliches Dashboard für die Verwaltung von Zonen und Unterbenutzern. Ihre Chrome-Erweiterung erleichtert das Testen von Proxys beim Surfen.
GeoSurf– Spezialisiert auf private und mobile Proxys für eine Vielzahl von Anwendungsfällen. Ihre „Sticky Ports“-Funktion ermöglicht die Beibehaltung derselben IP für bis zu 30 Minuten, was für Scraping-Sitzungen nützlich ist, die eine Anmeldung erfordern.
Berücksichtigen Sie bei der Auswahl eines Proxy-Anbieters Faktoren wie Netzwerkgröße, Leistung, Anonymität (HTTP vs. SOCKS5), Standortabdeckung und einfache Integration mit Ihrem Scraping-Tool.
So können Sie die Proxys von Bright Data mit Cheerio verwenden:
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‘);Und hier ist das Äquivalent mit 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‘);Gemeinsame Herausforderungen und Lösungen
Während Cheerio und Puppeteer leistungsstarke Tools für das Web-Scraping sind, gibt es einige häufige Herausforderungen, auf die Sie stoßen können. Hier sind einige dieser Herausforderungen und mögliche Lösungen:
IP-Blockierung: Websites blockieren möglicherweise Ihre IP-Adresse, wenn Sie zu schnell zu viele Anfragen stellen. Um dies zu vermeiden, verwenden Sie Proxys, um Ihre IP-Adresse zu rotieren, und fügen Sie Verzögerungen zwischen den Anfragen hinzu, um das Surfverhalten eines Menschen zu simulieren.
CAPTCHAs: Einige Websites verwenden CAPTCHAs, um automatisiertes Scraping zu verhindern. Dienste wie 2captcha und DeathByCaptcha stellen APIs zur programmgesteuerten Lösung von CAPTCHAs bereit. Puppeteer kann auch zum Lösen bestimmter Arten von CAPTCHAs verwendet werden, indem wie ein Mensch mit der Seite interagiert.
Dynamischer Inhalt: Viele moderne Websites verwenden JavaScript, um Inhalte dynamisch zu laden. Cheerio kann diesen Inhalt nicht extrahieren, da es kein JavaScript ausführt. In diesen Fällen ist die Fähigkeit von Puppeteer erforderlich, einen echten Browser auszuführen.
Anmeldung erforderlich: Einige Websites erfordern eine Anmeldung, um auf bestimmte Seiten zugreifen zu können. Bei Cheerio müssen Sie das Anmeldeformular und die Cookies manuell überprüfen, um den Anmeldevorgang zu reproduzieren. Puppeteer kann dies einfacher handhaben, indem er tatsächlich auf das Formular klickt und Anmeldeinformationen eingibt.
Inkonsistente Seitenstruktur: Websites können ihre HTML-Struktur im Laufe der Zeit ändern und Ihren Scraper beschädigen. Um dies zu mildern, versuchen Sie, Elemente basierend auf Attributen auszuwählen, die sich weniger wahrscheinlich ändern (z. B. IDs und Datenattribute anstelle von Klassen oder Tag-Strukturen). Überwachen Sie die Leistung Ihres Scrapers regelmäßig auf Anomalien.
Abschluss
Cheerio und Puppeteer sind beide hervorragende Tools für Web Scraping mit Node.js, glänzen jedoch in unterschiedlichen Szenarien.
Cheerio ist blitzschnell und einfach für einfache Scraping-Aufgaben zu verwenden, bei denen die Daten in der anfänglichen HTML-Nutzlast sofort verfügbar sind. Seine vertraute, jQuery-ähnliche Syntax und serverseitige Ausführung machen es zu einer großartigen Wahl für schnelle und unkomplizierte Scraping-Skripte.
Andererseits ist Puppeteer aufgrund seiner Fähigkeit, einen echten Browser auszuführen und wie ein menschlicher Benutzer mit Seiten zu interagieren, unverzichtbar für das Scraping moderner, JavaScript-lastiger Websites. Puppeteer ist zwar langsamer als Cheerio, aber dank seiner Flexibilität meistert er selbst die komplexesten Scraping-Herausforderungen.
Letztendlich hängt die Wahl zwischen Cheerio und Puppeteer von den spezifischen Anforderungen Ihres Projekts ab. Bei einfachen, statischen Seiten sind Cheerios Geschwindigkeit und Einfachheit kaum zu übertreffen. Aber für dynamische, interaktive Websites ist Puppeteer der klare Gewinner.
Für welches Tool Sie sich auch entscheiden, denken Sie daran, dass Web Scraping ein komplexer und sich ständig weiterentwickelnder Bereich ist. Da Websites bei ihren Versuchen, Scraper zu blockieren, immer ausgefeilter werden, ist es wichtig, Ihre Techniken kontinuierlich anzupassen. Die Verwendung von Proxys, die Einführung von Zufälligkeiten in Ihre Anforderungsmuster und die Überwachung Ihrer Scraper auf Anomalien sind alles wesentliche Vorgehensweisen.
Mit den richtigen Tools und Techniken bleibt Web Scraping jedoch eine leistungsstarke Möglichkeit, Daten aus den riesigen Informationsbeständen im Web zu sammeln. Egal, ob Sie ein Unternehmen sind, das sich einen Wettbewerbsvorteil verschaffen möchte, ein Forscher, der Daten zur Analyse sammeln möchte, oder ein Entwickler, der die nächste großartige App entwickelt, Cheerio und Puppeteer sind unschätzbare Ergänzungen für Ihr Toolkit.













