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'.

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.

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 um scraper em Python passa pela Cloudflare de um laptop e recebe o desafio Aguarde um momento de um servidor na nuvem: IP residencial versus IP de hospedagem, mesma impressão digital TLS do Python, sem motor JavaScript em ambos os casos
Mesmo script, duas máquinas. O IP muda; o handshake TLS do Python e o motor JavaScript ausente não.

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:

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.

SiteSimples, servidor de datacenterSimples, proxy residencialWeb 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)403403403 'Aguarde um momento...', x-qp-block-class js_challenge, vendor cloudflare, 47,8 s
DoorDash (página da cidade)403403403, 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-&lt;id&gt; 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.

Linha do tempo de duas solicitações em uma sessão de desbloqueador fixada: a primeira escala para um navegador sem cabeça e obtém uma autorização da Cloudflare em 14,0 segundos, a segunda a reutiliza e retorna em 1,4 segundos
A primeira solicitação paga pelo navegador; solicitações posteriores na mesma sessão fixada reutilizam a autorização.

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.

Experimente o Web Unlocker em saídas residenciais