Zurück zum Blog
Anleitungen
Mihnea-Octavian ManolacheLast updated on Apr 28, 202613 min read

Playwright Web Scraping: Der komplette Leitfaden für Python und Node.js

Playwright Web Scraping: Der komplette Leitfaden für Python und Node.js
Kurz gesagt: Playwright bietet Ihnen umfassende Browser-Automatisierung zum Scrapen von JavaScript-lastigen Websites und unterstützt sowohl Python als auch Node.js. Dieser Leitfaden führt Sie durch die Installation, die Extraktion von Elementen, die Proxy-Konfiguration, Maßnahmen zur Vermeidung von Erkennung, Paginierung, das Herunterladen von Bildern und den Export von Daten in CSV oder JSON – alles mit Code-Beispielen in beiden Sprachen nebeneinander.

Wenn Sie schon einmal versucht haben, eine moderne Single-Page-Anwendung mit einem einfachen HTTP-Client zu scrapen, kennen Sie das Problem: Der zurückerhaltene HTML-Code ist eine leere Hülle, und die gewünschten Daten befinden sich in JavaScript, das nie ausgeführt wird. Playwright-Webscraping löst dieses Problem, indem es einen echten Browser (Chromium, Firefox oder WebKit) programmgesteuert steuert, sodass Ihr Skript genau das sieht, was ein menschlicher Besucher sehen würde.

Playwright ist ein von Microsoft gepflegtes Open-Source-Framework zur Browser-Automatisierung. Im Gegensatz zu älteren Tools verfügt es standardmäßig über integrierte Funktionen wie automatisches Warten, Netzwerk-Interception und Unterstützung für mehrere Browser-Engines. Unabhängig davon, ob Sie Python oder Node.js verwenden, ist die API-Oberfläche nahezu identisch, sodass Sie die Sprache wählen können, die am besten zu Ihrem Stack passt.

Dieser Leitfaden behandelt alles, was Sie benötigen, um von einem leeren Terminal zu produktionsreifen Playwright-Scraping-Skripten zu gelangen: Einrichtung, Selektoren, Text- und Bildextraktion, Paginierung, Request-Interception, Proxy-Konfiguration, Stealth-Techniken, Fehlerbehandlung und Export strukturierter Daten. Jede Technik enthält Code sowohl für Python als auch für Node.js.

Was ist Playwright und warum sollte man es für das Web-Scraping verwenden?

Playwright ist eine Browser-Automatisierungsbibliothek, die vom Team hinter Puppeteer bei Google entwickelt wurde, das später zu Microsoft wechselte. Sie steuert Chromium, Firefox und WebKit über eine einzige, einheitliche API. Für das Web-Scraping mit Playwright lassen sich die wichtigsten Vorteile wie folgt zusammenfassen:

  • Unterstützung mehrerer Browser. Sie sind nicht an Chromium gebunden. Müssen Sie Rendering-Unterschiede testen oder Browser-Engines wechseln, um Fingerprinting zu reduzieren? Playwright verarbeitet alle drei Engines mit identischen Methodenaufrufen.
  • Mehrsprachige SDKs. Es gibt offizielle Bindungen für Python, Node.js (JavaScript/TypeScript), Java und .NET. Dieser Leitfaden konzentriert sich auf die beiden beliebtesten Optionen für das Scraping: Python und Node.js.
  • Automatisches Warten. Playwright wartet automatisch, bis Elemente aktivierbar sind, bevor es mit ihnen interagiert. Es sind keine manuellen sleep() Aufrufe, um Race Conditions auf dynamischen Seiten zu umgehen.
  • Headless- und Headed-Modus. Führen Sie den Headless-Modus für mehr Geschwindigkeit in der Produktion aus und wechseln Sie mit einem einzigen booleschen Flag in den Headed-Modus für die Fehlersuche.
  • Netzwerk-Interception. Sie können Bilder, Stylesheets und Tracking-Skripte blockieren, um das Laden von Seiten zu beschleunigen, oder API-Antworten überprüfen, die die Seite im Hintergrund generiert.
  • Browserkontexte. Starten Sie isolierte, durch Cookies getrennte Sitzungen innerhalb einer einzigen Browserinstanz. Dies ist kostengünstiger als das Starten eines neuen Browsers pro Aufgabe und eignet sich perfekt für das gleichzeitige Scraping.

Diese Funktionen machen Playwright besonders geeignet für das Scraping dynamischer, mit JavaScript gerenderter Seiten, bei denen eine einfache HTTP-Anfrage nur wenig nützliches Markup zurückgibt.

Kernfunktionen von Playwright für das Scraping

Bevor Sie Ihr erstes Skript schreiben, ist es hilfreich zu verstehen, welche Playwright-Funktionen direkt auf gängige Scraping-Herausforderungen abzielen.

Automatisches Warten und intelligente Assertions. Wenn Sie page.locator('.price').text_content(), wartet Playwright, bis dieses Element im DOM vorhanden und sichtbar ist, bevor ein Wert zurückgegeben wird. Dies beseitigt die unzuverlässigen Timing-Probleme, die ältere Automatisierungstools plagen.

Netzwerk-Interception mit page.route(). Sie können jede ausgehende Anfrage abfangen, nicht benötigte Ressourcentypen (Bilder, Schriftarten, Analysen) blockieren, Header ändern oder sogar Mock-Antworten zurückgeben. Das Blockieren unnötiger Ressourcen kann die Ladezeiten von Seiten erheblich verkürzen, was wichtig ist, wenn Sie Tausende von Seiten scrapen.

Parallele Browserkontexte. Anstatt für jeden Scraping-Auftrag einen separaten Browserprozess zu starten, können Sie mehrere BrowserContext Objekte in einem einzigen Browser öffnen. Jeder Kontext verfügt über eigene Cookies, lokalen Speicher und Cache, sodass Sitzungen isoliert bleiben, ohne den Speicher-Overhead zusätzlicher Browserprozesse.

Integrierte Stealth-Funktionen. Die neueren Versionen von Playwright patchen standardmäßig mehrere gängige Automatisierungsindikatoren, wie beispielsweise das navigator.webdriver Flag. In Kombination mit Stealth-Plugins aus der Community können Sie Ihre Erkennungsfläche erheblich reduzieren.

Hooks für Anfrage- und Antwort-Ereignisse. Überwachen Sie Netzwerkereignisse mit page.on('response', ...) , um API-Nutzdaten direkt zu erfassen. Viele moderne SPAs rufen JSON von internen Endpunkten ab; das Abfangen dieser Antworten liefert oft sauberere Daten als das Parsen des gerenderten DOM.

Tracing und Debugging. Mit dem trace Viewer ermöglicht es Ihnen, eine Scraping-Sitzung Frame für Frame abzuspielen, einschließlich Screenshots, DOM-Snapshots und Netzwerkprotokollen. Dies ist von unschätzbarem Wert, wenn ein Selektor nicht mehr funktioniert und Sie verstehen müssen, was sich geändert hat.

Einrichten von Playwright für Python und Node.js

Playwright in beiden Sprachen in Betrieb zu nehmen, dauert weniger als zwei Minuten. Hier ist die Einrichtung für beide.

Python:

# Create a virtual environment and install playwright
pip install playwright
playwright install  # downloads Chromium, Firefox, and WebKit binaries

Node.js:

# Initialize a project and install playwright
npm init -y
npm install playwright
npx playwright install  # downloads browser binaries

Beide Installationsbefehle laden Browser-Binärdateien lokal herunter. Diese Binärdateien sind insgesamt etwa 200–400 MB groß, planen Sie also entsprechend, wenn Sie in einer CI/CD-Umgebung oder einem Docker-Container arbeiten. Sie können auch eine einzelne Browser-Engine installieren (zum Beispiel playwright install chromium), um Speicherplatz zu sparen.

Mindestanforderungen: Python 3.8+ oder Node.js 16+. Playwright verwaltet seine eigenen Browser-Binärdateien, sodass Sie keine Chrome- oder Firefox-Installation auf Systemebene benötigen.

Auswahl zwischen synchronen und asynchronen APIs

Das Python-SDK von Playwright bietet sowohl synchrone als auch asynchrone Schnittstellen. Die synchrone API ist einfacher und eignet sich gut für Single-Thread-Skripte, die Seiten nacheinander auslesen.

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(headless=True)
    page = browser.new_page()
    page.goto("https://example.com")
    print(page.title())
    browser.close()

Die asynchrone API nutzt Pythons asyncio und ist die bessere Wahl, wenn Sie mehrere Seiten gleichzeitig scrapen müssen. Damit können Sie mehrere Browserkontexte oder Seiten parallel innerhalb einer einzigen Ereignisschleife ausführen.

import asyncio
from playwright.async_api import async_playwright

async def scrape():
    async with async_playwright() as p:
        browser = await p.chromium.launch(headless=True)
        page = await browser.new_page()
        await page.goto("https://example.com")
        print(await page.title())
        await browser.close()

asyncio.run(scrape())

Wann welche Wahl: Verwenden Sie „sync“ für schnelle Skripte, Prototyping und sequenzielle Scraping-Aufgaben. Wechseln Sie zu „async“, wenn Sie Hunderte oder Tausende von Seiten scrapen und Parallelität benötigen, ohne mehrere Prozesse zu starten. In Node.js ist die API von Natur aus Promise-basiert (asynchron), sodass es keinen separaten Sync-Modus zur Auswahl gibt.

Ihr erstes Playwright-Scraping-Skript schreiben

Erstellen wir einen minimalen Scraper, der zu einer Seite navigiert, den <h1> Text extrahiert und ihn ausgibt. Dies veranschaulicht den Kern-Workflow, den Sie in jedem Playwright-Web-Scraping-Projekt verwenden werden.

Python (synchron):

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(headless=True)
    page = browser.new_page()
    page.goto("https://books.toscrape.com/")
    heading = page.locator("h1").text_content()
    print(f"Page heading: {heading}")
    browser.close()

Node.js:

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

(async () => {
    const browser = await chromium.launch({ headless: true });
    const page = await browser.newPage();
    await page.goto('https://books.toscrape.com/');
    const heading = await page.locator('h1').textContent();
    console.log(`Page heading: ${heading}`);
    await browser.close();
})();

Das Muster ist in beiden Sprachen dasselbe: Browser starten, Seite erstellen, navigieren, ein Element finden, dessen Inhalt extrahieren und aufräumen. Von hier aus lässt sich alles durch Hinzufügen weiterer Locators, Navigationsschritte und Datenverarbeitungslogik skalieren.

Ein paar Dinge, die zu beachten sind: headless: true (oder headless=True in Python) führt den Browser ohne sichtbares Fenster aus. Setze es auf false/False , wenn du die Interaktion des Browsers mit der Seite zum Debuggen beobachten musst. Die locator() Methode ist die von Playwright empfohlene Methode zum Auffinden von Elementen; sie gibt eine verzögerte Referenz zurück, die automatisch wartet und es erneut versucht.

Elemente mit CSS- und XPath-Selektoren finden

Das Auffinden der richtigen Elemente auf einer Seite ist die Kernkompetenz jedes Web-Scraping-Workflows mit Playwright. Playwright unterstützt CSS-Selektoren, XPath-Ausdrücke und eigene textbasierte Selektoren.

CSS-Selektoren sind die gängigste Wahl. Sie sind prägnant und leistungsstark:

# Python
titles = page.locator("article.product_pod h3 a")
for i in range(await titles.count()):
    print(await titles.nth(i).text_content())
// Node.js
const titles = page.locator('article.product_pod h3 a');
const count = await titles.count();
for (let i = 0; i < count; i++) {
    console.log(await titles.nth(i).textContent());
}

XPath-Selektoren sind nützlich, wenn die DOM-Struktur komplex ist oder Klassennamen dynamisch generiert werden:

# Python
price = page.locator("xpath=//p[@class='price_color']").first.text_content()

Mit textbasierten Selektoren können Sie Elemente anhand ihres sichtbaren Texts finden, was zuverlässiger sein kann als Klassennamen, die sich zwischen den Bereitstellungen ändern:

# Python
page.locator("text=Add to basket").click()

Ein praktischer Tipp: Verwenden Sie die Funktion „Selektor kopieren“ der Browser-Entwicklertools als Ausgangspunkt, vereinfachen Sie den generierten Selektor jedoch immer. Automatisch generierte Selektoren sind oft anfällig, da sie tief verschachtelte Pfade enthalten, die bei Layoutänderungen nicht mehr funktionieren. Bevorzugen Sie kurze, spezifische Selektoren, die an stabilen Attributen wie data-testid oder semantische Klassennamen.

Extrahieren von Textdaten aus Webseiten

Nachdem Sie Ihre Selektoren eingerichtet haben, besteht der nächste Schritt darin, strukturierte Daten aus einer Seite zu extrahieren. Hier finden Sie ein praktisches Playwright-Tutorial zum Scraping, das Buchtitel und Preise von einer Demo-Buchhandelsseite extrahiert.

Python:

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(headless=True)
    page = browser.new_page()
    page.goto("https://books.toscrape.com/")

    books = page.locator("article.product_pod")
    results = []
    for i in range(books.count()):
        book = books.nth(i)
        title = book.locator("h3 a").get_attribute("title")
        price = book.locator(".price_color").text_content()
        results.append({"title": title, "price": price})

    for r in results:
        print(f"{r['title']}: {r['price']}")
    browser.close()

Node.js:

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

(async () => {
    const browser = await chromium.launch({ headless: true });
    const page = await browser.newPage();
    await page.goto('https://books.toscrape.com/');

    const books = page.locator('article.product_pod');
    const count = await books.count();
    const results = [];
    for (let i = 0; i < count; i++) {
        const book = books.nth(i);
        const title = await book.locator('h3 a').getAttribute('title');
        const price = await book.locator('.price_color').textContent();
        results.push({ title, price });
    }
    console.log(results);
    await browser.close();
})();

Einige erwähnenswerte Muster: get_attribute("title") (Python) und getAttribute('title') (Node.js) extrahieren Attributwerte, nicht den inneren Text. Dies ist nützlich für Tooltip-Text, href-Werte und Datenattribute. Die text_content() Methode gibt den Rohtext innerhalb eines Elements zurück, während inner_text() den gerenderten (sichtbaren) Text zurückgibt. Zum Scrapen strukturierter Daten text_content() ist in der Regel die bessere Wahl, da sie schneller ist und keine Layoutberechnung auslöst.

Scraping und Herunterladen von Bildern

Text ist nur ein Teil des Ganzen. Viele Scraping-Projekte erfordern das Herunterladen von Bildern, PDFs oder anderen Binärdateien. Hier erfährst du, wie du mit Playwright Web Scraping Bild-URLs extrahierst und Dateien lokal speicherst.

Python:

import httpx
from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(headless=True)
    page = browser.new_page()
    page.goto("https://books.toscrape.com/")

    images = page.locator("article.product_pod img")
    base_url = "https://books.toscrape.com/"
    for i in range(images.count()):
        src = images.nth(i).get_attribute("src")
        full_url = base_url + src
        response = httpx.get(full_url)
        with open(f"image_{i}.jpg", "wb") as f:
            f.write(response.content)
        print(f"Saved image_{i}.jpg")
    browser.close()

Node.js:

const { chromium } = require('playwright');
const fs = require('fs');

(async () => {
    const browser = await chromium.launch({ headless: true });
    const page = await browser.newPage();
    await page.goto('https://books.toscrape.com/');

    const images = page.locator('article.product_pod img');
    const count = await images.count();
    const baseUrl = 'https://books.toscrape.com/';
    for (let i = 0; i < count; i++) {
        const src = await images.nth(i).getAttribute('src');
        const response = await page.request.get(baseUrl + src);
        fs.writeFileSync(`image_${i}.jpg`, await response.body());
        console.log(`Saved image_${i}.jpg`);
    }
    await browser.close();
})();

Die Node.js-Version nutzt den in Playwright integrierten page.request API-Kontext von Playwright, der Cookies und Header mit der Seitensitzung teilt. In Python wird eine externe HTTP-Bibliothek (wie httpx oder requests) gut. Wenn die Bilder hinter einer Authentifizierung liegen, verwenden Sie Playwrights eigenen Request-Kontext, um Session-Cookies automatisch zu übertragen.

Umgang mit Paginierung und unendlichem Scrollen

Praktisches Scraping passt selten auf eine einzige Seite. Sie werden auf nummerierte Paginierung, „Load More“-Schaltflächen und unendliche Scroll-Muster stoßen. Hier sind wiederverwendbare Ansätze für jeden Fall.

Nummerierte Paginierung (klicken Sie auf „Weiter“, bis der Button verschwindet):

# Python
results = []
while True:
    # Extract data from current page
    items = page.locator(".product_pod h3 a")
    for i in range(items.count()):
        results.append(items.nth(i).get_attribute("title"))

    next_btn = page.locator("li.next a")
    if next_btn.count() == 0:
        break
    next_btn.click()
    page.wait_for_load_state("networkidle")

print(f"Collected {len(results)} items across all pages")

Unendliches Scrollen (scrolle nach unten, bis keine neuen Inhalte mehr geladen werden):

// Node.js
let previousHeight = 0;
while (true) {
    await page.evaluate('window.scrollTo(0, document.body.scrollHeight)');
    await page.waitForTimeout(2000); // allow content to load
    const currentHeight = await page.evaluate('document.body.scrollHeight');
    if (currentHeight === previousHeight) break;
    previousHeight = currentHeight;
}
// Now extract all loaded items
const items = await page.locator('.item').allTextContents();

Das Endlos-Scroll-Muster vergleicht die Seitenhöhe vor und nach dem Scrollen. Wenn sich die Höhe nicht mehr ändert, haben Sie das Ende der Seite erreicht. Passen Sie das Timeout daran an, wie schnell die Zielseite neue Inhalte lädt. Bei „Mehr laden“-Schaltflächen ist der Ansatz ähnlich wie bei der nummerierten Paginierung: Suchen Sie die Schaltfläche, klicken Sie darauf, warten Sie auf neue Inhalte und wiederholen Sie den Vorgang.

HTTP-Anfragen abfangen und ändern

Eine der leistungsstärksten Funktionen von Playwright für das Scraping ist die Möglichkeit, Netzwerkanfragen mit page.route(). Damit können Sie unnötige Ressourcen blockieren, Header ändern oder API-Antworten direkt erfassen.

Bilder und Stylesheets blockieren für schnelleres Scraping:

# Python
def block_resources(route):
    if route.request.resource_type in ["image", "stylesheet", "font"]:
        route.abort()
    else:
        route.continue_()

page.route("**/*", block_resources)
page.goto("https://example.com")
// Node.js
await page.route('**/*', (route) => {
    const type = route.request().resourceType();
    if (['image', 'stylesheet', 'font'].includes(type)) {
        return route.abort();
    }
    return route.continue();
});
await page.goto('https://example.com');

Das Blockieren von Bildern, Schriftarten und CSS kann die Ladezeiten von Seiten auf medienintensiven Websites um 40–60 % reduzieren, was sich bei groß angelegten Scraping-Projekten schnell summiert.

Abfangen von API-Antworten: Viele SPAs rufen Daten von internen REST- oder GraphQL-Endpunkten ab. Anstatt das gerenderte DOM zu parsen, können Sie auf diese Antworten warten und das rohe JSON abrufen:

# Python
def capture_api(response):
    if "/api/products" in response.url:
        data = response.json()
        print(f"Captured {len(data['items'])} products from API")

page.on("response", capture_api)
page.goto("https://example-spa.com/products")

Diese Technik liefert oft sauberere, besser strukturierte Daten als DOM-Scraping und ist widerstandsfähiger gegenüber Layoutänderungen. Wie in der Playwright-Dokumentation zu Netzwerkereignissen erläutert, können Sie nach URL-Mustern, Antwortstatuscodes und Inhaltstypen filtern.

Konfigurieren von Proxys in Playwright

Wenn Sie in nennenswertem Umfang scrapen, benötigen Sie Proxys, um Anfragen auf verschiedene IP-Adressen zu verteilen. Playwright unterstützt die Proxy-Konfiguration auf Browserebene oder pro Kontext.

Proxy auf Browserebene:

# Python
browser = p.chromium.launch(
    headless=True,
    proxy={"server": "http://proxy-host:8080"}
)

Authentifizierter Proxy:

// Node.js
const browser = await chromium.launch({
    proxy: {
        server: 'http://proxy-host:8080',
        username: 'user',
        password: 'pass'
    }
});

Proxy auf Kontextebene (für Rotation): Ein praktisches Muster für die Proxy-Rotation besteht darin, für jeden Proxy einen neuen Browserkontext zu erstellen, sodass Sie eine Liste von Proxy-Adressen durchlaufen können:

# Python
proxies = ["http://proxy1:8080", "http://proxy2:8080", "http://proxy3:8080"]
for i, url in enumerate(urls_to_scrape):
    proxy = proxies[i % len(proxies)]
    context = browser.new_context(proxy={"server": proxy})
    page = context.new_page()
    page.goto(url)
    # ... scrape data ...
    context.close()

Für Produktions-Workloads sollten Sie einen Proxy-Anbieter in Betracht ziehen, der die Rotation und das Sitzungsmanagement für Sie übernimmt, damit sich Ihr Scraping-Code auf die Datenextraktion konzentrieren kann und nicht auf die Infrastruktur.

Anti-Erkennungstechniken und Stealth-Konfiguration

Websites nutzen verschiedene Techniken, um automatisierte Browser zu erkennen und zu blockieren. Für effektives Headless-Scraping mit Playwright ist es erforderlich, Ihren Automatisierungs-Fingerabdruck zu minimieren.

Die User-Agent-Rotation ist der einfachste Ansatzpunkt. Legen Sie über den Browserkontext eine realistische User-Agent-Zeichenkette fest:

# Python
context = browser.new_context(
    user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
)

Stealth-Plugins beheben häufige Automatisierungslücken. In Python wendet das playwright-stealth Paket wendet eine Reihe von Umgehungstechniken an (Verbergen navigator.webdriver, Fälschung von WebGL-Anbieter-Strings, Randomisierung von Plugin-Arrays):

# Python
from playwright_stealth import stealth_sync

page = browser.new_page()
stealth_sync(page)
page.goto("https://example.com")

In Node.js playwright-extra und puppeteer-extra-plugin-stealth Pakete ähnliche Funktionen.

Verhaltensimitation sorgt für eine weitere Schutzebene. Anstatt sofort zu Ihrem Zielelement zu springen, fügen Sie kleine zufällige Verzögerungen ein, scrollen Sie auf der Seite und bewegen Sie die Maus. Diese Mikroverhaltensweisen lassen Ihr Traffic-Muster menschlicher wirken:

import random, time
page.mouse.move(random.randint(100, 500), random.randint(100, 500))
time.sleep(random.uniform(0.5, 2.0))

Randomisierung von Viewport und Ländereinstellung. Die Einstellung einer realistischen Viewport-Größe, Zeitzone und Ländereinstellung für jeden Kontext reduziert Ihren Fingerabdruck weiter. Vermeiden Sie die Verwendung des standardmäßigen 800x600-Viewports, mit dem viele Automatisierungsskripte ausgeliefert werden.

Keine einzelne Technik ist ein Allheilmittel. Eine effektive Anti-Erkennung kombiniert Stealth-Plugins, Proxy-Rotation, realistische Browser-Fingerabdrücke und menschenähnliche Surfmuster.

Fehlerbehandlung, Wiederholungsversuche und Datenexport

Produktions-Scraper müssen mit Unvorhergesehenem umgehen können: Timeouts, Navigationsfehler, fehlende Elemente und Ratenbegrenzung. Hier erfahren Sie, wie Sie Ihre Playwright-Web-Scraping-Skripte widerstandsfähig gestalten und Ihre Ergebnisse speichern können.

Timeout-Behandlung:

# Python
from playwright.sync_api import TimeoutError as PlaywrightTimeout

try:
    page.goto("https://example.com", timeout=15000)
    title = page.locator("h1").text_content(timeout=5000)
except PlaywrightTimeout:
    print("Page or element load timed out")

Exponentieller Backoff für Wiederholungsversuche:

import time

def scrape_with_retry(page, url, max_retries=3):
    for attempt in range(max_retries):
        try:
            page.goto(url, timeout=15000)
            return page.locator("h1").text_content()
        except Exception as e:
            wait = 2 ** attempt
            print(f"Attempt {attempt+1} failed: {e}. Retrying in {wait}s")
            time.sleep(wait)
    return None

Export in CSV:

import csv

with open("results.csv", "w", newline="") as f:
    writer = csv.DictWriter(f, fieldnames=["title", "price"])
    writer.writeheader()
    writer.writerows(results)

Exportieren nach JSON:

// Node.js
const fs = require('fs');
fs.writeFileSync('results.json', JSON.stringify(results, null, 2));

Bei größeren Scraping-Projekten sollten Sie in Betracht ziehen, die Ergebnisse in eine Datenbank (SQLite für lokale Arbeiten, PostgreSQL für die Produktion) statt in Flatfiles zu schreiben. So können Sie unterbrochene Jobs fortsetzen, Datensätze deduplizieren und Ihre Daten abfragen, ohne alles in den Arbeitsspeicher laden zu müssen.

Playwright vs. Puppeteer vs. Selenium für Web-Scraping

Wenn Sie ein Browser-Automatisierungstool für das Scraping auswählen, sind diese drei die wichtigsten Kandidaten. Hier sehen Sie einen Vergleich der Aspekte, die für die Datenextraktion am wichtigsten sind.

Funktion

Playwright

Puppeteer

Selenium

Browser-Engines

Chromium, Firefox, WebKit

Chromium (Firefox experimentell)

Chrome, Firefox, Edge, Safari

Sprachunterstützung

Python, Node.js, Java, .NET

Node.js (Community-Port für Python)

Python, Java, C#, Ruby, JS

Automatisches Warten

Integriert

Manuelles Warten erforderlich

Manuelle Wartezeiten erforderlich

Netzwerküberwachung

Vollständig (page.route())

Vollständig (page.setRequestInterception())

Eingeschränkt (erfordert Proxy-Tools)

Parallele Kontexte

Native Browser-Kontexte

Inkognito-Kontexte

Separate WebDriver-Instanzen

Headless-Modus

Integriert, alle Browser

Integriert, nur Chromium

Hängt vom Browser-Treiber ab

Größe der Community

Wächst schnell

Groß, etabliert

Größte, etablierteste

Verstecktes Ökosystem

playwright-stealth, playwright-extra

puppeteer-extra-plugin-stealth

Begrenzte integrierte Optionen

<!-- Zusätzliche Recherche erforderlich: unabhängige Leistungsbenchmarks (Playwright vs. Puppeteer vs. Selenium – Latenz und Durchsatz), um diesen Funktionsvergleich durch quantitative Daten zu ergänzen -->

Wann Sie sich für Playwright entscheiden sollten: Sie benötigen Multi-Browser-Unterstützung, Ihr Team verwendet Python oder Node.js und Sie benötigen integrierte automatische Wartezeiten und Netzwerküberwachung ohne zusätzliche Bibliotheken. Es ist die modernste Option und eignet sich gut für das Scraping von JavaScript-intensiven Anwendungen.

Wann Sie sich für Puppeteer entscheiden sollten: Ihr Stack besteht ausschließlich aus Node.js und Sie zielen ausschließlich auf Chromium ab. Das Ökosystem von Puppeteer ist ausgereift, und viele bestehende Scraping-Rezepte sind dafür geschrieben.

Wann Sie Selenium wählen sollten: Sie müssen neben dem Scraping auch das Testen älterer Browser unterstützen, oder Ihr Unternehmen verfügt bereits über eine Selenium-Infrastruktur. Die Sprachunterstützung ist am breitesten, erfordert jedoch mehr Boilerplate-Code für moderne Scraping-Aufgaben.

Wichtige Erkenntnisse

  • Playwright verarbeitet dynamische Inhalte nativ. Dank automatischer Wartezeiten, Netzwerk-Interception und Multi-Browser-Unterstützung ist es eine gute Wahl für das Scraping von JavaScript-gerenderten Websites, die einfachere HTTP-Clients nicht bewältigen können.
  • Verwenden Sie sowohl Python als auch Node.js. Die API von Playwright ist sprachübergreifend nahezu identisch. Wählen Sie die Variante, die zu Ihrem bestehenden Stack passt, und wechseln Sie frei, wenn ein Projekt dies erfordert.
  • Blockieren Sie unnötige Ressourcen. Das Abfangen und Abbrechen von Bild-, Schriftart- und Stylesheet-Anfragen kann die Scraping-Zeiten erheblich verkürzen, insbesondere bei großem Umfang.
  • Setzen Sie auf mehrschichtige Anti-Erkennungsmaßnahmen. Stealth-Plugins allein reichen nicht aus. Kombinieren Sie sie mit Proxy-Rotation, User-Agent-Randomisierung, Viewport-Einstellungen und menschenähnlichen Verzögerungen für einen zuverlässigen Zugriff.
  • Planen Sie für Ausfälle. Umhüllen Sie jeden Navigations- und Extraktionsaufruf mit einer Fehlerbehandlung mit exponentiellem Backoff. Exportieren Sie Daten schrittweise, um bei langen Läufen den Fortschritt nicht zu verlieren.

FAQ

Ist Playwright besser als Selenium für das Web-Scraping?

Für das Scraping moderner, JavaScript-lastiger Websites bietet Playwright im Allgemeinen eine reibungslosere Erfahrung. Es verfügt über integrierte automatische Wartezeiten, native Netzwerküberwachung und Multi-Browser-Unterstützung, ohne dass zusätzliche Treiber erforderlich sind. Selenium hat ein breiteres Sprach-Ökosystem und eine größere Community, benötigt jedoch mehr Boilerplate-Code und Tools von Drittanbietern, um mit den scraping-spezifischen Funktionen von Playwright mithalten zu können.

Kann Playwright von Anti-Bot-Systemen erkannt werden?

Ja. Standardmäßig gibt das headless Playwright mehrere Automatisierungsindikatoren preis, die ausgefeilte Anti-Bot-Dienste erkennen können, darunter die navigator.webdriver Eigenschaft und spezifische Anomalien im Browser-Fingerabdruck. Stealth-Plugins reduzieren diese Angriffsfläche, aber kein Browser-Automatisierungstool ist vollständig unauffindbar. Websites, die fortschrittlichen Bot-Schutz einsetzen, können automatisierte Sitzungen dennoch auf der Grundlage von Verhaltensanalysen kennzeichnen.

Unterstützt Playwright Headless- und Head-Browser-Modi?

Ja. Geben Sie headless=True (Python) oder headless: true (Node.js) beim Starten des Browsers für den Headless-Betrieb. Setzen Sie den Wert auf false , um ein sichtbares Browserfenster zu öffnen. Der Headless-Modus ist schneller und verbraucht weniger Speicher, weshalb er die Standardeinstellung für das Scraping in der Produktion ist. Der Headed-Modus ist vor allem während der Entwicklung und beim Debuggen nützlich.

Wie gehen Sie mit CAPTCHAs um, wenn Sie mit Playwright scrapen?

CAPTCHAs dienen dazu, Automatisierung zu blockieren, und es gibt keine zuverlässige programmatische Lösung, die in einem Browser-Automatisierungstool integriert ist. Gängige Ansätze umfassen die Nutzung von CAPTCHA-Lösungsdiensten von Drittanbietern, die über API-Callbacks integriert werden, die Rotation von Residential-Proxys zur Reduzierung der CAPTCHA-Auslösehäufigkeit sowie die Verlangsamung der Anfragerate, um unter den Erkennungsschwellen zu bleiben. Für Scraping mit hohem Datenaufkommen ist ein verwalteter Scraping-Dienst, der CAPTCHAs transparent handhabt, oft der praktischste Weg.

Welche Programmiersprache eignet sich am besten für das Scraping mit Playwright?

Python und Node.js sind die beiden beliebtesten Optionen und bieten beide hervorragende Playwright-Unterstützung. Python wird bevorzugt, wenn Ihre Pipeline Datenanalyse-Bibliotheken wie pandas umfasst oder wenn Ihr Team bereits mit Python arbeitet. Node.js ist die naheliegende Wahl, wenn Ihr Stack JavaScript-zentriert ist oder Sie Frontend-Selektoren wiederverwenden möchten. Leistungsunterschiede zwischen den beiden Bindungen sind vernachlässigbar, da die eigentliche Browser-Automatisierung unabhängig von der aufrufenden Sprache in derselben zugrunde liegenden Engine ausgeführt wird.

Fazit

Playwright-Web-Scraping bietet Ihnen ein modernes, gut unterstütztes Toolkit zum Extrahieren von Daten aus Websites, die einfachere Ansätze überfordern. Von automatischem Warten und Netzwerk-Interception bis hin zu parallelen Browser-Kontexten und integrierter Tarnung übernimmt es die schwierigen Teile der Browser-Automatisierung, sodass Sie sich auf die Daten konzentrieren können.

Die hier behandelten Techniken, darunter Selektor-Strategien, Request-Interception, Proxy-Konfiguration, Anti-Detection, Paginierung und strukturierter Export, bilden die Grundlage jedes ernsthaften Scraping-Projekts. Beginnen Sie mit einem einfachen Skript, fügen Sie Fehlerbehandlung und Wiederholungsversuche hinzu und skalieren Sie mit asynchronen Kontexten, wenn Ihr Arbeitsaufkommen wächst.

Wenn Sie an den Punkt gelangen, an dem die Verwaltung von Proxys, CAPTCHAs und der Browser-Infrastruktur mehr Entwicklungszeit in Anspruch nimmt als die eigentliche Datenextraktion, sollten Sie in Erwägung ziehen, diese Ebene an einen dedizierten Dienst auszulagern. Unsere Scraper-API übernimmt Proxy-Rotation, CAPTCHA-Lösung und Anti-Bot-Umgehungen hinter einem einzigen Endpunkt, sodass Sie Ihre Playwright-Parsing-Logik beibehalten können und sich keine Gedanken mehr über die Request-Pipeline machen müssen.

Über den Autor
Mihnea-Octavian Manolache, Full-Stack-Entwickler @ WebScrapingAPI
Mihnea-Octavian ManolacheFull-Stack-Entwickler

Mihnea-Octavian Manolache ist Full-Stack- und DevOps-Entwickler bei WebScrapingAPI. Er entwickelt Produktfunktionen und sorgt für die Wartung der Infrastruktur, die den reibungslosen Betrieb der Plattform gewährleistet.

Los geht’s

Sind Sie bereit, Ihre Datenerfassung zu erweitern?

Schließen Sie sich den über 2.000 Unternehmen an, die WebScrapingAPI nutzen, um Webdaten im Unternehmensmaßstab ohne zusätzlichen Infrastrukturaufwand zu extrahieren.