Sie brauchen Daten von einer Website. Schreiben Sie einen Python-Scraper? Starten Sie Playwright? Nutzen Sie eine Browser-Erweiterung? Nach der Datenextraktion von Hunderten verschiedener Websites habe ich ein Framework für die Wahl des richtigen Tools entwickelt.
Die Optionen
| Ansatz | Läuft | JS-fähig | Login-Unterstützung | Setup-Zeit |
|---|---|---|---|---|
| Python + requests | Server | ❌ | Manuelle Cookies | 5 Min |
| Python + BeautifulSoup | Server | ❌ | Manuelle Cookies | 5 Min |
| Playwright/Puppeteer | Server | ✅ | Skriptbar | 15 Min |
| Browser-Erweiterung | Browser des Nutzers | ✅ | Automatisch | 0 Min |
| Copy-Paste | Browser des Nutzers | ✅ | Automatisch | 0 Min |
Jeder Ansatz hat Vor- und Nachteile. Schauen wir sie uns im Detail an.
Option 1: Python + Requests/BeautifulSoup
Am besten für: Statische HTML-Seiten, APIs, automatisierte Pipelines
import requests
from bs4 import BeautifulSoup
response = requests.get("https://example.com/data")
soup = BeautifulSoup(response.text, "html.parser")
table = soup.find("table")
rows = []
for tr in table.find_all("tr"):
row = [td.get_text(strip=True) for td in tr.find_all(["td", "th"])]
rows.append(row)
Vorteile:
- Schnelle Ausführung
- Einfach planbar (cron, Airflow)
- Kein Browser-Overhead
Einschränkungen:
- Führt kein JavaScript aus
- Viele moderne Websites rendern Tabellen clientseitig
- Authentifizierung erfordert manuelles Cookie-Handling
Wann es scheitert: Versuchen Sie, ein React-basiertes Dashboard zu scrapen. Das HTML, das Sie erhalten, ist ein leeres <div id="root"></div>.
Option 2: Headless Browser (Playwright/Puppeteer)
Am besten für: JavaScript-gerenderte Seiten, automatisierte Pipelines, Seiten die Interaktion erfordern
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch();
const page = await browser.newPage();
await page.goto('https://example.com/dashboard');
// Warten bis die Tabelle gerendert ist
await page.waitForSelector('table');
const data = await page.evaluate(() => {
const table = document.querySelector('table');
return Array.from(table.rows).map(row =>
Array.from(row.cells).map(cell => cell.textContent.trim())
);
});
console.log(data);
await browser.close();
})();
Vorteile:
- Führt JavaScript aus
- Kann mit Seiten interagieren (Klicks, Scrollen, Formulare)
- Skriptbare Authentifizierungs-Flows
Einschränkungen:
- Langsamer als direktes HTTP
- Ressourcenintensiv (Speicher, CPU)
- Komplexeres Error-Handling
- Websites können Headless-Browser erkennen
Wann es scheitert: Viele Websites erkennen Puppeteer/Playwright über Navigator-Eigenschaften, WebGL-Fingerprinting oder Verhaltensanalyse. Stealth-Plugins helfen, sind aber nicht narrensicher.
Option 3: Browser-Erweiterungen
Am besten für: Ad-hoc-Extraktion, authentifizierte Websites, nutzergesteuerte Workflows
Eine Browser-Erweiterung läuft in der tatsächlichen Browser-Sitzung des Nutzers, mit vollem Zugriff auf:
- Authentifizierte Sitzungen
- JavaScript-gerenderte Inhalte
- Exakt das DOM, das der Nutzer sieht
Einen Vergleich der besten Optionen finden Sie unter Die 5 besten Chrome-Erweiterungen zum Exportieren von Tabellen (2026).
// Content-Script in einer Chrome-Erweiterung
chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => {
if (msg.type === "EXTRACT_TABLE") {
const table = document.querySelector("table");
const data = Array.from(table.rows).map(row =>
Array.from(row.cells).map(cell => cell.textContent.trim())
);
sendResponse({ data });
}
});
Vorteile:
- Null Authentifizierungs-Aufwand – Sie sind bereits eingeloggt
- Sieht genau das, was Sie sehen (keine JS-Rendering-Probleme)
- Funktioniert auf jeder Website (keine Bot-Erkennung)
- Keine Server-Infrastruktur nötig
Einschränkungen:
- Erfordert manuelle Auslösung (Nutzer klickt)
- Kann nicht zeitgesteuert laufen
- Auf den Browser-Kontext beschränkt
Wann es scheitert: Sie müssen Daten von 10.000 Seiten automatisch extrahieren. Erweiterungen sind für nutzergesteuerte Workflows, nicht für Batch-Verarbeitung.
Entscheidungs-Framework
Python + requests verwenden, wenn:
- ✅ Die Seite servergerendertes HTML liefert
- ✅ Sie automatisierte/geplante Extraktion brauchen
- ✅ Sie eine Datenpipeline aufbauen
- ✅ Die Authentifizierung über API-Schlüssel oder einfache Cookies läuft
Playwright/Puppeteer verwenden, wenn:
- ✅ Die Seite JavaScript-Rendering erfordert
- ✅ Sie automatisierte/geplante Extraktion brauchen
- ✅ Sie interagieren müssen (scrollen, klicken, paginieren)
- ✅ Sie Bot-Erkennungs-Gegenmaßnahmen handhaben können
Eine Browser-Erweiterung verwenden, wenn:
- ✅ Sie bereits auf der Website eingeloggt sind
- ✅ Sie Daten gelegentlich brauchen (nicht automatisiert)
- ✅ Die Website starke Bot-Erkennung hat
- ✅ Sie Daten JETZT wollen, ohne Code zu schreiben
Einfach Copy-Paste, wenn:
- ✅ Einmalige Extraktion
- ✅ Einfache Tabellenstruktur
- ✅ Kein bestimmtes Format nötig
Praxisbeispiele
Beispiel 1: Wikipedia-Tabellen
Bester Ansatz: Browser-Erweiterung oder Python
Wikipedia liefert servergerendertes HTML ohne Authentifizierung. Python funktioniert einwandfrei:
import pandas as pd
url = "https://de.wikipedia.org/wiki/Liste_der_Staaten_der_Erde"
tables = pd.read_html(url)
df = tables[0]
Aber Wikipedia-Tabellen haben oft komplexe Rowspans und Navigationszeilen. Eine spezialisierte Erweiterung behandelt diese automatisch.
Eine Schritt-für-Schritt-Anleitung finden Sie unter Alle Zeilen einer paginierten Webtabelle exportieren.
Beispiel 2: Finanz-Dashboard (hinter Login)
Bester Ansatz: Browser-Erweiterung
Ihr Broker zeigt Portfoliodaten nach dem Login an. Optionen:
Python: Den Authentifizierungs-Flow reverse-engineeren, 2FA handhaben, Session-Cookies pflegen. Möglich, aber fragil.
Playwright: Den Login skripten, 2FA-Prompts behandeln, zu den Daten navigieren. Funktioniert, aber komplex.
Erweiterung: Normal einloggen, „Tabelle exportieren" klicken. Fertig.
Für gelegentliche Exporte gewinnt die Erweiterung bei der Zeit bis zur Datenbereitstellung.
Beispiel 3: Tägliches Preis-Monitoring (1000 Seiten)
Bester Ansatz: Playwright + Queue
Sie müssen täglich Preise auf 1000 Produktseiten prüfen. Das erfordert:
// Pseudocode für Batch-Extraktion
const urls = loadUrlsFromDatabase();
for (const url of urls) {
const page = await browser.newPage();
await page.goto(url);
await page.waitForSelector('.price');
const price = await page.evaluate(() =>
document.querySelector('.price').textContent
);
await saveToDatabase(url, price);
await page.close();
// Rate-Limiting
await sleep(randomBetween(1000, 3000));
}
Erweiterungen können das nicht – sie erfordern Nutzerinteraktion. Playwright ist das richtige Tool.
Beispiel 4: Einmalige Sport-Statistiken exportieren
Bester Ansatz: Browser-Erweiterung
FBRef hat komplexe zweistufige Überschriften. Sie brauchen die Statistiken dieser Saison einmal.
Python-Ansatz: 30 Minuten, um einen eigenen Parser für deren Tabellenstruktur zu schreiben.
Erweiterungs-Ansatz: Export klicken. 10 Sekunden.
Für einmalige Extraktion nicht über-engineeren.
Hybride Ansätze
Manchmal braucht man beides:
-
Erweiterung nutzen, um Authentifizierungs-Cookies zu exportieren
- Cookies aus einer eingeloggten Sitzung exportieren
- In Python/Playwright für Automatisierung importieren
-
Erweiterung zum Inspizieren der Struktur, Python zum Skalieren
- DOM mit den Erweiterungs-Tools manuell untersuchen
- Einen gezielten Scraper schreiben, sobald man die Struktur versteht
-
Playwright für Navigation, Erweiterung für Extraktion
- Skript navigiert zur Seite
- Ruft die Erweiterungs-API für komplexes Tabellen-Parsing auf
Mein Stack
Für die 80 % der Fälle, in denen ich Web-Tabellendaten brauche:
- Einmalig, authentifiziert: HTML Table Exporter (Browser-Erweiterung, die ich gebaut habe)
-
Einmalig, öffentliche Daten:
pd.read_html()oder Erweiterung - Automatisierte Pipeline: Playwright mit eigenen Parsern
- API verfügbar: Direkte API-Aufrufe (immer bevorzugt)
Das beste Tool hängt von der konkreten Extraktion ab. Passen Sie die Komplexität Ihrer Lösung an die Komplexität Ihres Problems an.
Was ist Ihr bevorzugter Extraktions-Ansatz? Mehr erfahren auf gauchogrid.com/de/html-table-exporter oder die Erweiterung kostenlos im Chrome Web Store testen.
Top comments (0)