⚖️ Rechtlicher Hinweis: Web Scraping kann rechtlich problematisch sein. Prüfe immer: robots.txt, Terms of Service, DSGVO. Für öffentliche Daten ohne Login meist OK — für Produktdaten, personenbezogene Daten oder Login-Bereiche: Rechtsbeistand einholen. Claude Code hilft dir, robots.txt zu parsen und ToS zu analysieren.
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:
- Ziel-URL + gewünschte Daten beschreiben
- Claude Code generiert Playwright-Skript mit korrekten Selektoren
- Skript testen → Fehler als Screenshot an Claude Code → Fix
- Cleaning-Logik (Preis-Parsing, Normalisierung) mit KI ergänzen
- 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 →