Cloudflare "Aguarde um Momento" em Python: Por que requests Falha
A página 'Aguarde um momento...' da Cloudflare é um desafio em JavaScript, e o Python requests não consegue executar JavaScript. Veja como detectá-lo, por que ele atinge servidores mais duramente do que laptops, por que truques ao estilo cloudscraper deixaram de ser suficientes e o que passou em nosso teste de 29 de setembro de 2026.
'Aguarde um momento...' é a página de desafio da Cloudflare. Ela pede ao cliente para executar JavaScript e provar que é um navegador antes que o site responda. O Python requests não consegue executar JavaScript, e de um servidor de datacenter seu IP e handshake TLS já parecem automatizados. O que passa é um navegador real em um IP limpo, ou um desbloqueador da web que executa um.
Este guia mostra como detectar o desafio em Python, por que o mesmo script passa em seu laptop e falha em seu servidor, por que truques da era cloudscraper deixaram de ser suficientes e o que realmente passou quando testamos em 29 de setembro de 2026. Isso inclui o site onde nada do que tentamos passou de 'Aguarde um momento'.
- É um desafio, não um erro. A Cloudflare marca respostas desafiadas com o cabeçalho
cf-mitigated: challenge. Em nosso teste, elas chegaram como HTTP 403. - Cabeçalhos não vão resolver. 'Ative JavaScript e cookies para continuar' significa que a página quer um motor JavaScript. Nenhuma string de User-Agent fornece um.
- Servidor versus laptop é principalmente reputação de IP mais a impressão digital TLS. Um IP residencial sozinho não passou pelo Indeed ou Glassdoor em nosso teste.
- O que passou: o Web Unlocker conseguiu o Glassdoor (após um navegador sem cabeça, 17,2 s) e o Indeed (primeira tentativa, 2,6 s). StockX ainda retornou 'Aguarde um momento...' e foi relatado como
js_challenge. - Fixe uma sessão. Reutilizar a autorização do navegador reduziu uma segunda solicitação ao Glassdoor de 14,0 s para 1,4 s em nosso teste.
O que a página "Aguarde um momento..." realmente é
A Cloudflare chama isso de Página de Desafio Intersticial: um portão de página inteira entre o visitante e o site enquanto a Cloudflare decide se o visitante é automatizado. Sua documentação sobre páginas de desafio descreve três tipos. Um desafio não interativo só precisa que o navegador execute o JavaScript injetado. Um desafio gerenciado permite que a Cloudflare escolha o tipo de desafio a partir dos sinais do pedido. Um desafio interativo pede ao visitante para fazer algo. Quando a verificação é aprovada, o pedido original continua para o site e o navegador recebe um cookie cf_clearance que permite pular o portão por um tempo.
Um cliente HTTP em Python nunca chega tão longe. Ele baixa a página de desafio, não tem motor para executar o script e entrega a você o HTML do portão em vez da página que você pediu.
Por que o desafio retorna como um 403, e como detectá-lo
Em nosso teste, toda página de desafio chegou com status 403, por isso raise_for_status() lança 403 Client Error: Forbidden e as pessoas procuram por 'cloudflare aguarde um momento 403'. O status sozinho não pode distinguir um desafio de qualquer outra recusa. O sinal confiável é um cabeçalho: a Cloudflare documenta que uma resposta desafiada carrega cf-mitigated: challenge, qualquer que seja o recurso solicitado. Verifique isso primeiro, depois o título como alternativa:
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'
Não repita uma solicitação desafiada em um loop apertado com o mesmo cliente. Cada tentativa busca o mesmo portão, e alguns sites respondem a falhas repetidas com regras mais rígidas. É assim que os scrapers acabam presos em um loop de 'Aguarde um momento'.
"Ative JavaScript e cookies para continuar" e "seu navegador não suporta JavaScript"
Essas strings são o texto alternativo de uma página de desafio, mostrado a clientes que não executam seu script. Quando o Python requests mostra uma delas, o site não está reclamando dos seus cabeçalhos. Está dizendo, literalmente, que precisa de um motor JavaScript e de um jar de cookies que mantenha o que o script define.
Foi exatamente isso que nossa execução residencial simples recebeu do Indeed e Glassdoor: um 403 com 'Ative JavaScript e cookies para continuar', de um IP residencial limpo. Adicionar um User-Agent do Chrome, um cabeçalho Accept-Language ou um Referer não muda nada, porque a página não está lendo-os para decidir. Está esperando que o script seja executado.
Por que seu scraper funciona localmente mas é bloqueado pela Cloudflare em um servidor
Esta é a versão mais comum da reclamação: o script funciona em um laptop, depois recebe 'Aguarde um momento' assim que é executado em uma VM na nuvem. Duas coisas mudam entre essas máquinas.
- O IP. Em seu laptop, o script sai de um endereço de ISP residencial. Em uma VM, sai de uma faixa de provedor de hospedagem, que as defesas contra bots classificam como provavelmente automatizada antes de ler qualquer outra coisa. Nosso servidor de datacenter em Frankfurt foi recusado pelo Glassdoor, Indeed, Zillow e Leboncoin, entre outros.
- A impressão digital TLS. O handshake do Python parece Python em ambas as máquinas, mas em um IP residencial um site pode tolerá-lo e em um IP de hospedagem raramente o fará. Nosso explicador sobre curl_cffi vs requests mostra quanto do handshake uma biblioteca controla.
A coluna residencial do nosso teste mostra o limite de corrigir apenas o IP. Zillow e Leboncoin serviram a página real a um pedido simples através de um proxy residencial. Indeed e Glassdoor ainda responderam com o desafio JavaScript. Seu laptop pode atingir a mesma parede em um site mais rigoroso. Simplesmente a atinge com menos frequência.

Por que truques da era cloudscraper param de funcionar
cloudscraper foi construído para a antiga página 'I'm Under Attack' da Cloudflare. Essa página verificava principalmente se o cliente podia executar um cálculo em JavaScript, então a biblioteca buscava o desafio, resolvia o script em um interpretador embutido, enviava a resposta de volta e mantinha o cookie, tudo em cima de requests. Por muito tempo isso foi suficiente, e é a razão pela qual 'alternativa ao cloudscraper' é agora uma busca que as pessoas fazem.
Várias coisas mudaram desde então, e elas não dependem de nenhuma versão específica da biblioteca:
- O handshake ainda diz Python. Uma biblioteca construída sobre requests se conecta através da pilha TLS do Python, então o ClientHello não corresponde ao navegador que seu User-Agent afirma ser. Essa discrepância é visível antes de qualquer JavaScript ser executado.
- O desafio não é mais apenas aritmético. Desafios gerenciados escolhem a verificação a partir dos sinais do pedido, e as detecções em JavaScript da Cloudflare leem o ambiente do navegador. Um interpretador que avalia um script não é um navegador que renderiza uma página.
- A autorização está vinculada ao cliente. A documentação de autorização da Cloudflare diz que um cookie cf_clearance está vinculado ao visitante e ao dispositivo ao qual foi emitido, para evitar reutilização entre máquinas. Copiar um do seu navegador para um script em outra máquina é projetado para falhar.
- O IP ainda é seu. Resolver a página não muda um IP de faixa de hospedagem, e alguns sites recusam esses antes de qualquer desafio ser servido.
Em 29 de setembro de 2026, o último push do repositório cloudscraper foi em junho de 2025. Isso não é um veredicto sobre qualquer site específico, e não o testamos para este artigo. Significa que você deve testá-lo contra seus próprios alvos em vez de assumir que funciona. As alternativas corrigem parte do problema. curl_cffi reproduz um handshake TLS de navegador, mas não executa JavaScript. Playwright ou outro navegador real executa o desafio, mas ainda precisa de um IP limpo, e é pesado para operar em volume. O desbloqueador combina os dois e informa quando nenhum funcionou.
O que passa: o caminho do desbloqueador da web
O Web Unlocker da QuantumProxies.io lida com um GET em etapas. Primeiro, até três tentativas de TLS, cada uma em uma saída residencial nova sob uma impressão digital de navegador diferente. Se cada tentativa voltar desafiada, ele escala para um navegador sem cabeça que executa o desafio. Se a página ainda estiver bloqueada após isso, você recebe um status de erro com x-qp-unlocker-blocked e uma classe de bloqueio, nunca uma página de desafio disfarçada como um 200. Do Python, é uma configuração de proxy:
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"))
Os cabeçalhos x-qp-* são lidos pelo desbloqueador e nunca encaminhados para o site. Se você preferir não lidar com o certificado, o endpoint REST POST https://app.quantumproxies.io/api/v1/scraper/unlock leva a URL em um corpo JSON com sua chave de API e retorna blocked, blockClass e vendor na resposta. Nosso tutorial da API do desbloqueador da web explica ambos.
Medido: duas paredes ao estilo Cloudflare que passaram, uma que não passou
Medido em 29 de setembro de 2026. Pedidos simples eram curl com um User-Agent do Chrome, de um servidor de datacenter em Frankfurt e através de um proxy residencial com saída nos EUA. O desbloqueador usou o nível residencial com saída nos EUA. Os tempos são de relógio de parede para um pedido.
| Site | Simples, servidor de datacenter | Simples, proxy residencial | Web Unlocker |
|---|---|---|---|
| Glassdoor (avaliações de empresas) | 403, página 'Segurança' | 403, 'Ative JavaScript e cookies para continuar' | 200, 2 tentativas + navegador sem cabeça, 17,2 s |
| Indeed (busca de empregos) | 403, página 'Verificação de Segurança' | 403, 'Ative JavaScript e cookies para continuar' | 200, 1 tentativa, sem navegador, 2,6 s |
| StockX (página de produto) | 403 | 403 | 403 'Aguarde um momento...', x-qp-block-class js_challenge, vendor cloudflare, 47,8 s |
| DoorDash (página da cidade) | 403 | 403 | 403, x-qp-block-class ip_reputation, vendor cloudflare |
Glassdoor é o caminho completo. Duas tentativas de TLS foram desafiadas, então o navegador sem cabeça executou o desafio e retornou a página de avaliações. Indeed é o interessante: o desafio que o pedido residencial simples recebeu nunca apareceu para a primeira tentativa do desbloqueador. Uma impressão digital de TLS de navegador em uma saída residencial nova foi suficiente, sem um navegador.
StockX é o fracasso honesto. O desbloqueador escalou, gastou 47,8 segundos, e a página ainda era 'Aguarde um momento...'. Ela voltou como um 403 com x-qp-block-class: js_challenge e x-qp-vendor: cloudflare, não como um 200 que seu analisador teria tentado ler. DoorDash, também atrás da Cloudflare, foi recusado no IP (ip_reputation) em vez de desafiado. Algumas configurações da Cloudflare não abrem para nenhuma das ferramentas neste artigo, e é melhor saber disso a partir de um cabeçalho do que de um conjunto de dados vazio.
Passe por desafios JavaScript com o Web Unlocker
Reutilizando a autorização: por que a segunda solicitação é rápida
A escalada do navegador é a parte lenta, e você não quer pagar por isso em cada página. Quando o navegador sem cabeça passa por um desafio, ele ganha uma autorização. Envie o mesmo valor x-qp-session, ou mantenha o mesmo -session-<id> no nome de usuário do proxy, nas solicitações seguintes e elas saem da mesma saída, reutilizando essa autorização em vez de executar o navegador novamente. O cabeçalho x-qp-clearance informa o que aconteceu em cada chamada: minted quando uma nova autorização foi obtida, hit quando uma armazenada foi reutilizada, miss quando não havia nada para reutilizar.
Em um teste do Glassdoor em 29 de setembro de 2026, com a sessão fixada no nome de usuário do proxy e duas conexões separadas, a primeira solicitação passou pelo navegador em 14,0 segundos (minted) e a segunda retornou em 1,4 segundos (hit). A fixação é importante por causa de como a Cloudflare vincula a autorização: ela está ligada ao visitante e ao dispositivo que a obteve, e permanece válida pelo tempo que o site configura, a menos que a Cloudflare decida que a sessão parece suspeita. Mude a saída ou a impressão digital e você é um novo visitante novamente.

Quando pedidos simples ainda são suficientes em um site Cloudflare
Muitos sites operam atrás da Cloudflare apenas como um CDN, ou com regras de bots que permitem tráfego comum, e pedidos simples funcionam neles. Estar 'na Cloudflare' não é um motivo para recorrer a um navegador. O sinal é a resposta. Se não houver cabeçalho cf-mitigated: challenge, título 'Aguarde um momento' ou 403, mantenha o pedido simples e escale apenas as URLs que realmente são desafiadas. O auxiliar plain-first em nosso tutorial faz exatamente isso.
Dois problemas vizinhos têm seus próprios guias. Uma página que diz 'Erro 1020 Acesso negado' é uma regra de firewall recusando você, não um desafio, e nenhuma quantidade de JavaScript resolve isso; veja o que aciona o erro 1020 da Cloudflare e o que o corrige. Para uma visão mais ampla das defesas da Cloudflare além do Python, leia como contornar os desafios da Cloudflare em 2026. Se a página atrás da parede for o Glassdoor, nosso guia para extrair salários e avaliações do Glassdoor cobre o lado dos dados.
Perguntas frequentes
Por que meu scraper funciona localmente mas é bloqueado pela Cloudflare na nuvem?
Porque o IP muda. Em casa, seu script sai de um endereço de ISP residencial; em uma VM na nuvem, sai de uma faixa de hospedagem que as defesas contra bots desconfiam à primeira vista. O handshake TLS do Python é o mesmo em ambos, e em um site mais rigoroso ele é desafiado mesmo de casa. Em nosso teste, um IP residencial sozinho não passou pelo Indeed ou Glassdoor.
Por que a página "Aguarde um momento" da Cloudflare retorna um 403?
A página de desafio é servida em vez da página que você pediu, e em nosso teste ela veio com status 403, então requests levanta '403 Client Error: Forbidden'. O status não é específico para desafios. Verifique o cabeçalho de resposta cf-mitigated, que a Cloudflare documenta como definido para challenge em cada resposta de Página de Desafio, ou o título 'Aguarde um momento'.
O cloudscraper ainda funciona, e qual é uma boa alternativa?
Ele pode ainda funcionar em sites com configurações lenientes, então teste-o contra seus alvos. Ele roda na pilha TLS do Python e resolve scripts em um interpretador, enquanto desafios atuais também olham para o handshake e o ambiente do navegador. Alternativas: curl_cffi para um handshake de navegador, um navegador real para o JavaScript, ou um desbloqueador da web que faz ambos.
O Python requests pode passar por um desafio da Cloudflare sozinho?
Não. requests não executa JavaScript, então não pode completar um desafio que dependa de executar o script da página. Ele pode buscar páginas de sites da Cloudflare que não estão desafiando você. Uma vez que cf-mitigated: challenge aparece, você precisa de um navegador real, diretamente ou através de um serviço que execute um, e idealmente um IP residencial limpo.
O desbloqueador da web pode resolver o Cloudflare Turnstile ou outros captchas?
Desafios JavaScript não interativos são respondidos pela escalada do navegador sem cabeça. Desafios interativos que precisam de uma ação humana, como uma caixa de seleção, controle deslizante, pressione e segure ou grade de imagens, não são resolvidos. O pedido falha em vez de retornar o desafio como um 200, e o endpoint REST o rotula com a classe de bloqueio captcha e o fornecedor, para que seu código possa decidir se deve pular a URL, desacelerar ou tentar mais tarde.
Quanto tempo dura uma autorização da Cloudflare?
Enquanto o site a configurar para durar. A Cloudflare chama a configuração de Challenge Passage, e a autorização pode terminar cedo se a Cloudflare decidir que a sessão parece suspeita. O cookie cf_clearance está vinculado ao visitante e ao dispositivo que o obteve, então só ajuda se pedidos posteriores mantiverem a mesma saída e impressão digital, que é o que fixar x-qp-session faz.
A versão curta: 'Aguarde um momento...' pede um navegador, então nenhum truque de cabeçalho em requests irá satisfazê-lo. Detecte-o com cf-mitigated, mantenha pedidos simples para tudo que não for desafiado, envie as URLs desafiadas por algo que execute um navegador real a partir de um IP limpo, e fixe uma sessão para que você pague por esse navegador uma vez em vez de em cada página.