Scraping

Warum dein Scraper geblockt wird, bevor er die Seite lädt: TLS- und HTTP/2-Fingerprinting

Saubere Residential-IP, echter User-Agent, und trotzdem sofort geblockt? Anti-Bot fingerprintet deinen HTTP-Client auf der TLS- und HTTP/2-Ebene, bevor deine Anfrage gelesen wird.

Chris Collins

Chris Collins

10. August 2026 · 7 Min. Lesezeit

Du hast alles richtig gemacht. Eine saubere Residential-IP, einen echten Chrome-User-Agent, glaubwürdige Header, vernünftige Rate-Limits. Und ein stark geschütztes Ziel blockt dich trotzdem sofort, manchmal bevor es ein einziges Byte der eigentlichen Seite sendet. Es ist verlockend, die IP zu beschuldigen und zu rotieren, aber Rotieren hilft nicht, und das ist das Anzeichen. Du wirst auf einer Ebene gefingerprintet, an die die meisten Scraper nie denken: dem HTTP-Client selbst, beim TLS-Handshake und der HTTP/2-Verbindung, bevor deine Anfrage überhaupt gelesen wird.

Das ist die dritte Identitätsebene, getrennt von deiner IP und getrennt vom Browser- und Geräte-Fingerabdruck, den ein Antidetect-Browser verwaltet. Sie zu verstehen ist das, was einen Scraper, der auf leichten Seiten funktioniert, von einem trennt, der auf den schweren funktioniert.

Drei Ebenen, nicht eine

Wenn eine Seite entscheidet, ob du ein echter Nutzer bist, betrachtet sie drei unabhängige Dinge:

  • Die Netzwerk-Ebene: deine IP-Adresse und ihre Reputation. Eine Datacenter-IP oder eine markierte scheitert hier.
  • Die Client-Ebene: wie dein HTTP-Client die Verbindung öffnet, sein TLS-Handshake und sein HTTP/2-Verhalten. Eine Scripting-Bibliothek scheitert hier selbst von einer perfekten IP.
  • Die Geräte-Ebene: der Browser-Fingerabdruck, Canvas, Schriften, navigator, und so weiter. Ein automatisierter Browser kann hier scheitern.

Eine saubere Residential-IP löst die erste Ebene und sonst nichts. Wenn dein TLS-Handshake “ich bin Python” verkündet, macht dich keine IP der Welt menschlich. Deshalb blocken dich die schwersten Ziele, bevor die Seite lädt: sie weisen die Verbindung auf der Client-Ebene ab, und die IP kommt nie dazu, zu zählen.

TLS-Fingerprinting, oder JA3

Jede HTTPS-Verbindung beginnt mit einem TLS-Handshake, und die allererste Nachricht, das ClientHello, ist überraschend aufschlussreich. Darin listet der Client die exakten Cipher-Suites auf, die er unterstützt, in einer bestimmten Reihenfolge, zusammen mit seinen TLS-Erweiterungen, unterstützten elliptischen Kurven, Signaturalgorithmen, und mehr. Diese Kombination ist charakteristisch für die Software, die die Verbindung macht, und sie ist bemerkenswert stabil.

Chrome erzeugt ein unverwechselbares ClientHello. Firefox erzeugt ein anderes. Pythons requests, das das System-OpenSSL nutzt, erzeugt eines, das keinem von beiden ähnelt. Gos net/http erzeugt sein eigenes. Anti-Bot-Anbieter hashen diese Werte in einen kompakten Fingerabdruck, die bekannten Formate sind JA3 und sein Nachfolger JA4, und pflegen ein Bild davon, wie echte Browser aussehen. Wenn dein ClientHello zu etwas hasht, das offensichtlich eine Scripting-Bibliothek und kein Browser ist, wirst du beim Handshake markiert, bevor du eine Request-Zeile, einen Header oder ein Cookie gesendet hast.

Der grausame Teil ist der Widerspruch, den es offenlegt. Du setzt User-Agent: Chrome, aber dein TLS-Fingerabdruck sagt OpenSSL-über-Python. Ein echtes Chrome würde diese Kombination nie erzeugen, also ist die Diskrepanz nicht nur eine gescheiterte Verkleidung, sie ist ein positives Signal, dass etwas vorgibt. Du bist schlechter dran, als wenn du gar keinen User-Agent gesendet hättest.

HTTP/2-Fingerprinting

Angenommen, dein TLS-Fingerabdruck ist überzeugend. Es gibt eine weitere Ebene direkt dahinter. Echte Browser sprechen HTTP/2, und wie sie es sprechen, ist auch ein Fingerabdruck. Wenn eine HTTP/2-Verbindung öffnet, sendet der Client einen SETTINGS-Frame mit bestimmten Werten (Header-Tabellengröße, max. gleichzeitige Streams, initiale Fenstergröße), kündigt ein spezifisches Window-Update an, und ordnet seine Pseudo-Header (:method, :authority, :scheme, :path) auf charakteristische Weise. Browser senden sogar Stream-Prioritätsinformationen in einem erkennbaren Muster.

HTTP-Client-Bibliotheken bekommen diese Details auf verräterische Weise falsch, oder fallen ganz auf HTTP/1.1 zurück, was auf einer modernen Seite schon für sich verdächtig ist. Also kann ein Scraper die TLS-Prüfung bestehen und trotzdem eine Ebene höher erwischt werden, weil seine HTTP/2-SETTINGS und Header-Reihenfolge zu keinem echten Browser passen. Und bei schlichtem HTTP/1.1 ist die Reihenfolge und Groß-/Kleinschreibung deiner Header ein weiterer Fingerabdruck: Browser senden Header in einer konsistenten Reihenfolge, die die meisten Bibliotheken nicht reproduzieren.

Warum Header setzen es nicht behebt

Der Grund, warum das so hartnäckig ist, ist, dass nichts davon in den Werten lebt, die du setzen kannst. Du kannst einen User-Agent fälschen, ein Accept-Language hinzufügen, die Header-Liste eines Browsers exakt kopieren, und trotzdem erwischt werden, denn der Fingerabdruck ist eine Eigenschaft davon, wie die Verbindung gemacht wird, nicht was du in die Anfrage packst. Die Cipher-Reihenfolge in deinem ClientHello, die HTTP/2-SETTINGS, die deine Bibliothek ausgibt, die Reihenfolge, in der Header über die Leitung gehen, das entscheidet dein TLS- und HTTP-Stack, nicht dein Code. Du kannst dich nicht aus einer JA3-Diskrepanz heraus-headern.

Wie man auf der Netzwerk-Ebene wie ein echter Browser aussieht

Es gibt zwei ehrliche Wege, einen browsergerechten Client-Fingerabdruck zu präsentieren.

Nutze einen echten Browser. Playwright, Puppeteer oder Selenium steuern echtes Chromium, also sind ihre TLS- und HTTP/2-Fingerabdrücke per Definition die eines echten Browsers. Für die am aggressivsten geschützten Ziele ist das die robusteste Route, um den Preis, einen Browser pro Worker zu fahren.

Nutze einen TLS-imitierenden HTTP-Client. Wenn du leichtgewichtig bleiben willst, existiert eine Klasse von Clients speziell dafür, das ClientHello und die HTTP/2-Settings eines Browsers zu imitieren, während sie ein einfacher HTTP-Aufruf bleiben. Werkzeuge wie curl-impersonate und sein Python-Binding curl_cffi, tls-client, und Gos utls lassen dich eine Anfrage senden, die als Chrome oder Firefox fingerprintet, ohne einen zu starten.

from curl_cffi import requests
# Präsentiert einen echten Chrome-TLS- + HTTP/2-Fingerabdruck, nicht den von python-requests.
r = requests.get(
"https://example.com",
impersonate="chrome",
proxies={"https": "http://customer-USER-country-us:PASS@p.shifter.io:443"},
)
print(r.status_code)

Dieses eine impersonate-Argument ist der Unterschied zwischen einem ClientHello, das Chrome sagt, und einem, das OpenSSL sagt. Gepaart mit einer sauberen Residential-IP räumt es die Netzwerk- und die Client-Ebene auf einmal ab, was die schweren Ziele prüfen.

Halte jede Ebene konsistent

Der rote Faden ist Konsistenz. Deine Geschichte muss über alle drei Ebenen übereinstimmen: ein Chrome-User-Agent braucht einen Chrome-TLS-Fingerabdruck, Chrome-HTTP/2-Settings, und Chrome-Header-Reihenfolge, austretend über eine IP, deren Geografie zu dem Locale passt, das du behauptest. Anti-Bot-Systeme bewerten zunehmend die Übereinstimmung zwischen diesen Signalen, nicht jedes für sich, also ist ein einzelner Widerspruch, ein Browser-UA auf einem Bibliotheks-Handshake, eine US-Persona auf einer ausländischen IP, ein lauteres Signal, als wenn eine Ebene leicht daneben liegt. Das ist dasselbe Kohärenzprinzip hinter den Fehlern, die Erkennung auslösen: jede Ebene muss dieselbe Geschichte erzählen.

Einen Client-Fingerabdruck-Block diagnostizieren

Du kannst einen Block auf Client-Ebene meist an seinem Verhalten von einem Block auf IP-Ebene unterscheiden. Wirst du sofort geblockt, auf einer Seite, die für aggressiven Schutz bekannt ist, und ändert Rotieren der IPs nichts, aber der Wechsel zu einem echten Browser funktioniert plötzlich, dann ist das ein Client-Fingerabdruck-Block, kein IP-Problem. Umgekehrt, wenn ein schlichter HTTP-Client die meiste Zeit gut funktioniert und nur manche IPs herausgefordert werden, weist das zurück auf die IP-Reputation. Zu wissen, welche Ebene scheiterte, sagt dir, welchen Hebel du ziehen musst, statt IPs gegen ein Problem zu rotieren, das nichts mit der IP zu tun hat. Das ist dieselbe “lies den Fehler richtig”-Disziplin wie das Diagnostizieren, warum Anfragen in Timeout laufen und einen stillen Block zu erkennen.

Das Fazit

Stark geschützte Seiten beurteilen dich auf drei Ebenen, und eine saubere IP beantwortet nur eine davon. Die Client-Ebene, dein TLS-Handshake und dein HTTP/2-Verhalten, lässt Scripting-Bibliotheken blocken, bevor ihre Anfragen überhaupt gelesen werden, und keine Menge Header-Fälschung behebt das, denn der Fingerabdruck steckt darin, wie die Verbindung gemacht wird. Um die schweren Ziele mit hoher Erfolgsquote zu scrapen, präsentiere einen browsergerechten Client-Fingerabdruck, entweder indem du einen echten Browser fährst oder einen TLS-imitierenden Client nutzt, und halte ihn konsistent mit deinen Headern und der Geografie deiner IP.

Eine saubere Residential-IP bleibt notwendig, sie ist die Ebene, die dich an der Reputation vorbeibringt, aber auf den härtesten Seiten ist sie allein nicht ausreichend. Kopple sie mit einem echten Browser-Fingerabdruck auf der Netzwerk-Ebene und jedem Signal in einer Linie, und der Block, der früher zuschlug, bevor die Seite überhaupt lud, hört auf. Die Pro-GB-Preisgestaltung lässt dich diese Kombination gegen deine eigenen härtesten Ziele testen, ohne dass ein Pro-Anfrage-Zähler gegen dich arbeitet.

Bereit, loszulegen?

Testen Sie Shifters Residential-Proxys, 205M+ IPs, 195+ Länder, ab $0.75/GB.

Jetzt starten