Web Scraping mit Claude Code: Playwright, Puppeteer & KI-Parsing 2026

Web Scraping war früher mühsam: CSS-Selektoren raten, JavaScript-Heavy Sites debuggen, Anti-Bot-Maßnahmen umgehen. Claude Code beschleunigt jeden Schritt — vom Playwright-Skript bis zur strukturierten Datenextraktion mit KI.

Anwendungsfälle: Wann lohnt Web Scraping?

Preis-Monitoring

Competitor-Preise täglich tracken, Alert bei Preisänderungen

Content Research

Blog-Posts, News-Artikel für Analyse oder AI-Training aggregieren

Lead-Generierung

Öffentliche Unternehmensverzeichnisse, Jobbörsen systematisch auslesen

Data Pipeline

Öffentliche APIs ohne API nutzen — Tabellen, Listen, PDFs extrahieren

Playwright-Skripte mit Claude Code generieren

PlaywrightProduktdaten scrapen

# Prompt an Claude Code: Erstelle ein Playwright-Skript das: - Die Seite https://example-shop.com/products aufruft - Alle Produktkarten (.product-card) extrahiert - Pro Produkt: Name, Preis, Verfügbarkeit, Bild-URL - Pagination unterstützt (Weiter-Button klicken bis kein Weiter mehr) - Ergebnis als JSON-Array in products.json speichert - Rate-Limiting: 1-2s Delay zwischen Requests # Claude Code generiert: const { chromium } = require('playwright'); const fs = require('fs'); async function scrapeProducts() { const browser = await chromium.launch({ headless: true }); const page = await browser.newPage(); // Realistischer User-Agent await page.setExtraHTTPHeaders({ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36' }); const allProducts = []; let pageNum = 1; while (true) { await page.goto(`https://example-shop.com/products?page=${pageNum}`); await page.waitForSelector('.product-card', { timeout: 10000 }); const products = await page.evaluate(() => { return Array.from(document.querySelectorAll('.product-card')).map(card => ({ name: card.querySelector('.product-name')?.textContent?.trim(), price: card.querySelector('.price')?.textContent?.trim(), available: !card.querySelector('.out-of-stock'), imageUrl: card.querySelector('img')?.src })); }); allProducts.push(...products); const nextBtn = await page.$('[aria-label="Nächste Seite"]:not([disabled])'); if (!nextBtn) break; pageNum++; await page.waitForTimeout(1000 + Math.random() * 1000); // 1-2s Random Delay } await browser.close(); fs.writeFileSync('products.json', JSON.stringify(allProducts, null, 2)); console.log(`Scraped ${allProducts.length} products`); } scrapeProducts();

KI-gestütztes HTML-Parsing

Der klassische Scraping-Ansatz ist fragil: ändert sich die CSS-Klasse, bricht alles. Claude Code bietet eine bessere Alternative: HTML direkt mit KI parsen.

KI-ParsingStrukturierte Daten aus HTML extrahieren

# Prompt: "Extrahiere Stellenanzeigen aus diesem HTML — ohne CSS-Selektor-Abhängigkeit" async function parseJobListingsWithAI(html) { const response = await claude.messages.create({ model: 'claude-haiku-4-5', // Günstig für Bulk-Parsing max_tokens: 2048, messages: [{ role: 'user', content: `Extrahiere alle Stellenanzeigen aus diesem HTML als JSON-Array. Schema: { "title": string, "company": string, "location": string, "salary": string|null, "url": string } Nur JSON zurückgeben, kein Markdown. HTML: ${html.substring(0, 8000)}` // Max ~8000 chars per API-Call }] }); return JSON.parse(response.content[0].text); } // Vorteil: Funktioniert auch wenn sich HTML-Struktur ändert // Nachteil: Kosten pro Call — Haiku ist ~50x günstiger als Sonnet
Wann KI-Parsing vs. Selektoren? KI-Parsing lohnt sich wenn: (1) die Seite sich regelmäßig ändert, (2) die Struktur komplex und verschachtelt ist, (3) du natürlichsprachliche Extraktion brauchst ("finde den Preis nach dem Rabatt"). Für stabile, einfache Strukturen sind CSS-Selektoren schneller und günstiger.

JavaScript-Heavy Sites: SPAs scrapen

SPAReact/Vue Apps scrapen

# Problem: Content wird per JS geladen — im HTML noch nicht da # Claude Code Prompt: "Die Seite lädt Daten lazy per API. Wie scrappe ich?" # Methode 1: Network-Requests abfangen (BESSER als DOM-Scraping) await page.route('**/api/products**', async route => { const response = await route.fetch(); const json = await response.json(); // JSON direkt nutzen — stabiler als DOM! allData.push(...json.data); await route.continue(); }); await page.goto('https://example.com/products'); await page.waitForLoadState('networkidle'); # Methode 2: Auf spezifisches Element warten await page.waitForSelector('[data-testid="product-list"]', { state: 'visible', timeout: 30000 }); # Dann erst scrapen

Anti-Bot-Erkennung umgehen

StealthErkennung minimieren

# Claude Code generiert Stealth-Setup: const { chromium } = require('playwright-extra'); const stealth = require('puppeteer-extra-plugin-stealth'); chromium.use(stealth()); const browser = await chromium.launch({ headless: true, args: [ '--disable-blink-features=AutomationControlled', '--no-sandbox' ] }); const context = await browser.newContext({ userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', viewport: { width: 1280, height: 800 }, locale: 'de-DE', timezoneId: 'Europe/Berlin' }); // Human-like Delays zwischen Actions async function humanDelay(min = 800, max = 2000) { await new Promise(r => setTimeout(r, min + Math.random() * (max - min))); }
Grenzen: Cloudflare Turnstile, hCaptcha und moderne Bot-Detection sind mit einfachen Stealth-Plugins nicht mehr zu umgehen. Für solche Sites: offizielle APIs nutzen oder Scraping-Services wie Bright Data, ScrapingBee, Apify.

Strukturierte Daten-Pipeline

PipelineScraping + Cleaning + Storage

# Vollständige Pipeline: Scrape → Clean → Store # Claude Code Prompt: "Baue eine Preis-Monitoring-Pipeline die täglich läuft" async function priceMonitoringPipeline() { // 1. Scrape const rawData = await scrapeProductPrices(); // 2. Clean mit Claude (Preis-Parsing ist oft chaotisch) const cleaned = await Promise.all(rawData.map(async item => { if (!item.priceRaw) return null; // Claude parst "ab 19,99 €*" → 19.99 const parsed = await claude.messages.create({ model: 'claude-haiku-4-5', max_tokens: 64, messages: [{ role: 'user', content: `Extrahiere nur die Zahl aus: "${item.priceRaw}". Antworte nur mit der Zahl (z.B. 19.99)` }] }); return { ...item, price: parseFloat(parsed.content[0].text), scrapedAt: new Date().toISOString() }; })); // 3. Preisänderungen prüfen + Alert for (const item of cleaned.filter(Boolean)) { const prev = await db.prices.findLatest(item.productId); if (prev && Math.abs(item.price - prev.price) / prev.price > 0.05) { // >5% Preisänderung → Alert await sendAlert(`Preisänderung: ${item.name} ${prev.price}€ → ${item.price}€`); } await db.prices.insert(item); } } // Cron: täglich um 08:00 // node-cron.schedule('0 8 * * *', priceMonitoringPipeline);

Scraping mit Playwright MCP

# Claude Code kann direkt als Scraping-Agent fungieren: # Mit Playwright MCP kann Claude Code live Websites besuchen # In Claude Code (wenn MCP konfiguriert): # "Besuche https://example.com/products und extrahiere alle Produktnamen und Preise" # Claude Code öffnet Browser, navigiert, extrahiert — kein Code schreiben nötig! # Für Einmal-Scraping → MCP direkt # Für regelmäßige Pipelines → Playwright-Skript generieren lassen
Scraping-Workflow mit Claude Code:
  1. Ziel-URL + gewünschte Daten beschreiben
  2. Claude Code generiert Playwright-Skript mit korrekten Selektoren
  3. Skript testen → Fehler als Screenshot an Claude Code → Fix
  4. Cleaning-Logik (Preis-Parsing, Normalisierung) mit KI ergänzen
  5. Cron-Job für Automatisierung

Web Scraping im Kurs

Im Claude Code Mastery Kurs: vollständige Scraping-Pipelines mit Playwright, KI-gestütztes HTML-Parsing, Anti-Detection-Strategien und Daten-Pipelines mit automatischer Preis-Überwachung — produktionsreif und wartbar.

14 Tage kostenlos testen →