Eine Low-Code-Plattform, die die Einfachheit von No-Code mit der Leistung von Full-Code verbindet 🚀
Jetzt kostenlos starten
Browserautomatisierung mit Puppeteer und JavaScript: Praktische Umsetzung in Node.js
21. März 2025
11
min lesen

Browserautomatisierung mit Puppeteer und JavaScript: Praktische Umsetzung in Node.js

Georgi Miloradowitsch
Forscher, Texter und Usecase-Interviewer
Inhaltsverzeichnis

Puppenspieler ist eine Node.js Bibliothek das Browser-Aufgaben wie Web Scraping, UI-Tests und sich wiederholende Workflows automatisiert. Es funktioniert sowohl in kopflos (keine Schnittstelle) und Vollbrowsermodi und kommuniziert mit Browsern über die DevTools-ProtokollAus diesen Gründen ist es die erste Wahl für Entwickler:

  • Dynamische Inhaltsverarbeitung: Perfekt für moderne Web-Apps und zum Umgehen von Erkennungssystemen.
  • Common-Gebrauch: Web Scraping, PDF-Generierung, Screenshot-Erfassung und Formularautomatisierung.
  • Einfache Einrichtung: Installieren Sie Puppeteer mit npm install puppeteer, und es wird mit einer kompatiblen Version von Chrome geliefert.

Kurzes Beispiel:

import puppeteer from 'puppeteer';

async function runAutomation() {
  const browser = await puppeteer.launch({ headless: true });
  const page = await browser.newPage();
  await page.goto('https://example.com');
  await browser.close();
}

runAutomation();

Warum es auffällt:

  • Modi: Headless (CI/CD-Aufgaben) oder vollständige Benutzeroberfläche (Debugging).
  • Seiteninteraktionen: Automatisieren Sie Klicks, Eingaben und Navigation mithilfe von CSS-Selektoren.
  • Leistungstipps: Deaktivieren Sie Bilder, verwenden Sie den Stealth-Modus und verwalten Sie asynchrone Vorgänge effizient.

Vom Anfänger bis zum fortgeschrittenen Benutzer vereinfacht Puppeteer die Browserautomatisierung und ist damit ein unverzichtbares Tool für Node.js-Entwickler.

Modernes Web-Testing und Automatisierung mit Puppenspieler (Google ...

Puppenspieler

Ersteinrichtung und Konfiguration

Befolgen Sie diese Schritte, um Puppeteer in Node.js einzurichten und alles für die Automatisierung vorzubereiten.

Einrichten Node.js Arbeitsumfeld

Node.js

Für den Einstieg benötigen Sie drei Hauptkomponenten:

Komponente Sinn Befehl „Überprüfen“
Node.js Laufzeitumgebung node --version
npm Paket-Manager npm --version
Google Chrome Browser-Engine Installation prüfen

Da npm im Lieferumfang von Node.js enthalten ist, stehen Ihnen mit der Installation von Node.js beide Tools zur Verfügung. Laden Sie die neueste Long Term Support (LTS)-Version von der offiziellen Node.js-Website herunter, um mehr Stabilität und Kompatibilität zu gewährleisten.

Projekt-Setup mit Puppeteer

So erstellen Sie ein neues Puppeteer-Projekt:

  • Schritt 1: Lauf mkdir puppeteer-project um einen Projektordner zu erstellen.
  • Schritt 2: Navigieren Sie zum Ordner und initialisieren Sie ihn mit cd puppeteer-project && npm init -y.
  • Schritt 3: Installieren Sie Puppeteer mit npm install puppeteer.

Wenn Sie Puppeteer installieren, lädt es automatisch eine Version von Chrome zum Testen die zur Bibliothek passt. Dadurch wird sichergestellt, dass Ihre Skripte in verschiedenen Setups konsistent funktionieren.

Grundlegende Skriptstruktur

Hier ist eine einfache Puppeteer-Skriptvorlage:

import puppeteer from 'puppeteer';

async function runAutomation() {
  const browser = await puppeteer.launch({
    headless: true
  });
  const page = await browser.newPage();

  try {
    await page.setViewport({ width: 1280, height: 800 });
    await page.goto('https://example.com');
    // Add your actions here
  } finally {
    await browser.close();
  }
}

runAutomation();

Best Practices zum Schreiben von Puppeteer-Skripten:

  • Wasser page.waitForSelector() um sicherzustellen, dass die Elemente vollständig geladen sind, bevor mit ihnen interagiert wird.
  • Legen Sie die Ansichtsfensterabmessungen für eine konsistente Seitendarstellung fest.
  • Verpacken Sie Ihren Code in try/finally Blöcke zur Fehlerbehandlung und zum Sicherstellen des ordnungsgemäßen Schließens des Browsers.
  • Schließen Sie immer die Browserinstanz, um Speicherprobleme zu vermeiden.

Für eine reibungslosere Entwicklung fügen Sie hinzu "type": "module" auf Ihre package.json Datei. Dies ermöglicht Ihnen die Verwendung moderner ES-Modulsyntax wie import und export in Ihren Skripten. Mit dieser Einrichtung können Sie in den nächsten Abschnitten in die erweiterten Funktionen von Puppeteer eintauchen.

Hauptfunktionen von Puppeteer

Lassen Sie uns die wichtigsten Funktionen von Puppeteer für eine effektive Browserautomatisierung aufschlüsseln.

Grundlagen der Browsersteuerung

Mit Puppeteer können Sie Browser in zwei Modi ausführen:

Model Beschreibung Bester Anwendungsfall
Headless Lässt den Browser unsichtbar laufen Automatisierung in CI/CD-Pipelines, Produktionsaufgaben
Vollständiger Zeigt die Browser-Benutzeroberfläche an Debugging, Entwicklungstests

Hier ist ein kurzes Beispiel für das Starten eines Browsers mit benutzerdefinierten Einstellungen:

const browser = await puppeteer.launch({
  headless: true,
  defaultViewport: { width: 1920, height: 1080 },
  args: ['--no-sandbox', '--disable-setuid-sandbox']
});

Methoden zur Seiteninteraktion

Puppeteer vereinfacht die Interaktion mit Webseiten mithilfe von CSS-Selektoren und integrierten Wartefunktionen, um sicherzustellen, dass Elemente bereit sind. Beispiel:

// Wait for the email input field to load and type an email
const emailInput = await page.waitForSelector('input[type="email"]');
await emailInput.type('[email protected]');

// Wait for the submit button to appear and click it
const submitButton = await page.waitForSelector('button[type="submit"]');
await submitButton.click();

Sie können verschiedene Aktionen ausführen, beispielsweise:

  • Mausereignisse: Klicken, schweben oder ziehen und ablegen.
  • Tastatureingabe: Geben Sie Text ein oder verwenden Sie Tastenkombinationen.
  • Formularhandhabung: Arbeiten Sie mit Dropdowns, Kontrollkästchen und Datei-Uploads.
  • Frame-Navigation: Interagieren Sie mit Iframes oder wechseln Sie zwischen mehreren Fenstern.

Verwalten asynchroner Vorgänge

Da Puppeteer auf asynchronen Operationen basiert, ist die ordnungsgemäße Verwaltung dieser Aufgaben entscheidend. Das Framework enthält Wartemechanismen, um eine reibungslose Automatisierung zu gewährleisten. Hier ein Beispiel:

try {
  await Promise.all([
    page.waitForNavigation(),
    page.click('#submit-button')
  ]);

  await page.waitForSelector('.success-message', {
    visible: true,
    timeout: 5000
  });
} catch (error) {
  console.error('Navigation failed:', error);
}

„Async/await ist eine Möglichkeit, asynchronen Code zu schreiben, der eher wie herkömmlicher synchroner Code aussieht und oft leichter zu lesen und zu verstehen ist.“ – WebScraping.AI

Einige nützliche Wartestrategien sind:

Wartefunktion Sinn Beispielanwendung
warteAufAuswahl Wartet auf das Erscheinen eines Elements Nützlich für Formulare oder dynamische Inhalte
waitForNavigation Wartet, bis eine Seite geladen ist Ideal für Formulareinreichungen
warteAufFunktion Wartet auf benutzerdefinierte Bedingungen Ideal zum Überprüfen komplexer Statusänderungen
waitForTimeout Führt eine feste Verzögerung ein Hilfreich für Ratenbegrenzungen oder Animationen
sbb-itb-23997f1

Implementierungsbeispiele

Dieser Abschnitt bietet praktische Beispiele, die zeigen, wie Puppeteer für Aufgaben wie das Extrahieren von Daten, das Automatisieren von Formularen und das effektive Erfassen von Webseiten verwendet werden kann.

Datenextraktionsmethoden

Puppeteer vereinfacht die Handhabung dynamischer Inhalte und das Extrahieren strukturierter Daten. Unten sehen Sie ein Beispiel für das Scraping von Bewertungsdaten von einer Seite mit Endlos-Scrolling:

async function scrapeReviews() {
  const reviews = [];

  // Scroll until no new content loads
  async function scrollToBottom() {
    let lastHeight = await page.evaluate('document.body.scrollHeight');
    while (true) {
      await page.evaluate('window.scrollTo(0, document.body.scrollHeight)');
      await page.waitForTimeout(2000);
      let newHeight = await page.evaluate('document.body.scrollHeight');
      if (newHeight === lastHeight) break;
      lastHeight = newHeight;
    }
  }

  // Extract review data
  await scrollToBottom();
  const reviewElements = await page.$$('.review-box');
  for (const element of reviewElements) {
    const review = await element.evaluate(el => ({
      text: el.querySelector('.review-text').textContent,
      rating: el.querySelector('.rating').getAttribute('data-score'),
      date: el.querySelector('.review-date').textContent
    }));
    reviews.push(review);
  }

  return reviews;
}

Um die Leistung beim Scraping zu verbessern, beachten Sie die folgenden Tipps:

Optimierung Umsetzung Vorteile
Bilder deaktivieren page.setRequestInterception(true) Spart Bandbreite
Verwenden Sie den Stealth-Modus puppeteer-extra-plugin-stealth Hilft, Entdeckung zu vermeiden
Verzögerungen hinzufügen page.waitForTimeout() Verhindert Ratenbegrenzungen

Fahren wir nun mit der Automatisierung von Formularen fort.

Schritte zur Formularautomatisierung

Die Automatisierung von Formularen umfasst das Ausfüllen von Eingabefeldern, die Handhabung von Schaltflächen und die Verwaltung potenzieller Fehler. So können Sie ein Anmeldeformular mit Fehlerbehandlung automatisieren:

async function handleLogin(username, password) {
  try {
    // Click cookie accept button if visible
    const cookieButton = await page.$('.cookie-accept');
    if (cookieButton) await cookieButton.click();

    // Fill login form
    await page.type('#username', username, { delay: 100 });
    await page.type('#password', password, { delay: 100 });

    // Submit and wait for navigation
    await Promise.all([
      page.waitForNavigation(),
      page.click('#login-button')
    ]);

    // Check for error messages
    const errorElement = await page.$('.error-message-container');
    if (errorElement) {
      const errorText = await errorElement.evaluate(el => el.textContent);
      throw new Error(`Login failed: ${errorText}`);
    }

  } catch (error) {
    console.error('Login automation failed:', error);
  }
}

Tools zur Seitenerfassung

Für die Erfassung von Webseiten bietet Puppeteer die Möglichkeit, Einstellungen für Screenshots und PDFs zu konfigurieren. Hier ist ein Beispiel für die Erstellung hochwertiger Aufnahmen:

async function captureWebPage(url) {
  // Set viewport for consistent captures
  await page.setViewport({
    width: 1920,
    height: 1080,
    deviceScaleFactor: 2
  });

  await page.goto(url, { waitUntil: 'networkidle0' });

  // Take full-page screenshot
  await page.screenshot({
    path: 'capture.jpg',
    fullPage: true,
    quality: 90,
    type: 'jpeg'
  });

  // Generate PDF with custom settings
  await page.pdf({
    path: 'page.pdf',
    format: 'A4',
    printBackground: true,
    margin: { top: '20px', right: '20px', bottom: '20px', left: '20px' }
  });
}

„Screenshots von Websites mit Puppeteer zu erstellen, kann knifflig sein. Es lauern viele Fallstricke.“ – Dmytro Krasun, Autor bei ScreenshotOne

Um bessere Ergebnisse zu erzielen, passen Sie Ihre Aufnahmeeinstellungen je nach Aufgabe an:

Erfassungstyp Beste Übung Idealer Anwendungsfall
Screenshots Verwenden Sie JPEG für eine schnellere Verarbeitung Allgemeine Web-Captures
PDF CSS für Printmedien anwenden Dokumentenerstellung
Elementerfassung Zielspezifische Selektoren Prüfung einzelner Komponenten

Diese Beispiele zeigen, wie Puppeteer eine Vielzahl von Automatisierungsaufgaben vereinfachen kann.

Erweiterte Funktionen und Leistung

Puppeteer bietet eine Reihe fortschrittlicher Techniken zur Verbesserung Ihrer Node.js-Projekte. Erfahren Sie, wie Sie Tests verbessern, mehrere Seiten verwalten und die Leistung optimieren können.

Testen und Fehlermanagement

Effektive Fehlerbehandlung in Puppeteer kann das Debuggen erheblich vereinfachen. Durch die Überwachung von Browserprozessen und die Protokollierung fehlgeschlagener Anfragen können Sie Probleme schnell erkennen und beheben. Hier ist ein Beispiel für ein solides Fehlermanagement-Setup:

async function robustPageOperation(url) {
  try {
    await page.goto(url, { 
      waitUntil: 'domcontentloaded',  // Faster than 'networkidle2'
      timeout: 30000 
    });

    // Monitor failed requests
    page.on('requestfailed', request => {
      console.error(`Failed request: ${request.url()}`);
      console.error(`Reason: ${request.failure().errorText}`);
    });

    // Capture a screenshot on error for debugging
    page.on('error', async (error) => {
      await page.screenshot({
        path: `error-${Date.now()}.png`,
        fullPage: true
      });
      console.error('Page error:', error);
    });

  } catch (error) {
    console.error('Navigation failed:', error);
    throw error;
  }
}

„Es wird nicht alle Ihre Probleme lösen, aber es wird Ihnen genügend Situationsbewusstsein vermitteln, um die Probleme viel einfacher zu diagnostizieren und zu beheben.“ – Joel Griffith, Gründer und CEO von browserless.io

Sobald Sie die Fehlerbehandlung eingerichtet haben, können Sie noch einen Schritt weiter gehen und mehrere Seiten gleichzeitig verwalten.

Mehrseitige Operationen

Puppeteer ermöglicht die gleichzeitige Bearbeitung mehrerer Aufgaben. Das spart Zeit und steigert die Effizienz. Hier ist ein Beispiel für die Verwaltung paralleler Aufgaben mit Puppeteer Cluster:

const { Cluster } = require('puppeteer-cluster');

async function runParallelOperations() {
  const cluster = await Cluster.launch({
    concurrency: Cluster.CONCURRENCY_CONTEXT,
    maxConcurrency: 4,
    monitor: true,
    timeout: 30000
  });

  await cluster.task(async ({ page, data: url }) => {
    await page.goto(url);
    // Perform page operations
  });

  // Queue URLs for processing
  const urls = ['url1', 'url2', 'url3'];
  for (const url of urls) {
    await cluster.queue(url);
  }

  await cluster.idle();
  await cluster.close();
}

Die effiziente Handhabung mehrerer Seiten ist ein großer Fortschritt, aber durch die Optimierung der Ressourcennutzung können Ihre Abläufe noch reibungsloser gestaltet werden.

Geschwindigkeits- und Ressourcenmanagement

Um die Leistung von Puppeteer zu optimieren, konzentrieren Sie sich auf kurze Ladezeiten und eine effektive Ressourcenverwaltung. Hier sind einige Strategien:

Optimierungsansatz Umsetzung Vorteile
Seitenladegeschwindigkeit Bilder und CSS deaktivieren Schnellere Ladezeiten
Memory Usage Seiten umgehend entsorgen Verhindert Speicherlecks
Request Management Cache-Antworten Reduziert die Netzwerklast
Parallelverarbeitung Kontrollierte Parallelität Ausgewogene Ressourcennutzung

Hier ist ein Beispiel, wie Sie Seitenvorgänge optimieren können:

async function optimizedPageOperation() {
  // Intercept and optimize requests
  await page.setRequestInterception(true);
  page.on('request', request => {
    if (request.resourceType() === 'image' || request.resourceType() === 'stylesheet') {
      request.abort();
    } else {
      request.continue();
    }
  });

  // Implement caching
  const cache = new Map();
  page.on('response', async response => {
    const url = response.url();
    if (response.ok() && !cache.has(url)) {
      cache.set(url, await response.text());
    }
  });
}

Node.js-Integrationshandbuch

Erfahren Sie, wie Sie Puppeteer mit einer sauberen, wartbaren Codestruktur nahtlos in Ihre Node.js-Projekte integrieren.

Code-Organisation

Strukturieren Sie Ihre Automatisierungsmodule, um Übersichtlichkeit und Wiederverwendung zu gewährleisten. Hier ist ein Beispiel-Setup:

// automation/browser.js
const puppeteer = require('puppeteer');

class BrowserManager {
  async initialize() {
    this.browser = await puppeteer.launch({
      headless: true,
      args: ['--no-sandbox', '--disable-setuid-sandbox']
    });
    return this.browser;
  }

  async createPage() {
    const page = await this.browser.newPage();
    await page.setDefaultNavigationTimeout(30000);
    return page;
  }

  async cleanup() {
    if (this.browser) {
      await this.browser.close();
    }
  }
}

module.exports = new BrowserManager();

Durch diese Konfiguration werden die Verantwortlichkeiten getrennt, sodass Ihr Code einfacher zu verwalten und zu skalieren ist.

Bibliotheksintegration

Puppeteer kann mit anderen Node.js-Bibliotheken zusammenarbeiten, um Ihre Automatisierungs-Workflows zu verbessern. Hier ist ein Beispiel mit winston für die Protokollierung und puppeteer-extra für Stealth-Fähigkeiten:

const winston = require('winston');
const puppeteerExtra = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');

// Set up logging with winston
const logger = winston.createLogger({
  level: 'info',
  format: winston.format.json(),
  transports: [
    new winston.transports.File({ filename: 'automation.log' })
  ]
});

// Configure Puppeteer with stealth mode
puppeteerExtra.use(StealthPlugin());

async function setupAutomation() {
  const browser = await puppeteerExtra.launch();
  const page = await browser.newPage();

  // Log browser console messages
  page.on('console', message => {
    logger.info(`Browser console: ${message.text()}`);
  });

  return { browser, page };
}

„Puppeteer ist eine Node.js-Bibliothek, die eine High-Level-API zur Steuerung von Chrome oder Chromium über das DevTools-Protokoll bereitstellt.“

Durch die Integration von Protokollierungs- und Stealth-Funktionen können Sie Ihre Automatisierungsaufgaben besser überwachen und verwalten.

Schritte zur Produktionsbereitstellung

Stellen Sie beim Bereitstellen von Puppeteer-Skripten sicher, dass Ihre Umgebung hinsichtlich Stabilität und Leistung optimiert ist. Hier ist eine Übersicht der wichtigsten Schritte:

Bereitstellungsschritt Implementierungsdetails Sinn
Abhängigkeiten Installieren Sie Chrome-Abhängigkeiten Stellt die Browserfunktionalität sicher
Cache-Konfiguration Einrichten .cache/puppeteer Verzeichnis Verwaltet Browserinstanzen
Ressourcengrenzen Konfigurieren von Speicher- und CPU-Einschränkungen Verhindert eine Systemüberlastung
Fehlerbehebung Implementieren Sie automatische Neustartmechanismen Sorgt für eine hohe Verfügbarkeit des Dienstes

Verwenden Sie die folgende Konfiguration, um Ihre Bereitstellung zu standardisieren:

const { join } = require('path');

module.exports = {
  cacheDirectory: join(__dirname, '.cache', 'puppeteer'),
  executablePath: process.env.CHROME_PATH || null,
  defaultViewport: {
    width: 1920,
    height: 1080
  }
};

So optimieren Sie Ihre Skripte weiter:

  • Schließen Sie nicht verwendete Seiten und Browserinstanzen so schnell wie möglich.
  • Verwenden Sie Try/Catch-Blöcke, um Fehler zu behandeln und effektiv zu protokollieren.
  • Überwachen Sie die Speichernutzung und Reaktionszeiten, um Engpässe zu vermeiden.
  • Richten Sie Sicherheitsheader und Zugriffskontrollen ein, um Ihre Umgebung zu schützen.

„Durch die Optimierung Ihres Puppeteer-Skripts können Sie einen reibungslosen und effizienten Betrieb mit genauen und konsistenten Ergebnissen sicherstellen.“ – ScrapeOps

Zusammenfassung

Feature-Übersicht

Puppeteer ist ein Browser-Automatisierungstool, das sich durch Aufgaben wie Headless-Browser-Steuerung, Formularautomatisierung, UI-Tests, das Aufnehmen von Screenshots, das Generieren von PDFs und Web-Scraping-Funktionen auszeichnet.

Hier ein kurzer Blick auf die Kernfunktionen:

Merkmal Capability Vorteile
Browser-Unterstützung Chrome/Chromium, Firefox Funktioniert in mehreren Umgebungen
Ausführungsmodus Kopflos/Mit Kopf Geeignet für verschiedene Szenarien
Kennzahlen Leichte Bedienung Verwendet weniger Systemressourcen
API-Zugriff DevTools-Protokoll Bietet detaillierte Browserkontrolle

Sie können diese Möglichkeiten optimal nutzen, indem Sie spezifische, auf Ihre Bedürfnisse zugeschnittene Strategien verfolgen.

Implementierungshandbuch

Um das Potenzial von Puppeteer zu maximieren, sollten Sie diese Strategien zur Verbesserung von Leistung und Zuverlässigkeit in Betracht ziehen:

Ressourcenmanagement

Das folgende Skript deaktiviert unnötige Ressourcen wie Bilder, Stylesheets und Schriftarten, um die Seitenladegeschwindigkeit zu verbessern:

// Optimize page load performance
await page.setRequestInterception(true);
page.on('request', request => {
  if (['image', 'stylesheet', 'font'].indexOf(request.resourceType()) !== -1) {
    request.abort();
  } else {
    request.continue();
  }
});

Fehlervermeidung

Verwenden Sie diesen Codeausschnitt, um sicherzustellen, dass Ihr Skript auf das Erscheinen eines Elements wartet, bevor es mit ihm interagiert:

await page.waitForSelector('#target-element', {
  timeout: 5000,
  visible: true
});

Führen Sie für Produktionskonfigurationen die folgenden Schritte aus:

  1. Infrastruktur-Setup: Installieren Sie die erforderlichen Chrome-Abhängigkeiten und konfigurieren Sie die Cache-Verzeichnisse korrekt.
  2. Performance-Verbesserungen: Minimieren Sie die Ressourcennutzung, indem Sie nicht benötigte Assets deaktivieren und die Anforderungsabfangfunktion aktivieren.
  3. Sicherheitsverbesserungen: Ergänzen Sie die Puppenspieler-Extra-plugin-stealth Plugin, um Erkennungsrisiken zu reduzieren.
  4. Skalierung: Benutzen Puppenspieler-Cluster für die parallele Verarbeitung, um größere Arbeitslasten effizient zu bewältigen.

„Durch die Optimierung Ihres Puppeteer-Skripts können Sie einen reibungslosen und effizienten Betrieb mit genauen und konsistenten Ergebnissen sicherstellen.“ – ScrapeOps

Ähnliche Blog-Beiträge

Verwandte Blogs

Anwendungsfall

Unterstützt von