Warum DataDome deinen Scraper blockiert — und was du dagegen tun kannst
Du hast deinen Scraper sorgfältig gebaut, Rate-Limits respektiert, und trotzdem: 403 Forbidden — begleitet von einem datadome-Cookie, das du nie angefordert hast. Willkommen bei DataDome, einem der aggressivsten Bot-Defense-Systeme auf dem Markt.
Dieser Artikel geht tief in die Technik: Welche Signale DataDome sammelt, wie der Challenge-Flow funktioniert, und — ganz praktisch — wie legitime Automatisierung (Sicherheitsforschung, autorisiertes Pentesting, legitimes Scraping) sauber an DataDome vorbeikommt, ohne CAPTCHA-Solver oder andere fragwürdige Methoden.
Wichtig: Dieser Artikel richtet sich an legitime Automatisierung — Security Research, autorisierte Penetration Tests, und Scraping im Rahmen der ToS. DataDome schützt berechtigt vor Abuse. Wer CAPTCHAs mit Solvern knackt oder ToS bricht, handelt illegitim.
DataDomes Detection-Stack: Vier Ebenen der Erkennung
DataDome ist kein einfacher IP-Blocker. Das System operiert auf vier Ebenen gleichzeitig und korreliert Signale in Echtzeit. Wer nur eine Ebene adressiert, fällt auf der nächsten auf.
Ebene 1: IP-Reputation und ASN-Analyse
DataDome betreibt eine der umfangreichsten IP-Reputations-Datenbanken. Jede eingehende Verbindung wird gegen mehrere Quellen geprüft:
- Kommerzielle IP-Datenbanken (MaxMind, IP2Location etc.) — Datacenter-IPs werden direkt als Hosting-Range klassifiziert.
- ASN-Analyse — ASNs von Cloud-Providern (AWS, Hetzner, OVH, DigitalOcean) werden aggressiv geflaggt. DataDome weiß, dass echte Nutzer selten aus AWS eu-central-1 kommen.
- Historische IP-Behavior — IPs, die in der Vergangenheit auffällige Request-Muster zeigten, werden blockiert, unabhängig von der ASN.
Praktische Konsequenz: Ein Request aus einem AWS-IP-Range wird mit 99%+ Wahrscheinlichkeit blockiert, bevor TLS- oder Browser-Fingerprints überhaupt ausgewertet werden. Das ist der Hauptgrund, warum residential und mobile Proxies für DataDome-geschützte Sites essenziell sind.
Ebene 2: TLS-Fingerprinting (JA3/JA4)
Bevor der HTTP-Request überhaupt ankommt, analysiert DataDome den TLS-Handshake. Die zwei wichtigsten Methoden:
JA3 hasht die Reihenfolge der ClientHello-Parameter:
- TLS-Version
- Unterstützte Cipher-Suites (in exakter Reihenfolge)
- TLS-Erweiterungen
- Elliptic Curves
- Elliptic Curve Point Formats
JA4 erweitert JA3 um:
- ALPN-Protokolle (h2, http/1.1)
- SNI-Informationen
- Signature-Algorithm-Details
Warum das kritisch ist: requests, axios, got und rohe HTTP-Clients produzieren JA3-Hashes, die sich drastisch von echten Browsern unterscheiden. Ein Chrome 120 auf Windows erzeugt einen spezifischen JA3-Hash — dein Python-Script einen völlig anderen. DataDome blockiert bekannte nicht-Browser-JA3-Hashes direkt.
Selbst curl hat einen charakteristischen JA3-Fingerprint, der sofort erkannt wird:
# curl mit residential Proxy — der JA3-Hash verrät curl trotzdem
curl -x http://user-country-FR:PASSWORD@gate.proxyhat.com:8080 \
-H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" \
"https://datadome-protected-site.com/"
# → Blockiert, weil der JA3-Hash nicht zu einem echten Browser passt
Ebene 3: Browser-Fingerprinting (Canvas, WebGL, Audio, Navigator)
Sobald JavaScript im Browser läuft, sammelt DataDome umfangreiche Signale:
- Canvas Fingerprinting — Rendert versteckte Texte/Formen und hasht die Pixel-Ausgabe. Unterschiedliche GPUs, Treiber und Betriebssysteme produzieren unterschiedliche Hashes.
- WebGL-Parameter —
RENDERER,VENDOR, unterstützte Extensions und Max-Texture-Size. Headless-Browser zeigen oftSwiftShaderals Renderer — ein sofortiger Red-Flag. - AudioContext-Fingerprinting — Versteckte Audio-Signale werden prozessiert und das Ergebnis gehasht. Virtualisierte Umgebungen produzieren abweichende Werte.
- Navigator-Eigenschaften —
navigator.webdriver(in unmodifiziertem Playwright =true),navigator.plugins.length(headless = 0),navigator.languages,screen.colorDepth, und dutzende weitere. - Font-Metrik-Enumeration — Misst die Breite von Zeichen in verschiedenen Fonts. Headless-Umgebungen haben oft weniger installierte Fonts.
Das kritische Detail: Einzelne Signale reichen nicht zur Blockierung. DataDome baut einen Fingerprint-Vektor und vergleicht ihn mit bekannten Bot-Mustern. Ein navigator.webdriver=true plus SwiftShader plus fehlende Plugins = Bot. Aber auch subtilere Kombinationen werden erkannt.
Ebene 4: Verhaltenssignale (Mouse, Scroll, Timing)
Die vierte Ebene analysiert, wie der Nutzer mit der Seite interagiert:
- Mouse Dynamics — Geschwindigkeit, Beschleunigung, Kurven. Ein Bot klickt direkt auf einen Link ohne Mausbewegung. Echte Nutzer bewegen die Maus organisch.
- Scroll-Patterns — Gleichmäßiges, maschinelles Scrollen vs. natürliches Scrollen mit Pausen und Richtungswechseln.
- Timing-Anomalien — Seiten, die in 50ms vollständig gelesen wurden. Klicks, die exakt 2000ms nach Seitenladung erfolgen. Menschen sind variabel; Bots sind präzise.
- Touch-Events auf Mobile — Touch-Flächen, Druck, Dauer. Emulierte Touch-Events fehlen typische Fingerabdruck-Muster.
Der DataDome-Cookie und CAPTCHA-Challenge-Flow
Wenn DataDome einen Request verdächtig findet, läuft dieser Flow ab:
- Erster Request trifft ein. DataDomes Edge (meist ein Reverse-Proxy vor der Ziel-Site) bewertet IP + JA3-Hash.
- Bei niedrigem Risiko: Request wird durchgelassen. Ein
datadome-Cookie wird gesetzt (Session-Token für zukünftige Requests). - Bei mittlerem Risiko: JavaScript-Challenge wird injiziert. Der Browser muss Canvas, WebGL, Audio, und Verhaltens-Signale liefern. Erfolgreiche Validierung →
datadome-Cookie. - Bei hohem Risiko: CAPTCHA-Challenge (meist hCaptcha). Nach erfolgreicher Lösung →
datadome-Cookie. - Nachfolgende Requests mit gültigem
datadome-Cookie werden schneller verarbeitet, aber das Cookie wird periodisch revalidiert.
Wichtig: Das datadome-Cookie ist an den ursprünglichen Fingerprint gebunden. Wenn sich dein Fingerprint ändert (anderer Proxy-Typ, anderer Browser), wird das Cookie invalidiert.
Warum residential und mobile Proxies für DataDome essenziell sind
DataDomes IP-Reputations-System ist die erste und aggressivste Hürde. Datacenter-IPs werden mit extrem hoher Wahrscheinlichkeit blockiert — unabhängig davon, wie gut dein Browser-Fingerprint ist.
| Proxy-Typ | DataDome-Erkennungswahrscheinlichkeit | Begründung |
|---|---|---|
| Datacenter | Sehr hoch (95%+) | ASN ist als Hosting-Provider klassifiziert; kommerzielle DBs flaggen die Range |
| Residential (statisch) | Niedrig | ISP-ASN, legitime IP-Range; aber langfristige Nutzung kann auffallen |
| Residential (rotierend) | Sehr niedrig | Neue IP pro Request; ISP-ASN; schwer zu korrelieren |
| Mobile (3G/4G/5G) | Minimal | Mobilfunk-ASN; DataDome erwartet mobilen Traffic; höchste Vertrauensstufe |
Mobilfunk-Proxies haben den höchsten Trust-Level, weil DataDome (und ähnliche Systeme) wissen, dass ein großer Teil des legitimen Traffics von Mobilgeräten kommt. Eine IP aus der Vodafone-DE-ASN ist für DataDome völlig normal — eine IP aus der Hetzner-ASN ist es nicht.
Mit ProxyHat kannst du gezielt residential oder mobile Proxies mit Geo-Targeting nutzen:
# Residential Proxy — Frankreich
curl -x http://user-country-FR:PASSWORD@gate.proxyhat.com:8080 \
"https://example.com/"
# Mobile Proxy — Deutschland
curl -x http://user-country-DE:PASSWORD@gate.proxyhat.com:8080 \
"https://example.com/"
# Sticky Session — wichtig für DataDome-Cookie-Erhalt
# Session bleibt für die Dauer der Session auf derselben IP
curl -x http://user-country-DE-session-mySession123:PASSWORD@gate.proxyhat.com:8080 \
"https://example.com/"
Legitime Automatisierung: So konfigurierst du Playwright Stealth mit residential Proxies
Der Schlüssel zu sauberer Automatisierung ist einfach: Verhalte dich wie ein echter Nutzer. Das bedeutet einen unmodifizierten Browser, residential Proxies, und menschliche Interaktionsmuster.
Python: Playwright mit Stealth und residential Proxy
from playwright.sync_api import sync_playwright
from playwright_stealth import stealth_sync
import random, time
PROXY_URL = "http://user-country-DE-session-abc123:PASSWORD@gate.proxyhat.com:8080"
TARGET = "https://datadome-protected-site.com/"
with sync_playwright() as p:
browser = p.chromium.launch(
headless=True,
proxy={"server": PROXY_URL},
args=["--disable-blink-features=AutomationControlled"]
)
context = browser.new_context(
viewport={"width": 1920, "height": 1080},
locale="de-DE",
timezone_id="Europe/Berlin",
user_agent=(
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/125.0.0.0 Safari/537.36"
),
)
page = context.new_page()
stealth_sync(page)
# Menschliche Navigation: kurze Pause vor der Seite
time.sleep(random.uniform(1.5, 3.5))
page.goto(TARGET, wait_until="domcontentloaded")
# Menschliche Interaktion: scrollen, bewegen, dann klicken
time.sleep(random.uniform(2.0, 4.0))
page.mouse.move(random.randint(100, 800), random.randint(100, 600))
page.evaluate("window.scrollBy(0, 300)")
time.sleep(random.uniform(1.0, 2.5))
# Daten extrahieren
content = page.content()
print(f"Seite geladen: {len(content)} Zeichen")
# Datadome-Cookie prüfen
cookies = context.cookies()
dd_cookies = [c for c in cookies if "datadome" in c["name"]]
if dd_cookies:
print(f"DataDome-Cookie erhalten: {dd_cookies[0]['value'][:20]}...")
else:
print("Kein DataDome-Cookie — möglicherweise blockiert")
browser.close()
Node.js: Playwright Stealth mit ProxyHat
const { chromium } = require('playwright');
const { stealthSync } = require('puppeteer-extra-plugin-stealth');
const PROXY_URL = 'http://user-country-DE-session-nodeSess1:PASSWORD@gate.proxyhat.com:8080';
const TARGET = 'https://datadome-protected-site.com/';
function randomDelay(min, max) {
return new Promise(r => setTimeout(r, min + Math.random() * (max - min)));
}
(async () => {
const browser = await chromium.launch({
headless: true,
proxy: { server: PROXY_URL },
args: ['--disable-blink-features=AutomationControlled'],
});
const context = await browser.newContext({
viewport: { width: 1920, height: 1080 },
locale: 'de-DE',
timezoneId: 'Europe/Berlin',
userAgent:
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) ' +
'AppleWebKit/537.36 (KHTML, like Gecko) ' +
'Chrome/125.0.0.0 Safari/537.36',
});
const page = await context.newPage();
await stealthSync(page);
await randomDelay(1500, 3500);
await page.goto(TARGET, { waitUntil: 'domcontentloaded' });
await randomDelay(2000, 4000);
await page.mouse.move(
100 + Math.floor(Math.random() * 700),
100 + Math.floor(Math.random() * 500)
);
await page.evaluate(() => window.scrollBy(0, 300));
await randomDelay(1000, 2500);
const cookies = await context.cookies();
const ddCookie = cookies.find(c => c.name.includes('datadome'));
if (ddCookie) {
console.log('DataDome-Cookie erhalten:', ddCookie.value.substring(0, 20) + '...');
} else {
console.log('Kein DataDome-Cookie — möglicherweise blockiert');
}
await browser.close();
})();
Python: Mobile Proxy für maximale Vertrauensstufe
import requests
# Mobile Proxy — höchste Vertrauensstufe bei DataDome
# Achtung: requests allein reicht nicht für JS-Challenges
# Nur für API-Endpunkte nutzbar, die keine JS-Challenge erfordern
proxies = {
"http": "http://user-country-FR:PASSWORD@gate.proxyhat.com:8080",
"https": "http://user-country-FR:PASSWORD@gate.proxyhat.com:8080",
}
headers = {
"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 17_5 like Mac OS X) "
"AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 "
"Mobile/15E148 Safari/604.1",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language": "fr-FR,fr;q=0.9",
}
response = requests.get(
"https://api.example.com/public-data",
headers=headers,
proxies=proxies,
timeout=30,
)
print(f"Status: {response.status_code}")
print(f"Content-Length: {len(response.content)}")
Was legitimen Zugang ausmacht — und was nicht
Legitim:
- Unmodifizierter Browser — Playwright mit Stealth-Plugin, kein
--headless=newohne Kompensation, keine entfernten WebDriver-Flags. - Residential oder mobile Proxies — Geo-match zum Ziel-Publikum (französische Site → FR-Proxy).
- Menschliche Geschwindigkeit — Zufällige Delays, natürliches Scrollen, Mausbewegungen.
- Rate-Limit-Respekt — Nicht 100 Requests pro Sekunde von einer Session.
- CAPTCHAs akzeptieren — Wenn ein CAPTCHA kommt, ist das ein Signal, dass der Zugriffsweg erkannt wurde. Nicht mit Solvern umgehen.
Nicht legitim:
- CAPTCHA-Solver (2Captcha, Anti-Captcha etc.) — Das ist aktives Umgehen von Sicherheitsmaßnahmen.
- Header-Spoofing ohne Browser-Backing — JA3-Hash passt nicht zu den behaupteten Headern.
- Massen-Scraping jenseits der ToS — Wenn die Site 10 Requests/Minute erlaubt, nicht 1000 senden.
- Credential-Stuffing oder Account-Takeover — Ganz klar illegitim.
Ethischer Rahmen: Warum DataDome existiert und wie man respektvoll automatisiert
DataDome schützt Sites gegen reale Bedrohungen: Credential-Stuffing, Scalper-Bots, DDoS, Content-Scraping im industriellen Maßstab. Das ist legitim und wichtig.
Wenn du automatisierst, gilt derselbe ethische Rahmen wie überall:
- Prüfe die robots.txt — Wenn
Disallowfür deinen Pfad gilt, respektiere das. - Prüfe die ToS — Manche Sites erlauben ausdrücklich kein Scraping.
- Rate-Limits respektieren — Nicht versuchen, mit 1000 Requests/s an DataDome vorbeizukommen.
- DSGVO/GDPR und CCPA — Personenbezogene Daten dürfen nicht ohne Rechtfertigung gescraped werden.
- CAPTCHAs sind Grenzen — Wenn DataDome ein CAPTCHA zeigt, ist das die Site, die sagt: „Bitte nicht automatisieren."
Wenn DataDome bedeutet: Nutze die offizielle API
Manche Sites setzen DataDome gerade weil sie eine API anbieten und keinen Scraping-Verkehr wollen. Beispiele:
- Große Nachrichtenverlage — Viele bieten API-Zugang über NYTimes API oder ähnliche Programme an.
- E-Commerce-Plattformen — Einige bieten Affiliate- oder Partner-APIs mit strukturierten Produktdaten.
- Reise- und Buchungsplattformen — Oft gibt es offizielle Partner-APIs.
Bevor du DataDome-geschützte Sites scrapst, prüfe:
- Gibt es eine offizielle API? (Oft unter
/developers,/api, oderdeveloper.example.com) - Ist der Datenzugang in den ToS erlaubt?
- Ist der Aufwand für eine API-Integration geringer als der für Bot-Defense-Umgehung?
Die Antwort ist oft: Ja, die API ist der bessere Weg. DataDome ist dann kein Hindernis, sondern ein Hinweis.
Geo-Targeting: Warum der richtige Standort wichtig ist
DataDome berücksichtigt auch Geo-Konsistenz. Wenn ein Nutzer mit deutscher IP plötzlich französische Inhalte abfragt, kann das ein Signal sein. Mit ProxyHat kannst du Geo-Targeting präzise steuern:
# Stadt-Level Geo-Targeting für maximale Konsistenz
# Deutsche IP für deutsche Ziel-Site
curl -x http://user-country-DE-city-berlin:PASSWORD@gate.proxyhat.com:8080 \
"https://deutsche-ziel-site.de/"
# Französische IP für französische Ziel-Site
curl -x http://user-country-FR-city-paris:PASSWORD@gate.proxyhat.com:8080 \
"https://site-francais.fr/"
Key Takeaways
- DataDome operiert auf vier Ebenen: IP-Reputation, TLS-Fingerprinting, Browser-Fingerprinting, und Verhaltensanalyse. Nur eine Ebene zu adressieren reicht nicht.
- Datacenter-IPs werden fast immer blockiert — residential und mobile Proxies sind für DataDome-geschützte Sites essenziell.
- JA3/JA4-Fingerprints verraten HTTP-Clients — ein echter Browser (Playwright Stealth) löst das Problem,
requestsodercurlallein nicht. - Browser-Fingerprints müssen konsistent sein —
navigator.webdriver, Canvas, WebGL, und Plugins müssen zusammenpassen. - Verhaltenssignale simulieren — zufällige Delays, Mausbewegungen, und natürliches Scrollen sind notwendig.
- Sticky Sessions — DataDome-Cookies sind an IP und Fingerprint gebunden. Nutze Session-Persistenz, um die IP zu halten.
- CAPTCHAs sind Grenzen — Solver zu nutzen ist illegitim. Wenn ein CAPTCHA kommt, ist das ein Signal, den Ansatz zu überdenken.
- Offizielle APIs prüfen — oft der einfachere und legitime Weg.
Wenn du DataDome-geschützte Sites legitim automatisieren musst, starte mit residential Proxies von ProxyHat, einem ordentlich konfigurierten Playwright-Stealth-Browser, und menschlichen Interaktionsmustern. Und wenn du eine offizielle API nutzen kannst — nimm sie.






