Cloudflare "Just a Moment" in Python: Warum requests fehlschlägt
Cloudflares 'Just a moment...' Seite ist eine JavaScript-Herausforderung, und Python requests kann kein JavaScript ausführen. Hier erfahren Sie, wie man sie erkennt, warum sie Server härter trifft als Laptops, warum cloudscraper-ähnliche Tricks nicht mehr ausreichen und was in unserem Test am 29. September 2026 durchkam.
'Just a moment...' ist Cloudflares Herausforderungsseite. Sie fordert den Client auf, JavaScript auszuführen und zu beweisen, dass er ein Browser ist, bevor die Seite antwortet. Python requests kann kein JavaScript ausführen, und von einem Rechenzentrum-Server aus sehen seine IP und der TLS-Handshake bereits automatisiert aus. Was durchkommt, ist ein echter Browser auf einer sauberen IP oder ein Web Unlocker, der einen ausführt.
Diese Anleitung zeigt, wie man die Herausforderung in Python erkennt, warum dasselbe Skript auf Ihrem Laptop besteht und auf Ihrem Server fehlschlägt, warum cloudscraper-Ära-Tricks nicht mehr ausreichen und was tatsächlich durchkam, als wir es am 29. September 2026 getestet haben. Dazu gehört die Seite, bei der nichts, was wir versucht haben, 'Just a moment' überwand.
- Es ist eine Herausforderung, kein Fehler. Cloudflare markiert herausgeforderte Antworten mit dem Header
cf-mitigated: challenge. In unserem Test kamen sie als HTTP 403 an. - Header werden es nicht beheben. 'Enable JavaScript and cookies to continue' bedeutet, dass die Seite eine JavaScript-Engine möchte. Kein User-Agent-String liefert eine.
- Server versus Laptop ist hauptsächlich IP-Reputation plus der TLS-Fingerprint. Eine Wohn-IP allein bestand Indeed oder Glassdoor in unserem Test nicht.
- Was durchkam: der Web Unlocker bekam Glassdoor (nach einem Headless-Browser, 17,2 s) und Indeed (beim ersten Versuch, 2,6 s). StockX gab immer noch 'Just a moment...' zurück und wurde als
js_challengegemeldet. - Eine Sitzung fixieren. Die Wiederverwendung der Browser-Freigabe verkürzte eine zweite Glassdoor-Anfrage von 14,0 s auf 1,4 s in unserem Test.
Was die "Just a moment..." Seite tatsächlich ist
Cloudflare nennt es eine interstitielle Herausforderungsseite: ein ganzseitiges Tor zwischen dem Besucher und der Seite, während Cloudflare entscheidet, ob der Besucher automatisiert ist. Die Dokumentation zu Herausforderungsseiten beschreibt drei Arten. Eine nicht-interaktive Herausforderung benötigt nur, dass der Browser das eingespritzte JavaScript ausführt. Eine verwaltete Herausforderung lässt Cloudflare den Herausforderungstyp aus den Signalen der Anfrage auswählen. Eine interaktive Herausforderung fordert den Besucher auf, etwas zu tun. Wenn die Überprüfung bestanden wird, geht die ursprüngliche Anfrage zur Seite weiter und der Browser erhält ein cf_clearance Cookie, das es ihm ermöglicht, das Tor für eine Weile zu überspringen.
Ein Python HTTP-Client kommt nie so weit. Er lädt die Herausforderungsseite herunter, hat keinen Motor, um das Skript auszuführen, und liefert Ihnen das HTML des Tores statt der angeforderten Seite.
Warum die Herausforderung als 403 zurückkommt und wie man sie erkennt
In unserem Test kam jede Herausforderungsseite mit Status 403 an, weshalb raise_for_status() 403 Client Error: Forbidden auslöst und Leute nach 'cloudflare just a moment 403' suchen. Der Status allein kann eine Herausforderung nicht von jeder anderen Ablehnung unterscheiden. Das zuverlässige Signal ist ein Header: Cloudflare dokumentiert, dass eine herausgeforderte Antwort cf-mitigated: challenge trägt, unabhängig von der angeforderten Ressource. Überprüfen Sie das zuerst, dann den Titel als Rückfall:
import re
import requests
URL = "https://www.glassdoor.com/Reviews/Google-Reviews-E9079.htm"
HEADERS = {
"User-Agent": (
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
"(KHTML, like Gecko) Chrome/150.0.0.0 Safari/537.36"
),
"Accept-Language": "en-US,en;q=0.9",
}
def title_of(html: str) -> str:
m = re.search(r"<title[^>]*>(.*?)</title>", html, re.I | re.S)
return m.group(1).strip() if m else ""
def is_cloudflare_challenge(r: requests.Response) -> bool:
if r.headers.get("cf-mitigated") == "challenge": # documented by Cloudflare
return True
if "just a moment" in title_of(r.text).lower():
return True
return "enable javascript and cookies to continue" in r.text[:20000].lower()
r = requests.get(URL, headers=HEADERS, timeout=30)
print(r.status_code, is_cloudflare_challenge(r), title_of(r.text))
# 29 Sep 2026, plain request through a residential proxy (US exit):
# 403, body asking to 'Enable JavaScript and cookies to continue'
Wiederholen Sie eine herausgeforderte Anfrage nicht in einer engen Schleife mit demselben Client. Jeder erneute Versuch holt dasselbe Tor, und einige Seiten antworten auf wiederholte Fehlschläge mit strengeren Regeln. So enden Scraper in einer 'Just a moment' Schleife.
"Enable JavaScript and cookies to continue" und "your browser does not support JavaScript"
Diese Zeichenfolgen sind der Rückfalltext einer Herausforderungsseite, die Clients angezeigt wird, die ihr Skript nicht ausführen. Wenn Python requests Ihnen eine davon zeigt, beschwert sich die Seite nicht über Ihre Header. Sie sagt Ihnen buchstäblich, dass sie eine JavaScript-Engine und ein Cookie-Glas benötigt, das speichert, was das Skript setzt.
Genau das erhielt unser einfacher Wohnlauf von Indeed und Glassdoor: ein 403 mit 'Enable JavaScript and cookies to continue', von einer sauberen Heim-IP. Das Hinzufügen eines Chrome User-Agent, eines Accept-Language-Headers oder eines Referers ändert nichts, da die Seite sie nicht liest, um zu entscheiden. Sie wartet darauf, dass das Skript ausgeführt wird.
Warum Ihr Scraper lokal funktioniert, aber von Cloudflare auf einem Server blockiert wird
Dies ist die häufigste Version der Beschwerde: Das Skript funktioniert auf einem Laptop, dann erhält es 'Just a moment', sobald es auf einer Cloud-VM läuft. Zwei Dinge ändern sich zwischen diesen Maschinen.
- Die IP. Auf Ihrem Laptop verlässt das Skript eine Heim-ISP-Adresse. Auf einer VM verlässt es einen Bereich des Hosting-Anbieters, den Bot-Abwehrmaßnahmen als wahrscheinlich automatisiert einstufen, bevor sie etwas anderes lesen. Unser Rechenzentrum-Server in Frankfurt wurde von Glassdoor, Indeed, Zillow und Leboncoin, unter anderem, abgelehnt.
- Der TLS-Fingerprint. Der Handshake von Python sieht auf beiden Maschinen wie Python aus, aber auf einer Heim-IP kann eine Seite ihn tolerieren und auf einer Hosting-IP wird sie es selten tun. Unser Erklärer zu curl_cffi vs requests zeigt, wie viel des Handshakes eine Bibliothek steuert.
Die Wohnspalte unseres Tests zeigt die Grenze des Fixierens nur der IP. Zillow und Leboncoin lieferten die echte Seite auf eine einfache Anfrage über einen Wohnproxy. Indeed und Glassdoor antworteten immer noch mit der JavaScript-Herausforderung. Ihr Laptop kann auf einer strengeren Seite auf dieselbe Wand stoßen. Er trifft sie einfach seltener.

Warum cloudscraper-Ära-Tricks nicht mehr funktionieren
cloudscraper wurde für Cloudflares ältere 'I'm Under Attack' Seite entwickelt. Diese Seite überprüfte hauptsächlich, ob der Client eine JavaScript-Berechnung ausführen konnte, sodass die Bibliothek die Herausforderung abrief, das Skript in einem eingebetteten Interpreter löste, die Antwort zurücksendete und das Cookie behielt, alles auf Basis von requests. Lange Zeit war das genug, und es ist der Grund, warum 'cloudscraper alternative' jetzt eine Suche ist, die Leute machen.
Seitdem haben sich mehrere Dinge bewegt, und sie hängen nicht von einer bestimmten Bibliotheksversion ab:
- Der Handshake sagt immer noch Python. Eine auf requests aufgebaute Bibliothek verbindet sich über den TLS-Stack von Python, sodass das ClientHello nicht mit dem Browser übereinstimmt, den ihr User-Agent vorgibt zu sein. Diese Diskrepanz ist sichtbar, bevor irgendein JavaScript ausgeführt wird.
- Die Herausforderung ist nicht mehr nur arithmetisch. Verwaltete Herausforderungen wählen die Überprüfung aus den Signalen der Anfrage aus, und Cloudflares JavaScript-Erkennungen lesen die Browserumgebung. Ein Interpreter, der ein Skript auswertet, ist kein Browser, der eine Seite rendert.
- Die Freigabe ist an den Client gebunden. Cloudflares Freigabedokumentation besagt, dass ein cf_clearance Cookie an den Besucher und das Gerät gebunden ist, dem es ausgestellt wurde, um die Wiederverwendung über Maschinen hinweg zu verhindern. Das Kopieren eines von Ihrem Browser in ein Skript auf einer anderen Maschine ist zum Scheitern verurteilt.
- Die IP gehört immer noch Ihnen. Das Lösen der Seite ändert eine IP aus dem Hosting-Bereich nicht, und einige Seiten lehnen diese ab, bevor irgendeine Herausforderung serviert wird.
Seit dem 29. September 2026 war der letzte Push des cloudscraper-Repositories im Juni 2025. Das ist kein Urteil über eine bestimmte Seite, und wir haben es für diesen Artikel nicht benchmarken lassen. Es bedeutet, dass Sie es gegen Ihre eigenen Ziele testen sollten, anstatt anzunehmen, dass es funktioniert. Die Alternativen beheben jeweils einen Teil des Problems. curl_cffi reproduziert einen Browser-TLS-Handshake, führt jedoch kein JavaScript aus. Playwright oder ein anderer echter Browser führt die Herausforderung aus, benötigt jedoch immer noch eine saubere IP und ist schwer zu betreiben bei großem Volumen. Der Unlocker kombiniert die beiden und sagt Ihnen, wann weder funktioniert hat.
Was durchkommt: der Web Unlocker Pfad
Der QuantumProxies.io Web Unlocker verarbeitet ein GET in Phasen. Zuerst bis zu drei TLS-Versuche, jeder auf einem frischen Wohn-Exit unter einem anderen Browser-Fingerprint. Wenn jeder Versuch herausgefordert zurückkommt, eskaliert er zu einem Headless-Browser, der die Herausforderung ausführt. Wenn die Seite danach immer noch blockiert ist, erhalten Sie einen Fehlerstatus mit x-qp-unlocker-blocked und einer Blockklasse, niemals eine Herausforderungsseite, die als 200 verkleidet ist. Aus Python ist es eine Proxy-Einstellung:
import os
import time
import requests
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
user = os.environ["QP_UNLOCK_USER"] + "-country-us" # unlock-XXXXXXXX-country-us
PROXY = f"http://{user}:{os.environ['QP_UNLOCK_PASSWORD']}@unlock.quantumproxies.io:9000"
s = requests.Session()
s.proxies = {"http": PROXY, "https": PROXY}
s.verify = False # or the unlocker CA file from /api/v1/scraper/unlock/ca
s.headers["x-qp-session"] = "glassdoor-01" # same value on every call: same exit, reusable clearance
for attempt in (1, 2): # same page twice here; in practice, the next page
t0 = time.monotonic()
r = s.get(URL, timeout=120)
print(attempt, r.status_code, f"{time.monotonic() - t0:.1f}s",
"rendered:", r.headers.get("x-qp-unlocker-rendered"),
"clearance:", r.headers.get("x-qp-clearance"),
"block:", r.headers.get("x-qp-block-class"))
Die x-qp-* Header werden vom Unlocker gelesen und nie an die Seite weitergeleitet. Wenn Sie sich überhaupt nicht mit dem Zertifikat befassen möchten, nimmt der REST-Endpunkt POST https://app.quantumproxies.io/api/v1/scraper/unlock die URL in einem JSON-Body mit Ihrem API-Schlüssel und gibt blocked, blockClass und vendor in der Antwort zurück. Unser Web Unlocker API-Tutorial führt durch beide.
Gemessen: zwei Cloudflare-ähnliche Wände, die bestanden, eine, die nicht bestand
Gemessen am 29. September 2026. Einfache Anfragen waren curl mit einem Chrome User-Agent, von einem Rechenzentrum-Server in Frankfurt und über einen Wohnproxy mit einem US-Exit. Der Unlocker nutzte die Wohnstufe mit einem US-Exit. Zeiten sind Echtzeit für eine Anfrage.
| Seite | Einfach, Rechenzentrum-Server | Einfach, Wohnproxy | Web Unlocker |
|---|---|---|---|
| Glassdoor (Unternehmensbewertungen) | 403, 'Sicherheits'-Seite | 403, 'Enable JavaScript and cookies to continue' | 200, 2 Versuche + Headless-Browser, 17,2 s |
| Indeed (Jobsuche) | 403, 'Sicherheitsüberprüfung'-Seite | 403, 'Enable JavaScript and cookies to continue' | 200, 1 Versuch, kein Browser, 2,6 s |
| StockX (Produktseite) | 403 | 403 | 403 'Just a moment...', x-qp-block-class js_challenge, vendor cloudflare, 47,8 s |
| DoorDash (Stadtseite) | 403 | 403 | 403, x-qp-block-class ip_reputation, vendor cloudflare |
Glassdoor ist der vollständige Pfad. Zwei TLS-Versuche wurden herausgefordert, dann führte der Headless-Browser die Herausforderung aus und lieferte die Bewertungsseite zurück. Indeed ist der interessante: die Herausforderung, die die einfache Wohnanfrage erhielt, erschien nie beim ersten Versuch des Unlockers. Ein Browser-TLS-Fingerprint auf einem frischen Wohn-Exit war genug, ohne einen Browser.
StockX ist das ehrliche Scheitern. Der Unlocker eskalierte, verbrachte 47,8 Sekunden, und die Seite war immer noch 'Just a moment...'. Sie kam als 403 mit x-qp-block-class: js_challenge und x-qp-vendor: cloudflare zurück, nicht als 200, die Ihr Parser versucht hätte zu lesen. DoorDash, ebenfalls hinter Cloudflare, wurde auf der IP (ip_reputation) abgelehnt, anstatt herausgefordert zu werden. Einige Cloudflare-Konfigurationen öffnen sich für keines der in diesem Artikel genannten Tools, und es ist besser, das aus einem Header zu wissen als aus einem leeren Datensatz.
JavaScript-Herausforderungen mit dem Web Unlocker überwinden
Die Freigabe wiederverwenden: warum die zweite Anfrage schnell ist
Die Browser-Eskalation ist der langsame Teil, und Sie möchten nicht für sie bei jeder Seite bezahlen. Wenn der Headless-Browser eine Herausforderung besteht, verdient er eine Freigabe. Senden Sie denselben x-qp-session Wert oder behalten Sie dasselbe -session-<id> im Proxy-Benutzernamen bei den folgenden Anfragen bei, und sie verlassen denselben Exit, indem sie diese Freigabe wiederverwenden, anstatt den Browser erneut auszuführen. Der x-qp-clearance Header sagt Ihnen, was bei jedem Aufruf passiert ist: minted, wenn eine neue Freigabe verdient wurde, hit, wenn eine gespeicherte wiederverwendet wurde, miss, wenn nichts wiederverwendet werden konnte.
In einem Glassdoor-Test am 29. September 2026, mit der Sitzung im Proxy-Benutzernamen fixiert und zwei separaten Verbindungen, ging die erste Anfrage in 14,0 Sekunden durch den Browser (minted) und die zweite kam in 1,4 Sekunden zurück (hit). Das Fixieren ist wichtig, weil Cloudflare die Freigabe bindet: sie ist an den Besucher und das Gerät gebunden, das sie verdient hat, und bleibt gültig für die Dauer, die die Seite konfiguriert, es sei denn, Cloudflare entscheidet, dass die Sitzung verdächtig aussieht. Ändern Sie den Exit oder den Fingerprint und Sie sind wieder ein neuer Besucher.

Wann einfache Anfragen auf einer Cloudflare-Seite noch in Ordnung sind
Viele Seiten laufen nur als CDN hinter Cloudflare oder mit Bot-Regeln, die normalen Verkehr durchlassen, und einfache Anfragen funktionieren auf ihnen. 'Auf Cloudflare' zu sein, ist kein Grund, zu einem Browser zu greifen. Das Signal ist die Antwort. Wenn es keinen cf-mitigated: challenge Header, keinen 'Just a moment' Titel und keinen 403 gibt, behalten Sie die einfache Anfrage bei und eskalieren Sie nur die URLs, die tatsächlich herausgefordert werden. Der plain-first Helfer in unserem Tutorial macht genau das.
Zwei benachbarte Probleme haben ihre eigenen Anleitungen. Eine Seite, die 'Error 1020 Access denied' sagt, ist eine Firewall-Regel, die Sie ablehnt, keine Herausforderung, und keine Menge an JavaScript behebt es; siehe was Cloudflare-Fehler 1020 auslöst und was ihn behebt. Für das breitere Bild von Cloudflares Abwehrmaßnahmen jenseits von Python, lesen Sie wie man Cloudflare-Herausforderungen im Jahr 2026 umgeht. Wenn die Seite hinter der Wand Glassdoor ist, behandelt unser Leitfaden zum Scrapen von Glassdoor-Gehältern und -Bewertungen die Datenseite.
Häufig gestellte Fragen
Warum funktioniert mein Scraper lokal, wird aber von Cloudflare in der Cloud blockiert?
Weil sich die IP ändert. Zu Hause verlässt Ihr Skript eine Wohn-ISP-Adresse; auf einer Cloud-VM verlässt es einen Hosting-Bereich, dem Bot-Abwehrmaßnahmen misstrauen, sobald sie ihn sehen. Der Python TLS-Handshake ist auf beiden gleich, und auf einer strengeren Seite wird er sogar von zu Hause aus herausgefordert. In unserem Test bestand eine Wohn-IP Indeed oder Glassdoor nicht allein.
Warum gibt Cloudflares "Just a moment" Seite eine 403 zurück?
Die Herausforderungsseite wird anstelle der angeforderten Seite serviert, und in unserem Test kam sie mit Status 403, sodass requests '403 Client Error: Forbidden' auslöst. Der Status ist nicht spezifisch für Herausforderungen. Überprüfen Sie den cf-mitigated Antwort-Header, den Cloudflare dokumentiert, um bei jeder Challenge Page-Antwort auf challenge gesetzt zu werden, oder den 'Just a moment' Titel.
Funktioniert cloudscraper noch und was ist eine gute Alternative?
Es kann auf Seiten mit nachsichtigen Einstellungen noch funktionieren, also testen Sie es gegen Ihre Ziele. Es läuft auf Pythons TLS-Stack und löst Skripte in einem Interpreter, während aktuelle Herausforderungen auch den Handshake und die Browserumgebung betrachten. Alternativen: curl_cffi für einen Browser-Handshake, ein echter Browser für das JavaScript oder ein Web Unlocker, der beides tut.
Kann Python requests eine Cloudflare-Herausforderung alleine bestehen?
Nein. requests führt kein JavaScript aus, daher kann es keine Herausforderung abschließen, die davon abhängt, das Skript der Seite auszuführen. Es kann Seiten von Cloudflare-Seiten abrufen, die Sie nicht herausfordern. Sobald cf-mitigated: challenge erscheint, benötigen Sie einen echten Browser, direkt oder über einen Dienst, der einen ausführt, und idealerweise eine saubere Wohn-IP.
Kann der Web Unlocker Cloudflare Turnstile oder andere Captchas lösen?
Nicht-interaktive JavaScript-Herausforderungen werden durch die Headless-Browser-Eskalation beantwortet. Interaktive Herausforderungen, die eine menschliche Aktion erfordern, wie ein Kontrollkästchen, Schieberegler, Drücken-und-Halten oder Bildraster, werden nicht gelöst. Die Anfrage schlägt fehl, anstatt die Herausforderung als 200 zurückzugeben, und der REST-Endpunkt kennzeichnet sie mit der Blockklasse captcha und dem Anbieter, sodass Ihr Code entscheiden kann, ob er die URL überspringt, verlangsamt oder später versucht.
Wie lange dauert eine Cloudflare-Freigabe?
So lange, wie die Seite es konfiguriert. Cloudflare nennt die Einstellung Challenge Passage, und die Freigabe kann frühzeitig enden, wenn Cloudflare entscheidet, dass die Sitzung verdächtig aussieht. Das cf_clearance Cookie ist an den Besucher und das Gerät gebunden, das es verdient hat, daher hilft es nur, wenn spätere Anfragen denselben Exit und Fingerprint beibehalten, was das Fixieren von x-qp-session tut.
Die Kurzversion: 'Just a moment...' verlangt nach einem Browser, also wird kein Header-Trick in requests es zufriedenstellen. Erkennen Sie es mit cf-mitigated, behalten Sie einfache Anfragen für alles, was nicht herausgefordert wird, senden Sie die herausgeforderten URLs durch etwas, das einen echten Browser von einer sauberen IP ausführt, und fixieren Sie eine Sitzung, damit Sie für diesen Browser einmal zahlen und nicht bei jeder Seite.