Cheerio vs. Puppeteer für Web Scraping

Ein Blick auf die Unterschiede zwischen Puppeteer und Cheerio, indem wir einen Web Scraper mit beiden erstellen.
9 min read
Cheerio vs. Puppeteer featured image

Bei der Auswahl eines Node.js-Web-Scraping-Tools gibt es mehrere Optionen. Zwei der häufigsten sind Cheerio und Puppeteer.

Cheerio wurde zuerst als eine leistungsfähigere Version von jQuery erstellt, um HTML-Dokumente zu analysieren und zu bearbeiten. Im Vergleich dazu wurde Puppeteer für die Automatisierung von Tests für Webseiten und Anwendungen entwickelt.

Unabhängig davon können beide Tools beim Web Scraping nützlich sein: Mit Cheerio können Sie den HTML-Code einer Webseite analysieren, um die benötigten Informationen zu finden, und mit Puppeteer können Sie einen Webbrowser automatisieren, um dynamische Websites, die JavaScript verwenden, zu scrapen.

Dieser Artikel befasst sich mit diesen beiden Tools und vergleicht sie im Hinblick auf ihre Funktionalität, Leistung und Benutzerfreundlichkeit.

Cheerio vs. Puppeteer

Cheerio und Puppeteer haben einen Hauptunterschied: Cheerio ist ein HTML-Parser, während Puppeteer ein Browser-Automatisierungstool ist. Das bedeutet, dass die beiden Tools sehr unterschiedlich funktionieren.

Cheerio ermöglicht es Ihnen, ein HTML-Dokument zu nehmen und die HTML-Elemente, nach denen Sie suchen, über CSS-Selektoren zu finden.

Schauen Sie sich zum Beispiel den folgenden Selektor an. Er sucht nach Elementen, die das h1-Tag  haben:

const title = $('h1');

Sie können diesen Selektor für HTML-Code wie den folgenden ausführen (entnommen aus example.com):

<div>
    <h1>Example Domain</h1>
    <p>This domain is for use in illustrative examples in documents. You may use this
    domain in literature without prior coordination or asking for permission.</p>
    <p><a href="https://www.iana.org/domains/example">More information...</a></p>
</div>

Dies führt dazu, dass Cheerio die h1-Elemente zurückgibt, aus denen Sie Informationen wie die Überschriftennamen extrahieren können:

    <h1>Example Domain</h1>

Um mit Cheerio zu arbeiten, müssen Sie eine Bibliothek wie axios verwenden, um den HTML-Code einer Webseite abzurufen. Dann können Sie den HTML-Code analysieren und die Informationen finden, die Sie benötigen.

Das folgende Codebeispiel lädt beispielsweise den HTML-Code von example.com herunter, analysiert ihn und findet dann den Text des h1-Elements:

(async () => {

  const url = 'https://example.com/';
  const response = await axios.get(url); // get HTML
  const $ = cheerio.load(response.data); // parse HTML with Cheerio
  const title = $('h1'); // use selectors to find data you need
  console.log(title.text());

})();

Im Vergleich dazu öffnet Puppeteer eine dedizierte Browser-Instanz und arbeitet mit dem, was die Browser-Instanz bieten kann. Dies bedeutet, dass es mit JavaScript-Elementen interagieren kann, die im HTML der Seite nicht vorhanden sind. Zum Beispiel kann es auf Schaltflächen zur Navigation klicken, durch die Seite scrollen oder sogar JavaScript im Kontext der Seite ausführen.

Hier ist ein Beispiel für ein Skript, das einen Browser startet, eine Seite öffnet und die Titel aller h1-Elemente extrahiert. Im Vergleich zu Cheerio ist Puppeteer auch in der Lage, anklickbare Elemente wie die Schaltfläche Weitere Informationen zu finden und sie für die Navigation zu verwenden:

(async () => {
  const browser = await puppeteer.launch({
    headless: false,
    defaultViewport: null
  });

  const page = await browser.newPage(); // open browser
  await page.goto('https://example.com/'); // go to the page

  const title = await page.evaluate(async () => { // use selectors to find data you need

    const h1 = document.querySelector('h1');
    return h1.textContent;
  });

  console.log(title);

  more_information = await page.waitForSelector('a');  // can also click on elements!
  await more_information.click();

  await new Promise(r => setTimeout(r, 2000));

  await browser.close(); // close the browser

})();

Aufgrund ihrer Unterschiede in der Funktionsweise eignet sich Puppeteer besser zum Scrapen moderner Websites, die JavaScript verwenden, um die Website wie eine Anwendung interagieren zu lassen. Im Vergleich dazu eignet sich Cheerio besser für statische Websites wie Blogs.

Funktionen

Sobald eine Seite mit allen notwendigen Informationen geöffnet ist, funktionieren beide Bibliotheken ähnlich – sie verwenden CSS-Selektoren, um die notwendigen Informationen zu finden und zu extrahieren.

Cheerio findet Informationen mit einer eingebauten jQuery-ähnlichen Syntax, was es für die meisten JavaScript-Entwickler praktisch macht:

const title = $('h1');

Puppeteer findet Informationen normalerweise, indem es JavaScript (insbesondere die Methoden querySelector und querySelectorAll) auf der Seite auswertet und das Ergebnis zurückgibt:

  const title = await page.evaluate(async () => {

    const h1 = document.querySelector('h1');
    return h1.textContent;
  });

Da Puppeteer jedoch in einem Browser läuft, hat es zusätzliche Funktionen. Auf der Seite kann Puppeteer beispielsweise jede Aktion ausführen, die ein Benutzer ausführen kann:


await button.click(); \\ clicking
await form.type('User'); \\ typing 

Dadurch kann es jede Art von Benutzerfluss, wie Registrierung und Authentifizierung, passieren. Sie können es auch verwenden, um über die Benutzeroberfläche der Website nach Informationen zu suchen und Informationen zu finden, die sonst versteckt sind.

Wenn es beispielsweise eine Website gibt, bei der Sie sich anmelden müssen, ist das mit Puppeteer so einfach wie es sein sollte – Sie müssen nur auf die erforderlichen Felder klicken und Ihren Benutzernamen und Ihr Passwort eingeben. Der Browser kümmert sich um den Rest. Währenddessen können Sie sich mit Cheerio technisch gesehen nicht bei einem Konto anmelden, da es sich nur mit dem Parsen einer einzelnen Seite beschäftigt und nicht mit der Verwaltung einer Websitzung.

Puppeteer kann sogar beliebiges JavaScript ausführen, um die Inhalte der Seite zu manipulieren. Dies wird üblicherweise zum Scrollen der Seite verwendet. Daher können Sie Puppeteer zum Scrapen von Websites mit unendlichem Scrollen verwenden, während Cheerio nicht in der Lage ist, etwas anderes als die erste Seite zu laden. Es macht es auch einfacher, benutzerdefinierte Anti-Scraping-Maßnahmen zu umgehen.

Die Tatsache, dass das Scraping im Browser mit natürlichen Aktionen erfolgt, ist auch für das Debugging von großem Vorteil! Sie können den Headless-Modus deaktivieren, um die Ausführung zu beobachten und Probleme mit der Website während der Ausführung zu erkennen:

Leistung

Da Puppeteer einen Browser starten und ausführen muss, um Web Scraping zu implementieren, ist es deutlich langsamer, das Skript zu starten und auszuführen, und es benötigt mehr Rechenressourcen als Cheerio.

Im Folgenden wird beispielsweise schnell überprüft, wie lange die Bibliotheken brauchen, um eine einfache Webseite zu scrapen.

Mit den folgenden Skripten können Sie den Bright Data-Blog öffnen und die Links der Blog-Posts von der ersten Seite extrahieren:

Cheerio

async function cheerio_scrape() {

  const url = 'https://brightdata.com/blog';
  const response = await axios.get(url);
  const $ = cheerio.load(response.data);
  const h5s = $('h5');
  let titles = []
  h5s.each((i, el) => titles.push($(el).text().trim()));
  console.log(titles);

};

Puppeteer

async function puppeteer_scrape() {
  const browser = await puppeteer.launch({
    headless: false,
    defaultViewport: null
  });

  const page = await browser.newPage();
  await page.goto('https://brightdata.com/blog');


  await page.waitForSelector('h5');

  const titles = await page.evaluate(async () => {

    let titles = [];
    const h5s = document.querySelectorAll('h5');
    h5s.forEach(el => titles.push(el.textContent.trim()));
    return titles;
  });

  console.log(titles);
 await browser.close();
};

Dann können Sie die Ausführung beider Funktionen zeitlich festlegen.

Der folgende Code verzögert die Ausführung des Cheerio-Skripts, was etwa 500 Millisekunden dauert (aber das kann bei Ihnen anders sein):

let start = Date.now();
cheerio_scrape().then(() => {
  let end = Date.now();
  console.log(`Execution time: ${end - start} ms`);
});

Der folgende Code misst die Ausführung des Puppeteer-Skripts:

let start = Date.now();
puppeteer_scrape().then(() => {
  let end = Date.now();
  console.log(`Execution time: ${end - start} ms`);
});

Mit Puppeteer dauert es etwa 4.000 Millisekunden, bis das Skript abgeschlossen ist, was deutlich länger ist als die 500 Millisekunden, die Cheerio benötigt.

Benutzerfreundlichkeit

Wenn Sie mit Web Scraping noch nicht vertraut sind, ist Cheerio möglicherweise die bessere Wahl, da es nur mit dem HTML-Code der Seite funktioniert. Der Benutzer muss nicht mit Webelementen interagieren und das Skript für deren Ladezeiten anpassen. Das bedeutet, dass er sich auf wichtige Web-Scraping-Funktionen konzentrieren kann, z. B. auf die Erstellung der richtigen Selektoren.

Außerdem ändert sich mit Cheerio der HTML-Code einer Webseite nicht, sobald Sie sie heruntergeladen haben. Im Gegensatz dazu ändert sich bei einer Website, auf der JavaScript läuft und mit der interagiert wird, der HTML-Code ständig, wobei der Zeitpunkt der Änderungen nicht vorhersehbar ist.

Aus diesem Grund verwenden Browser-Automatisierungstools Wartezeiten. Insbesondere Puppeteer hat eine waitForSelector-Funktion, die wartet, bis eine Bedingung erfüllt ist, z. B. wenn ein Element auf der Seite vorhanden ist. Wenn das Element nach einer bestimmten Zeitdauer (standardmäßig dreißig Sekunden) nicht verfügbar ist, gibt das Skript einen Fehler aus:

await page.waitForSelector('h1')

Wenn Sie dies nicht richtig einrichten, können Verzögerungen Ihre Skripte deutlich unzuverlässiger machen.

Darüber hinaus sollte sich die Syntax von Cheerio für JavaScript-Entwickler einfacher und natürlicher anfühlen. Puppeteer ist zwar leistungsstark, wurde aber nicht wirklich für Web Scraping entwickelt, und das merkt man, wenn man versucht, es dafür zu verwenden.

Fazit

Dieser Artikel befasst sich mit zwei häufig verwendeten Web-Scraping-Bibliotheken im JavaScript-Ökosystem: Cheerio und Puppeteer. Aufgrund ihrer unterschiedlichen Funktionsweisen haben sie jeweils Stärken und Schwächen. Cheerio eignet sich viel besser für einfache Web-Scraping-Skripte, die auf statische Seiten abzielen, während Puppeteer für das Scraping von Informationen aus modernen JavaScript-reichen Webseiten nützlich ist.

Es ist wichtig zu wissen, dass diese beiden Tools nicht unbedingt für Web Scraping gedacht sind. Sie wurden von Entwicklern adaptiert, die Websites scrapen möchten, da diese Tools Funktionen für die Arbeit mit HTML und die Automatisierung von Browsern bieten. Das bedeutet, dass die Oberfläche, die diese Tools bieten, nicht auf die Wünsche und Bedürfnisse von Web-Scrapern abgestimmt ist.

Wenn Sie auf der Suche nach einer leistungsstarken und benutzerfreundlichen Lösung sind, sollten Sie sich Bright Data ansehen, einen umfassenden Web-Scraping-Service. Neben Tools zum Scraping von Websites und zur Automatisierung von Browsern ist Bright Data der größte Anbieter von Proxy-Services, der Dutzende von Fortune-500-Unternehmen und über 20.000 Kunden betreut. Sein weltweites Proxy-Netzwerk umfasst:

  • Rechenzentrums-Proxys – Über 770.000 IPs von Rechenzentren.
  • Privatanwender-Proxys – Über 72 Millionen IPs von Geräten von Privatanwendern in mehr als 195 Ländern.
  • IDA-Proxys — Über 700.000 IPs von IDA-registrierten Geräten.
  • Mobile Proxys– Über 7 Millionen IPs von mobilen Netzwerken.

Starten Sie noch heute Ihre kostenlose Testversion.