Sie haben Residential-Proxys gekauft, einen frischen User-Agent für Chrome eingestellt, und die Website gibt trotzdem beim ersten Anfrage einen 403 zurück. Kommt Ihnen das bekannt vor? Das Problem liegt nicht an der IP und nicht an den Headern. Sie wurden erkannt, noch bevor der Server auch nur einen HTTP-Header gelesen hat – durch das TLS-Handschlag. Im Jahr 2026 ist dies der Hauptvektor zur Erkennung, und gewöhnliche requests scheitern automatisch daran. Lassen Sie uns untersuchen, wie das funktioniert und wie man es mit ein paar Codezeilen über curl_cffi behebt.
Was passiert: Sie werden durch das TLS-Handschlag erkannt
Wenn ein Client eine HTTPS-Verbindung herstellt, sendet er zunächst das ClientHello-Paket – noch bevor irgendein HTTP gesendet wird. In diesem Paket sind aufgeführt: die TLS-Version, die Liste der unterstützten Cipher-Suiten, TLS-Erweiterungen (SNI, ALPN, supported_groups), elliptische Kurven und Punktformate. Die Reihenfolge und der Inhalt dieser Felder sind bei verschiedenen Clients unterschiedlich – und daran kann der Client erkannt werden, bevor er auch nur ein Wort sagt.
Aus diesen Feldern wird ein Fingerabdruck erstellt. JA3 (Standard von 2017) nimmt eine Zeichenkette der Form TLSVersion,Ciphers,Extensions,EllipticCurves,ECPointFormats und hasht sie mit MD5, um eine 32-stellige Signatur zu erhalten. Das Problem mit JA3 ist, dass Chrome seit Januar 2023 die Reihenfolge der Erweiterungen randomisiert – 16 Erweiterungen ergeben 16! (über 20 Billionen) Varianten, und derselbe Browser gibt unterschiedliche JA3 aus.
Deshalb hat die Industrie auf JA4 umgestellt (FoxIO, breite Einführung 2024–2025). JA4 sortiert die Codes der Erweiterungen nach ihrem hexadezimalen Wert vor dem Hashing – die Randomisierung von Chrome kann ihn nicht mehr brechen. Der Hash ist ein gekürzter SHA-256, das Format ist menschenlesbar und dreiteilig (a_b_c), und es sind ALPN und Unterstützung für QUIC/HTTP3 enthalten. Beispiel: Chrome 124 gibt t13d1516h2 (15 Cipher, 16 Erweiterungen, ALPN h2) aus, während reines Python requests t13d1715h2 ausgibt. Für Anti-Bot-Systeme ist die zweite Signatur ein direkter Marker „das ist ein Skript“.
Warum man 2026 ohne das nicht auskommt
JA4-Erkennung ist in allen großen Anbietern integriert: Cloudflare vergleicht den Fingerabdruck mit Allowlisten, Akamai fügt einen separaten Hash für HTTP/2 SETTINGS-Frames hinzu, DataDome vergleicht mit einer Datenbank bekannter Bots. Die Logik ist einfach und verheerend: Wenn Sie User-Agent: Chrome 131 senden, und der TLS-Fingerabdruck schreit „urllib3/OpenSSL“ – das ist desynchronisiert, und Sie werden sofort blockiert. Keine Proxys helfen: Eine perfekte Residential-IP mit dem Fingerabdruck von Python requests verliert trotzdem.
Genau deshalb ist die Kombination „Proxy + Fingerabdruck-Spoofing“ im Jahr 2026 zur grundlegenden Hygiene des Scrapings geworden, nicht mehr nur eine Option für Fortgeschrittene.
Lösung: curl_cffi in 5 Minuten
curl_cffi ist ein Python-Wrapper über curl-impersonate (modifiziertes curl, das mit BoringSSL von Chrome oder NSS von Firefox anstelle von OpenSSL kompiliert wurde). Es reproduziert das authentische Browser-Handschlag und hat dabei eine API, die fast identisch mit dem gewohnten requests ist.
Schritt 1. Installation. Die Binärdateien von curl-impersonate für Windows/macOS/Linux werden automatisch heruntergeladen:
pip install curl-cffi
Schritt 2. Grundanfrage. Ändern Sie den Import und fügen Sie einen Parameter hinzu:
from curl_cffi import requests
resp = requests.get("https://target.com/", impersonate="chrome")
print(resp.status_code)
print(resp.http_version) # HTTP/2 – wie bei einem echten Browser
Eine Zeile impersonate="chrome" spoofs sofort vier Schichten: TLS-Fingerabdruck (JA3/JA4), HTTP-Version (HTTP/2 anstelle von HTTP/1.1), Reihenfolge der Header und ALPN-Verhandlungen.
Schritt 3. Verwenden Sie immer den generischen Alias, nicht die Versionsnummer. Schreiben Sie impersonate="chrome" (oder "safari", "safari_ios") – der Alias wird automatisch auf das aktuellste Profil aufgelöst. Ein fest codierter impersonate="chrome124" wird veraltet sein: Chrome wird alle ~4 Wochen aktualisiert, und das alte Profil wird selbst zur Anomalie. Zuverlässige Ziele sind Chrome, Edge und Safari/iOS (Profile von chrome99 bis chrome131, safari15–18).
Schritt 4. Proxys und Sitzungen. Für echtes Scraping halten Sie den Zustand in einer Sitzung und binden Proxys ein. Eine Residential- oder mobile IP ist hier unerlässlich – ein Rechenzentrum wird durch ASN getrennt von TLS erkannt:
from curl_cffi import requests
session = requests.Session(impersonate="chrome")
headers = {
"Accept-Language": "en-US,en;q=0.9",
"Accept-Encoding": "gzip, deflate, br",
"Referer": "https://www.google.com/",
}
proxies = {
"http": "http://user:pass@proxy-host:port",
"https": "http://user:pass@proxy-host:port",
}
resp = session.get("https://target.com", headers=headers, proxies=proxies)
Schritt 5. Asynchronität für Volumen. Im Gegensatz zu requests hat curl_cffi von Haus aus async und HTTP/2:
import asyncio
from curl_cffi.requests import AsyncSession
async def fetch(session, url):
r = await session.get(url, impersonate="chrome")
return r.status_code
async def main(urls):
async with AsyncSession() as session:
return await asyncio.gather(*[fetch(session, u) for u in urls])
asyncio.run(main(["https://target.com"] * 20))
Überprüfen Sie Ihren Fingerabdruck – raten Sie nicht
Bevor Sie echten Traffic senden, stellen Sie sicher, dass das Spoofing wirklich funktioniert. Senden Sie eine Anfrage an öffentliche Verifier und vergleichen Sie JA4 mit dem Referenzbrowser:
- tls.peet.ws – gibt JA3, JA4, Akamai-Fingerabdruck und HTTP/2-Frames im JSON-Format zurück. Fordern Sie es über
curl_cffiund über echten Chrome an, und vergleichen Sie die Hashes. - ja4db.com – eine Datenbank bekannter JA4, die hilft zu verstehen, wie Sie wahrgenommen werden.
- browserleaks.com/tls und das JA3/JA4-Tool von Scrapfly – detaillierte Aufschlüsselung der Felder.
In der Staging-Umgebung ist es praktisch, mitmproxy zwischen dem Scraper und dem Ziel zu platzieren und den tatsächlichen JA4-Hash jeder Anfrage zu überwachen.
Diagnose: immer noch 403/429 erhalten
Wenn der Fingerabdruck korrekt ist, aber die Blockierungen bestehen bleiben – gehen Sie die Checkliste von häufig zu selten durch:
- Rechenzentrums-IP. Grund Nr. 1. Wechseln Sie zu Residential-Proxys oder mobilen – warum ein Fingerabdruck nicht ausreicht, wird ausführlich im Artikel über Erkennung von Residential-Proxys durch IP Intelligence behandelt.
- Abgelaufenes Profil.
pip install -U curl-cffiund generischer Alias"chrome". - Zu hohe Rate. Fügen Sie zufällige Pausen von 1–3 Sekunden zwischen den Anfragen hinzu.
- Leere Header. Stellen Sie sicher, dass Sie
Accept-Language,Accept-Encoding,Referersenden – deren Fehlen ist ebenfalls eine Anomalie. - Desynchronisation von Sitzung und IP. Regel: eine Sitzung – eine IP für die gesamte Lebensdauer.
- Status 200 ≠ Erfolg. Überprüfen Sie den Antwortkörper: Unter dem Code 200 kann eine Seite mit CAPTCHA liegen.
Wo curl_cffi an die Wand stößt
curl_cffi schließt die Netzwerkschicht – und das war's. Es führt kein JavaScript aus. Daher ist es gegen JS-Herausforderungen machtlos: Cloudflare Turnstile, die Seite „Überprüfen Ihres Browsers…“ (IUAM), das Cookie cf_clearance, das vom Skript nach der Überprüfung gesetzt wird – all dies erfordert eine echte Browserumgebung. Warum 2026 Captcha-Löser fast nicht mehr gegen solche präventiven Systeme funktionieren, haben wir in einer separaten Analyse über Umgehung von CAPTCHA behandelt.
Was tun, wenn Sie gegen eine JS-Wand stoßen:
- Hybrid. Playwright oder Nodriver führt die Herausforderung aus und erhält
cf_clearance, dann wird das Cookie an das schnellecurl_cffifür die meisten Anfragen übergeben – so zahlen Sie nur einmal für den schweren Browser. - Solver-Dienste (CapSolver, 2Captcha) zur automatischen Ausgabe von Tokens.
- Managed-Scraping-APIs, wenn Sie keine Infrastruktur betreiben möchten.
Und denken Sie an die Thread-Sicherheit: Jeder Thread benötigt seine eigene Sitzung. Fixieren Sie die Version von curl-cffi in requirements.txt und überprüfen Sie die Profile alle 6–12 Wochen, wenn die Browser aktualisiert werden.
Alternativen zu curl_cffi
- tls-client – ein Wrapper über die Go-Bibliothek auf Basis von uTLS, mit Profilen (
chrome_124,safari_ios_17) und dem Flagrandom_tls_extension_order=True. Flexible Feinabstimmung des Fingerabdrucks. - primp – ein Client in Rust, der es ermöglicht,
impersonate_osunabhängig festzulegen und eine höhere Durchsatzrate bietet; Nachteil – die API stimmt nicht vollständig mitrequestsüberein und die Bibliothek ist jünger.
Welcher Proxy benötigt wird und warum
Fingerabdruck-Spoofing und Proxys lösen unterschiedliche Teile einer Aufgabe: curl_cffi beantwortet die Frage „wie sieht die Verbindung aus“, Proxys – „woher kommt sie“. Anti-Bots prüfen beide Signale unabhängig, daher ist ein perfektes JA4 mit einem schwarzen Rechenzentrum-ASN nutzlos. Für geschützte Ziele (Marktplätze, soziale Netzwerke, Reiseaggregatoren) verwenden Sie Residential oder mobile Proxys: Sie haben einen sauberen Betreiber-Herkunft, und mobile Proxys verstecken sich zusätzlich hinter dem CGNAT „Crowd-Effekt“. Lassen Sie Rechenzentren für unempfindliche Ziele und hohes Volumen.
Fazit
Im Jahr 2026 ist Scraping ein Spiel der Identitäten und nicht nur der IPs. Reines requests wird auf der Ebene des TLS-Handschlags als Skript wahrgenommen und verliert noch bevor der erste Header gesendet wird. Der Austausch des Imports durch curl_cffi mit impersonate="chrome" beseitigt dieses Versagen in fünf Minuten, funktioniert jedoch nur in Kombination mit einer sauberen Residential- oder mobilen IP und mit dem Verständnis der Grenze: Netzwerkschicht – ja, JavaScript-Herausforderungen – nein. Stellen Sie Ihren Stack ehrlich zusammen: der richtige Fingerabdruck, der richtige Proxy, ein Hybrid mit einem Browser dort, wo eine JS-Wand steht – und 403 beim ersten Anfrage wird der Vergangenheit angehören.
