Zum Inhalt

Scraping von Single-Page-Anwendungen mit Playwright: Eine ausführliche Anleitung

Single-Page-Anwendungen oder SPAs sind zur Norm für die moderne Webentwicklung geworden. Im Gegensatz zu herkömmlichen mehrseitigen Websites aktualisieren SPAs Inhalte dynamisch und rendern Seiten mithilfe von JavaScript, ohne dass die gesamte Seite neu geladen werden muss. Dies schafft ein reibungsloses, App-ähnliches Erlebnis für Benutzer.

Allerdings stellt die zunehmende Abhängigkeit von clientseitigem JavaScript und asynchronem Laden von Daten besondere Herausforderungen für das Scraping von Daten aus Single-Page-Anwendungen dar. Herkömmliche Scraping-Tools sind unzureichend, da sie für statische Websites und HTML-Parsing konzipiert sind.

In diesem umfassenden Leitfaden mit mehr als 3200 Wörtern lernen Sie bewährte Techniken kennen, um die häufigsten Hindernisse zu überwinden, die beim Scraping moderner SPAs mit Playwright auftreten.

Warum das Scraping von SPAs eine Herausforderung ist

Bevor wir uns mit Lösungen befassen, ist es wichtig zu verstehen, was das Scrapen von Single-Page-Anwendungen überhaupt erst schwierig macht.

Starker Einsatz von clientseitigem JavaScript

Der ursprünglich vom Server bereitgestellte HTML-Code ist im Wesentlichen eine statische Hülle der Seite. Der eigentliche Inhalt wird dynamisch generiert und clientseitig über JavaScript gerendert. Dies bedeutet, dass viele Daten nur in JavaScript-Objekten und DOM-Elementen und nicht in der ursprünglichen HTML-Quelle vorhanden sind.

Asynchrones Laden von Daten

SPAs rufen neue Inhalte häufig asynchron im Hintergrund ab und aktualisieren die Seite, ohne sie vollständig neu laden zu müssen. Beim ersten Laden der Seite sind die Daten oft nicht direkt verfügbar.

Laut den Kennzahlen von Radware stellt die durchschnittliche Webseite beim Rendern über 100 Anfragen an externe Ressourcen.

JahrDurchschnittliche Seitenanfragen
201133
201656
2019105

Bei der intensiven Nutzung von Technologien wie AJAX kann es sein, dass die benötigten Daten immer noch im Hintergrund geladen werden, wenn Sie versuchen, sie zu extrahieren. Dies führt dazu, dass unvollständige Daten gelöscht werden.

Dynamische DOM-Manipulation

Die in einem SPA gerenderten Komponenten und Elemente können sich als Reaktion auf Benutzereingaben schnell ändern. Inhalte werden dynamisch generiert, hinzugefügt, entfernt oder aktualisiert, während der Benutzer mit der App interagiert.

Der Versuch, Elemente anhand ihrer anfänglichen DOM-Position anzusprechen, ist fragil, da diese sich so häufig ändert.

Vertrauen Sie auf APIs und AJAX-Anfragen

SPAs nutzen in großem Umfang REST-APIs, GraphQL, WebSockets und AJAX-Anfragen, um Daten von Backend-Servern abzurufen. Der Inhalt wird dann clientseitig gerendert.

Dieser Datenaustausch zwischen Client und Server ist für herkömmliche Scraping-Ansätze unsichtbar, die nur die erste HTML-Antwort sehen.

Authentifizierte Sitzungen und Status

Bei komplexen SPAs müssen sich Benutzer häufig anmelden, bevor sie auf private Inhalte und Daten zugreifen können. Dieser Authentifizierungsstatus muss in Scraping-Skripten ordnungsgemäß beibehalten werden.

Cookies, die Sitzungs-IDs, Benutzer-IDs und Token speichern, müssen so verarbeitet werden, dass sie eine authentifizierte Benutzersitzung nachahmen.

Die Notwendigkeit der JavaScript-Ausführung

Im Gegensatz zu statischen Websites reicht das reine Parsen von HTML für SPAs nicht aus. Die Seite muss durch Ausführen von JavaScript in einer browserähnlichen Umgebung gerendert werden, um die endgültige Datenstruktur zu generieren.

Headless-Browser wie Playwright bieten diese Funktion, um die realistische Endbenutzererfahrung zu erzeugen, die zum Scrapen von SPAs erforderlich ist.

Aufgrund dieser Herausforderungen unterscheidet sich effektives SPA-Scraping deutlich vom herkömmlichen Web-Scraping. Sehen wir uns nun an, wie Playwright Ihnen helfen kann, diese Hindernisse zu überwinden.

Warum Playwright zum Scraping von SPAs verwenden?

Playwright ist eine Node.js-Bibliothek zur Automatisierung beliebter Webbrowser wie Chromium, Firefox und WebKit. Zu den wichtigsten Fähigkeiten, die für das SPA-Scraping relevant sind, gehören:

Headless-Browser-Automatisierung

Playwright kann Browser steuern, ohne eine sichtbare Benutzeroberfläche darzustellen, was als Headless-Modus bezeichnet wird. Dies ermöglicht die Ausführung von JavaScript-intensiven Seiten zum Auffüllen von Daten.

Warten auf Elemente und Bedingungen

Intelligente integrierte Wartemechanismen verhindern Scraping-Fehler, indem sie vor der Interaktion darauf warten, dass Elemente oder Funktionen den gewünschten Zustand erreichen.

Verspotten von API-Anfragen

Playwright ermöglicht das Abfangen von Anfragen und das Antworten mit Scheindaten, anstatt echte APIs aufzurufen. Dies ermöglicht das Scrapen von AJAX-Daten.

Responsive Tests

Emulieren Sie mobile Geräte, Regionen und CPU-Drosselung, um die Anforderungen an Responsive-Design-Tests zu erfüllen.

Trace-Viewer

Visualisieren Sie Playwright-Skripte, um die genauen Browserinteraktionen zu verstehen und Probleme zu diagnostizieren.

Automatische Behandlung von Popups und Dialogen

Playwright verarbeitet automatisch Warnungen, Bestätigungen, Eingabeaufforderungen, Authentifizierungsanfragen und Downloads und vereinfacht so die Skriptlogik.

Selektoren und DOM-API

Umfangreiche API zum Extrahieren von Daten über CSS-Selektoren oder zum direkten Durchlaufen von DOM-Elementen wie bei einer normalen Webseite.

Aufgrund dieser Funktionen eignet sich Playwright hervorragend für die Herausforderungen, die Single-Page-Webanwendungen mit sich bringen. Die Hauptalternativen wie Puppeteer, Selenium und HtmlUnit sind zwar für allgemeine Browsertests nützlich, verfügen jedoch nicht über den robusten Funktionsumfang von Playwright für effektives SPA-Scraping.

Als Nächstes gehen wir einige Codebeispiele durch, die Key-Scraping-Muster mit Playwright veranschaulichen.

Scraping-Muster für SPAs mit Playwright

Im Folgenden werden wir einige gängige Scraping-Techniken zur Bewältigung spezifischer SPA-Herausforderungen untersuchen.

Warten Sie, bis der Inhalt geladen ist

Eine der grundlegendsten Herausforderungen beim SPA-Scraping besteht darin, dem Inhalt vor dem Extrahieren Zeit zum Laden zu geben.

Anstatt zu versuchen, Daten sofort zu extrahieren, müssen wir warten, bis das asynchrone JavaScript-Rendering das Auffüllen der Seite abgeschlossen hat.

Dramatiker page.waitForSelector() -Methode ermöglicht das Warten auf das Erscheinen eines bestimmten Selektors, bevor weitere Befehle ausgeführt werden:

// Navigate to SPA
await page.goto(‘https://spa.com‘);

// Wait for content to load
await page.waitForSelector(‘.content‘);

// Extract data now that .content exists
const data = await page.$eval(‘.content‘, elem => elem.textContent); 

Dies wartet, bis das Element mit der Klasse content ist im DOM verfügbar, bevor der Textinhalt extrahiert wird.

Ohne dieses Warten, .content ist möglicherweise noch nicht vorhanden, wenn das Laden immer noch asynchron ist und Fehler verursacht. Diese einfache Verzögerung gibt dem SPA Zeit, neue Daten abzurufen und zu rendern, was die anschließende Extraktion ermöglicht.

WaitForFunction

In einigen Fällen müssen wir möglicherweise warten, bis komplexere JavaScript-Bedingungen wahr sind, anstatt einen einfachen Selektor. Hier können wir verwenden page.waitForFunction():

// Wait for data to load
await page.waitForFunction(() => {
  return window.store.articles.length > 0 ;
});

// Store now has loaded articles
const articles = await page.evaluate(() => {
  return window.store.articles; 
});

Dadurch wird die Seite bis zur benutzerdefinierten Abfrage abgefragt window.store.articles Die Bedingung gibt „true“ zurück, bevor die Daten gelesen werden.

Intelligentes Warten auf Selektoren und Bedingungen verhindert Scraping-Fehler aufgrund des asynchronen Ladens von Seitendaten.

Behandeln Sie dynamische Inhaltsaktualisierungen

Einzelseiten-Apps können Inhalte als Reaktion auf Benutzereingaben und Ereignisse dynamisch aktualisieren, ohne die Seite neu laden zu müssen.

Ein häufiges Beispiel ist das unendliche Scrollen, bei dem neue Elemente angehängt werden, wenn der Benutzer nach unten scrollt.

Um dynamisch hinzugefügte Elemente zu verarbeiten, können wir mithilfe von Mutationsbeobachtern auf DOM-Änderungen warten:

// Monitor mutations
await page.evaluate(() => {

  const observer = new MutationObserver(mutations => {
    console.log(‘Added nodes:‘, mutations[0].addedNodes);
  });

  observer.observe(document, { 
    childList: true,
    subtree: true
  });

});

Das observer wird benachrichtigt, wenn neue Elemente zum Seitentext hinzugefügt werden. Als Reaktion auf diese Mutationen können wir dann unsere Scraping-Logik auslösen.

Dies ermöglicht die Anpassung an Inhaltsaktualisierungen, anstatt nur das anfängliche Laden der Seite zu bewältigen.

Schein-API-Anfragen

SPAs nutzen in großem Umfang REST- und GraphQL-APIs, um Daten clientseitig abzurufen.

Um diese Anfragen abzufangen, können wir in Playwright Routen definieren, um Antworten vorzutäuschen:

await page.route(‘/api/articles‘, route => {
  route.fulfill({
    status: 200,
    body: JSON.stringify([
      {title: ‘Article 1‘},
      {title: ‘Article 2‘}  
    ])
  }); 
});

// Mock response will be returned from /api/articles
await page.goto(‘/page-that-calls-api‘) 

Wenn das SPA versucht anzurufen /api/articles, antwortet unser Handler mit der definierten Fake-Antwort, anstatt auf die echte API zuzugreifen.

Dies ermöglicht das Scrapen von API-Daten ohne Nebenwirkungen. Wir können robuste Antworten erstellen, um verschiedene Szenarien zu bewältigen, die unser SPA-Code erwarten könnte.

Sitzung authentifizieren

Das Scraping privater Kontobereiche in SPAs erfordert eine ordnungsgemäße Handhabung der Authentifizierung.

Ein einfacher Ansatz besteht darin, sich vor dem Scrapen normal über die Benutzeroberfläche anzumelden:

// Navigate to login page
await page.goto(‘/login‘);

// Enter credentials and submit form 
await page.type(‘#email‘, ‘[email protected]‘);
await page.type(‘#password‘, ‘secret‘);
await page.click(‘#submit‘);

// Session now authenticated
// Crawl member pages 

Dies nutzt die Fähigkeiten von Playwright, um das Ausfüllen von Formularen und Klicks zu automatisieren und eine authentifizierte Browsersitzung zu erstellen.

Um optimale Ergebnisse zu erzielen, führen Sie die Anmeldung in einem durch beforeAll einhaken und wiederverwenden browser und page Kontext während der Tests, um Cookies zu teilen.

Umgang mit responsivem Design

SPAs passen ihr Layout und ihre Inhalte häufig an unterschiedliche Gerätegrößen an. Um diese Reaktionsszenarien zu testen, können wir mobile Browser emulieren page.emulate():

await page.emulate({
  viewport: {
    width: 400,  
    height: 800
  },
  userAgent: ‘...‘,
});

Das Festlegen eines iPhone-Ansichtsfensters und eines Benutzeragenten ermöglicht die Darstellung der Seite wie auf einem Mobilgerät.

Kombinieren Sie Emulation mit waitForSelector und Sie können mit responsiven Designs zuverlässig umgehen.

Durch die Emulation verschiedener Umgebungen wird sichergestellt, dass sich Ihr Scraper auf dem Desktop und auf Mobilgeräten an die SPA anpasst.

Scraper-Helfer-Bibliotheken

Dienstleistungen wie Apify und SchabenBiene stellen Playwright-basierte Bibliotheken bereit, die das Warten auf Inhalte intelligent handhaben, das Scrollen für dynamische Seitenaktualisierungen, Drosselungsanforderungen und mehr automatisieren.

Diese Tools können das Schreiben robuster SPA-Scraping-Skripte selbst vereinfachen.

Praktisches Dramatiker-Scraper-Skript

Lassen Sie uns nun diese Ansätze zu einem realen Scraper für ein hypothetisches SPA zusammenfügen:

const { chromium } = require(‘playwright‘);

(async () => {

  const browser = await chromium.launch();
  const page = await browser.newPage();  

  // Login to scrape private content
  await page.goto(‘/login‘);
  await page.type(‘#email‘, ‘[email protected]‘);
  await page.type(‘#password‘, ‘secret‘); 
  await page.click(‘#submit‘);

  await page.waitForNavigation();

  // Navigate to SPA
  await page.goto(‘/app‘);

  // Wait for content to load
  await page.waitForSelector(‘.content‘);

  // Monitor mutations
  page.evaluate(() => {
    new MutationObserver().observe(document, {
      childList: true 
    });    
  });

  // Mock API response
  page.route(‘/api/articles‘, route => {
    route.fulfill({ /*...mock response...*/ }); 
  });

  // Extract content 
  const data = await page.evaluate(() => {
    const content = document.querySelector(‘.content‘);
    return content.innerText;
  });

  console.log(data);

  await browser.close();

})();

Dieses Skript meldet sich bei der privaten App an, wartet auf das Laden des authentifizierten Inhalts, verarbeitet dynamische Mutationen, simuliert die API-Antwort und extrahiert die Daten in const data.

Die Techniken können angepasst werden, um robuste Schaber für reale SPAs zu entwickeln.

SPAs im großen Maßstab skalieren

Bei großen SPAs kann es einfach sein, nur ein paar Seiten manuell zu scrappen. Beim Crawlen von Tausenden oder Millionen Seiten sind jedoch intelligente Lösungen gefragt.

Scraping-API-Dienste

Web-Scraping-APIs wie SchaberAPI Behandeln Sie Browser-Automatisierung, Cookies, Proxys und Rotationen in großem Umfang. Dies vereinfacht das Scraping von JavaScript-intensiven Websites, einschließlich SPAs.

Kopflose Browserfarmen

Dienstleistungen wie Browserlos und Sangfor Cloud Browser Bereitstellung großer Cluster von Playwright- und Puppeteer-Instanzen, auf die über APIs zugegriffen werden kann. Diese parallelen Instanzen ermöglichen das verteilte Scraping von SPAs im großen Maßstab.

Gehostete Crawler

Anstatt Ihre eigene Scraping-Infrastruktur zu betreiben, können gehostete Crawler wie z Kriecher und ProxyCrawl kümmern sich um die Orchestrierung von Browsern, Proxys und Automatisierung zum Crawlen komplexer Websites.

Web-Scraping-Bots

Tools wie Phantombuster, Dexi.io und ParseHub Bietet Point-and-Click-Konfiguration von Scrapern für SPAs ohne Codierung. Diese Bots erkennen Seiteninhalte, Wartezeiten, Klicks usw. automatisch und ermöglichen eine Einrichtung ohne Code.

Abhängig von Ihrem Anwendungsfall kann die Nutzung eines dieser Unternehmensdienste effektiver sein als der Aufbau einer eigenen Scraping-Infrastruktur für groß angelegtes SPA-Crawling.

Eine einfachere Alternative: Crawlee

Crawlee bietet einen innovativen Webcrawler als Service für mit JavaScript gerenderte Websites.

Es bewältigt automatisch häufige Scraping-Herausforderungen wie:

  • Warten auf das Laden von Elementen oder URLs vor der Extraktion
  • Authentifizierung von Sitzungen und Speicherung von Cookies
  • API-Anfragen abfangen und AJAX-Daten verarbeiten
  • Scrollen durch unendlich viele Scroll-Seiten
  • Führen Sie fehlgeschlagene Extraktionen erneut aus, um die Ausfallsicherheit zu verbessern

Crawlee kann sofort durch komplexe SPAs kriechen, ohne Playwright-Skripte für Warten, Authentifizierung, AJAX-Verarbeitung usw. programmieren zu müssen.

Die wichtigsten Funktionen:

  • Konfigurieren Sie über eine visuelle Schnittstelle statt über Codierung
  • Wartet automatisch auf URLs und Selektoren, bevor Daten extrahiert werden
  • Beim Stateful Crawling werden Cookies seitenübergreifend übertragen
  • Abfangen von API-Anfragen zur Verarbeitung von XHR-, Fetch- und JSON-Daten
  • Headless Chrome-Rendering standardmäßig
  • Visuelle Tools zum Überprüfen und Debuggen des Crawlings
  • Horizontal skalierbares verteiltes Crawler-Backend

Dies vereinfacht das Scraping selbst anspruchsvoller JavaScript-Webanwendungen ohne Playwright-Codierung. Der Crawler as a Service von Crawlee ist ideal für Benutzer, die ihre eigene Scraper-Infrastruktur nicht verwalten möchten.

Zu den unterstützten Apps gehören:

  • React- und Next.js-Apps
  • Eckige SPAs
  • Vue.js-Seiten
  • Webpack-Sites
  • AJAX-schwere Seiten
  • PWAs und Electron-Apps
  • Dynamische und responsive Designs

Durch die Bereitstellung schlüsselfertiger Unterstützung für Scraping-Herausforderungen wie Wartebedingungen, authentifizierte Sitzungen und dynamische Inhaltsänderungen ist Crawlee eine überzeugende Wahl für SPA-Scraping, ohne komplexe Skripte schreiben zu müssen.

Zusammenfassung

Das Scraping moderner Single-Page-Anwendungen erfordert die Emulation von Benutzerinteraktionen und das Warten auf asynchrone JavaScript-Aktivitäten. Playwright bietet hervorragende Browser-Automatisierungsfunktionen, um diese Herausforderungen zu meistern.

Zu den wichtigsten Strategien, die in diesem Leitfaden behandelt werden, gehören:

  • Warten Sie vor dem Extrahieren auf das Laden der ersten Inhalte und dynamischen Aktualisierungen
  • Lauschen Sie auf DOM-Änderungen, um neue gerenderte Inhalte zu erkennen
  • Abfangen von REST-API- und GraphQL-Anfragen für den Zugriff auf Backend-Daten
  • Emulieren mobiler Geräte und Drosselung für responsive Designs
  • Authentifizierung von Sitzungen und Verwaltung von Cookies für den Zugriff auf private Benutzerdaten

Wenn Sie diese Muster befolgen, können Sie wartbare Playwright-Scraper entwickeln, selbst für komplexe SPAs, die stark auf clientseitigem JavaScript und APIs basieren.

Im großen Maßstab kann die Nutzung von Scraping-API-Diensten, Headless-Browserfarmen und gehosteten Crawlern effizienter sein als der Aufbau einer eigenen Playwright-Infrastruktur.

Während das Schreiben von Playwright-Skripten maximale Flexibilität bietet, bieten Tools wie Crawlee einen einfacheren, schlüsselfertigen Scraping-Service für SPAs, ohne dass Sie selbst Browser-Automatisierungsskripte programmieren müssen.

Ich hoffe, dieser Leitfaden hat Ihnen einen guten Überblick über die Techniken zum Scraping anspruchsvoller Single-Page-Apps mit Playwright vermittelt. Lassen Sie mich wissen, wenn Sie weitere Fragen haben!

Mitreden

E-Mail-Adresse wird nicht veröffentlicht. Pflichtfelder sind MIT * gekennzeichnet. *