So verwenden Sie cf_clearance-Cookies in einem Python-Scraper wieder

Das Lösen der Cloudflare-Challenge ist nur die halbe Arbeit. Was Sie dafür bekommen, ist ein cf_clearance-Cookie, und genau dieses Cookie verhindert, dass die nächste Anfrage erneut herausgefordert wird. Es läuft schnell ab, es ist an mehr gebunden, als die meisten erwarten, und es hört auf zu funktionieren, sobald Ihr Client von demjenigen abweicht, der es sich verdient hat. Dieser Beitrag behandelt, was das Cookie ist, wie Sie es einfangen, was es stillschweigend ungültig macht und wie Sie ein abgelaufenes von einem defekten unterscheiden.
Was Sie brauchen
- Python 3.10 oder neuer, mit einem sitzungsfähigen HTTP-Client. Die Beispiele verwenden eine Session, damit Cookies über mehrere Anfragen hinweg erhalten bleiben.
- Ein Ziel, das tatsächlich eine Challenge ausgibt. Eine Website, die Sie nie herausfordert, setzt auch nie das Cookie, sodass es nichts zum Testen gibt.
- CapSkip muss laufen, entweder im lokalen Modus auf der Loopback-Adresse oder im Servermodus auf einer Maschine, die Ihre Worker erreichen können. Beide werden unter den Verbindungseinstellungenbeschrieben, entscheiden Sie sich also vorher für einen.
Was das cf_clearance-Cookie eigentlich ist
Es ist eine Quittung. Die Cloudflare-Referenz beschreibt es als das Cookie, das den Nachweis einer bestandenen Challenge speichert, damit keine Challenge mehr ausgelöst wird, solange das Cookie vorhanden ist. Es ist außerdem das Cookie, in dem JavaScript-Erkennungen gespeichert werden, und es wird mit SameSite None, Secure und Partitioned gesetzt, damit der Zustand seitenübergreifende Anfragen übersteht.
Die Lebensdauer können Sie sich nicht aussuchen. Sie ergibt sich aus der Einstellung Challenge Passage auf der Website, die Sie ansprechen, und Cloudflare dokumentiert den Standardwert unmissverständlich: Das cf_clearance-Cookie hat eine Lebensdauer von 30 Minuten, wobei 15 bis 45 Minuten als sinnvoller Bereich empfohlen werden. Manche Websites verkürzen sie. Manche verlängern sie. Sie können den Wert nicht von außen auslesen, behandeln Sie also jede Clearance als kurzlebig und planen Sie für die Auffrischung, statt darauf zu hoffen, dass sie hält.
Daraus ergeben sich drei praktische Konsequenzen. Sie sollten das Cookie behalten, denn ein erneutes Lösen bei jeder Anfrage ist langsam und verschwenderisch. Sie sollten niemals annehmen, dass es einen Neustart übersteht. Und Sie sollten einen Codepfad haben, der bemerkt, wenn es abgelaufen ist, und im Hintergrund ein neues besorgt.
Schritt 1: Die Challenge lösen und dann den gesamten Client behalten
Der Fehler, den Sie zuerst vermeiden sollten, ist, das Token als Belohnung zu behandeln. Das ist es nicht. Das Token, das Sie beim Lösen einer Turnstile-Challenge erhalten, tauschen Sie gegen die Clearance ein, und das Cookie, das Sie zurückbekommen, ist danach das eigentlich Wertvolle. Die Reihenfolge lautet also: lösen, absenden, dann die Session behalten, die die Antwort erhalten hat.
# pip install capskip
from capskip import CapSkip
solver = CapSkip(host="127.0.0.1", port=8080)
# A challenge page needs two more values than a plain widget does.
result = solver.turnstile(
sitekey="YOUR_SITEKEY",
url="https://example.com/protected",
data="YOUR_CDATA",
pagedata="YOUR_CHLPAGEDATA",
)
token = result["code"]
agent = result["userAgent"] # not optional, see the next sectionSenden Sie dieses Token so ab, wie es die Seite selbst tun würde, aus einer Session, die Sie behalten wollen. Sobald die Antwort zurückkommt, liegt das Clearance-Cookie im Cookie-Jar dieser Session, und Sie können es direkt auslesen.
# pip install requests
import requests
s = requests.Session()
s.headers["User-Agent"] = agent # the exact agent the solver returned
# ... submit the token here, exactly as the challenge page does ...
clearance = s.cookies.get("cf_clearance")
print(bool(clearance)) # True once the challenge is clearedSchritt 2: Wissen, was es stillschweigend ungültig macht
Cloudflare veröffentlicht die genaue Bindung nicht, daher ist diese Tabelle beobachtetes Verhalten und kein dokumentierter Vertrag. Sie ist konsistent genug, um darauf aufzubauen, und jede Zeile hier hat schon jemanden einen Nachmittag gekostet.
| Was sich geändert hat | Übersteht die Clearance das | Warum |
|---|---|---|
| Ihr User-Agent-String | Nein | Die Clearance wurde für eine bestimmte Browser-Identität ausgestellt |
| Ihre Quell-IP-Adresse | Nein | Ein Cookie, das an einer neuen Adresse auftaucht, ist die klassische Replay-Signatur |
| Ihr TLS-Fingerprint | Meist nicht | Der Handshake wird vor dem Cookie ausgelesen, sodass eine Abweichung früher auffällt |
| Der Hostname, an den Sie es senden | Nein | Clearance gilt pro Website, nicht pro Konto und nicht pro Netzwerk |
| Verstreichende Zeit | Nur bis Challenge Passage abläuft | Standard sind 30 Minuten, die Website kann das ändern |
| Hinzufügen fachfremder Cookies | Ja | Andere Cookies werden von der Clearance-Prüfung ignoriert |
Die ersten drei Zeilen sind eine einzige Regel in drei Verkleidungen: Die Clearance gehört zu einem Client, nicht zu Ihnen. Legen Sie also die Identität fest, die sie sich verdient hat, und halten Sie sie fest. Das heißt: ein User-Agent, eine Exit-IP und ein TLS-Profil für die gesamte Lebensdauer dieses Cookies. Einen Proxy mitten in der Session zu rotieren, verschenkt eine Clearance, die Sie bereits bezahlt haben, und das ist der mit Abstand häufigste Grund, warum ein funktionierender Scraper scheinbar grundlos wieder herausgefordert wird.
Das ist auch der Grund, warum der Solver einen User-Agent zurückgibt und nicht nur ein Token. Turnstile bindet das Token an die Browser-Identität, die es erzeugt hat, sodass ein Token, das unter einem anderen Agent eingereicht wird, abgelehnt wird, selbst wenn das Token an sich völlig gültig ist. Verwenden Sie den zurückgegebenen Wert unverändert, und nutzen Sie ihn weiterhin für jede Anfrage, die das resultierende Cookie mitführt. Die Anleitung zur Turnstile-Challenge-Seite zeigt, woher die beiden zusätzlichen Eingabewerte stammen, was die andere Hälfte ist, bei der Leute Fehler machen.
Schritt 3: Über mehrere Läufe hinweg speichern
Ein Clearance-Cookie, das mit Ihrem Prozess stirbt, ist viel weniger wert als eines, das einen Neustart übersteht. Speichern Sie das Cookie-Jar zusammen mit der dazugehörigen Identität, denn das Cookie allein ist nutzlos, wenn Sie es unter einem anderen Agent oder einem anderen Proxy wieder laden.
# pip install requests
import json, time
def save_clearance(session, agent, proxy, path="clearance.json"):
"""Store the cookie with the identity that earned it."""
blob = {
"cf_clearance": session.cookies.get("cf_clearance"),
"user_agent": agent,
"proxy": proxy,
"stored_at": time.time(),
}
with open(path, "w") as fh:
json.dump(blob, fh)Das Wiederladen ist das Spiegelbild davon, mit einer zusätzlichen Prüfung. Lassen Sie den Datensatz selbst ablaufen, statt darauf zu warten, herausgefordert zu werden, denn eine proaktive Auffrischung kostet eine Lösung, eine reaktive kostet zuerst eine fehlgeschlagene Anfrage.
# pip install requests
import json, time, requests
def load_clearance(path="clearance.json", max_age=900):
"""Return a ready session, or None if the record is too old."""
with open(path) as fh:
blob = json.load(fh)
# 15 minutes, comfortably inside a 30 minute default.
if time.time() - blob["stored_at"] > max_age:
return None
s = requests.Session()
s.headers["User-Agent"] = blob["user_agent"]
s.proxies = {"https": blob["proxy"]} if blob["proxy"] else {}
s.cookies.set("cf_clearance", blob["cf_clearance"])
return sFünfzehn Minuten sind eine bewusst konservative Obergrenze. Sie können den von einer Website konfigurierten Challenge-Passage-Wert nicht sehen, der Standard sind 30 Minuten, und eine Auffrischung auf halbem Weg kostet eine günstige Lösung statt eines kaputten Batches. Läuft der Solver auf Ihrer eigenen Hardware ohne Gebühr pro Lösung, ist frühzeitig zu sein kostenlos.
Schritt 4: Eine veraltete Clearance erkennen, ohne zu raten
Eine tote Clearance kündigt sich nicht mit einem sauberen Fehler an. Meist bekommen Sie einen normal aussehenden 403 oder einen 200, der eine HTML-Zwischenseite statt des erwarteten JSON enthält. Allein den Statuscode zu prüfen, erfasst den zweiten Fall nicht, und eine Retry-Schleife, die nur Statuscodes beobachtet, dreht sich dabei munter endlos weiter.
# pip install requests
def needs_new_clearance(response):
"""True when this response is a challenge rather than content."""
if response.status_code in (403, 503):
return True
body = response.text[:4000].lower()
markers = ("cf-turnstile", "challenge-platform", "just a moment")
return any(m in body for m in markers)Schalten Sie das vor Ihren Parser, nicht danach. Liefert es true zurück, verwerfen Sie den gespeicherten Datensatz, lösen Sie einmal, und versuchen Sie es erneut mit der frischen Sitzung. Versuchen Sie es nicht erneut mit dem alten Cookie und einer längeren Wartezeit, denn die Zeit ist nicht das Problem daran. Dieselbe Unterscheidung zeigt sich bei reCAPTCHA-Token, wo das Ablauffenster noch deutlich kürzer ist, und der Beitrag zu wie lange ein reCAPTCHA-Token gültig bleibt behandelt diese Seite des Themas.
Den Löser stattdessen auf einem Server betreiben
Clearance-Cookies gelten pro Identität, sodass eine Flotte von Workern auch eine Flotte von Clearances braucht, und jede Einzelne davon muss gelöst werden. Diese Arbeit muss nicht auf dem Worker selbst stattfinden. Die Verbindungseinstellungen decken beide Varianten ab:
| Modus | Lauscht auf | Sinnvoll, wenn |
|---|---|---|
| Lokal | 127.0.0.1, nur dieses Gerät | Ihr Scraper und der Löser laufen auf einer Maschine |
| Server | Ihre Netzwerkadresse oder öffentliche IP | Worker, ein VPS oder eine gehostete Plattform rufen über die API an |
Richten Sie den SDK-Host auf die Solver-Maschine aus, und sonst ändert sich nichts an Ihrem Code, sodass sich zwanzig Worker eine einzige Instanz teilen können, während jeder sein eigenes Cookie-Jar behält. Eine statische öffentliche IP wird empfohlen, wenn die Aufrufer außerhalb Ihres eigenen Netzwerks sitzen. Die Details finden Sie unter den Verbindungseinstellungen, und der Servermodus bleibt weiterhin Ihre eigene Hardware und bleibt ohne Nutzungsgebühren: Er verändert nur, wo der Solver läuft, niemals, wem er gehört.
FAQ
Wie lange hält ein cf_clearance-Cookie?
Standardmäßig dreißig Minuten, und der Website-Betreiber kann das ändern. Cloudflare stellt es als Einstellung Challenge Passage bereit und empfiehlt einen Bereich zwischen 15 und 45 Minuten, sodass die meisten Websites, denen Sie begegnen, irgendwo in diesem Band liegen. Sie können den konfigurierten Wert nicht von außen auslesen, weshalb eine Auffrischung nach einem selbst kontrollierten Timer besser ist, als auf eine erneute Challenge zu warten.
Kann ich ein Clearance-Cookie über mehrere Worker hinweg teilen?
Nur, wenn sie sich die Identität teilen, die es sich verdient hat, was in der Praxis dieselbe Exit-IP, denselben User-Agent und dasselbe TLS-Profil bedeutet. Das lässt sich hinter einem einzigen Proxy erreichen und ist eine gute Möglichkeit, Lösungen zu sparen. Sobald zwei Worker unterschiedliche Exit-Adressen verwenden, beginnt das geteilte Cookie bei einem von ihnen zu versagen, und die Fehlschläge wirken zufällig, bis Sie bemerken, bei welchem Worker sie auftreten.
Warum funktioniert meine Clearance nicht mehr, nachdem ich die Proxys rotiert habe?
Weil die Clearance für die alte Adresse ausgestellt wurde. Ein Cookie, das von einer neuen IP eintrifft, ist genau das Muster, das der Replay-Schutz erkennen soll, also wird es verworfen, und Sie werden erneut herausgefordert. Rotieren Sie stattdessen an der Session-Grenze: Ein Proxy verdient sich eine Clearance, nutzt sie bis zum Ablauf, und die nächste Session beginnt frisch mit einer neuen Adresse und einer neuen Lösung.
Brauche ich einen echten Browser, um ein Clearance-Cookie zu halten?
Nein. Jeder HTTP-Client mit einem Cookie-Jar kann es tragen, solange die Identität darum herum konstant bleibt. Was ein Browser Ihnen kostenlos liefert, ist ein glaubwürdiger TLS-Handshake und eine glaubwürdige Header-Reihenfolge, und ein einfacher HTTP-Client hat standardmäßig keines von beidem. Nicht das Cookie ist also der schwierige Teil, sondern die Konsistenz, und ein impersonierender Client deckt das ab, ohne den Speicherbedarf eines Browsers zu haben.
Die kürzeste Fassung
Behandeln Sie das cf_clearance-Cookie als kurzlebige Quittung, die an einen Client gebunden ist. Erfassen Sie es aus der Sitzung, die die Challenge gelöst hat, speichern Sie es zusammen mit dem User-Agent und dem Proxy, der es sich verdient hat, und aktualisieren Sie es alle etwa fünfzehn Minuten, statt zu warten, bis Sie blockiert werden. Prüfen Sie den Antwortkörper und nicht nur den Statuscode, denn eine Challenge kommt mit einem völlig gesunden 200 daher. Läuft es tatsächlich ab, ist eine frische Lösung die gesamte Abhilfe, und ein Captcha-Löser , der auf eigener Hardware läuft, macht das günstig genug, um es frühzeitig zu erledigen. Für die beiden Eingabeformen, die eine Turnstile-Lösung annehmen kann, lesen Sie die Cloudflare-Turnstile-Löser-Seite bevor Sie irgendetwas verkabeln. Die Worker-Pool-Verkabelung wird separat behandelt unter dem Captcha-Löser für Web Scraping, was zwanzig Minuten wert ist, wenn Sie mehr als einen Worker betreiben.
