🎯 Um navegador em nuvem personalizável e anti-detecção alimentado por Chromium desenvolvido internamente, projetado para rastreadores web e agentes de IA. 👉Experimente agora
De volta ao blog

curl_cffi Web Scraping: Impressões digitais de TLS de navegador em Python

Sophia Martinez
Sophia Martinez

Specialist in Anti-Bot Strategies

22-Jul-2026

TL;DR:

  • curl_cffi é um cliente HTTP Python que imita o handshake TLS de um navegador real, de modo que um servidor que fingerprint o conexão veja Chrome em vez de um cliente de script.
  • Uma chamada requests.get(url, impersonate="chrome") apresenta uma impressão digital JA3 de navegador e negocia HTTP/2, sem necessidade de processo de navegador.
  • O hash JA3 muda a cada execução, e isso está correto: GREASE insere valores aleatórios no handshake, o que o verdadeiro Chrome também faz.
  • Use curl_cffi quando uma impressão digital TLS é um obstáculo, e Scrapeless quando a página precisa ser renderizada, desafios superados ou rotação de IP.
  • Comece com o plano gratuito do Scrapeless para as páginas que a impersonação TLS sozinha não pode alcançar.

Um cliente HTTP Python simples tem uma característica que um alvo pode ler antes de enviar um único byte de HTML: seu handshake TLS. O conjunto de cifras e extensões no ClientHello não se assemelha ao de um navegador, e um servidor que fingerprint esse handshake pode bloquear a solicitação apenas com base na impressão digital. o curl_cffi fecha essa lacuna emprestando a assinatura TLS de um navegador real.

Este guia mostra o curl_cffi apresentando uma impressão digital de navegador, explica por que o hash JA3 não é constante e, em seguida, traça a linha que o curl_cffi não pode cruzar. Onde uma página precisa de um navegador real, a API Universal de Scraping Scrapeless assume. Cada número abaixo vem de uma execução real.

O que o curl_cffi faz

curl_cffi é um cliente HTTP estilo requests construído sobre curl-impersonate, e sua função é fazer o handshake TLS parecer um navegador específico. Um servidor que inspeciona o handshake calcula uma impressão digital JA3, um resumo da versão, cifras e extensões do ClientHello definidos sobre o handshake TLS 1.3. Um cliente Python padrão produz uma impressão digital que nenhum navegador produziria; o curl_cffi produz uma que um navegador nomeado produz. O repositório curl_cffi lista as versões de navegador que pode imitar.

O que o curl_cffi não faz é rodar um navegador. Não há motor JavaScript, nem rendering, e nem resolução de desafios. É uma impressão digital, não um navegador.

Instalação

curl_cffi é uma instalação única via pip.

bash Copy
pip install curl_cffi

Passe impersonate com um nome de navegador e o curl_cffi constrói o handshake TLS desse navegador. A solicitação abaixo pede a um serviço de fingerprinting que relate o que ele viu.

python Copy
from curl_cffi import requests

response = requests.get("https://tls.peet.ws/api/all", impersonate="chrome", timeout=30)
fingerprint = response.json()
print("versão http:", fingerprint["http_version"])
print("hash ja3:", fingerprint["tls"]["ja3_hash"])

O serviço relata HTTP/2, que um navegador negocia e um cliente padrão geralmente não faz, e um hash JA3.

text Copy
versão http: h2
hash ja3: 9a23d5cedcea13483954537602158034

O valor do hash ja3 acima é o resultado de uma execução; execute o script novamente e ele muda. Isso não é um erro. O mecanismo GREASE insere valores reservados aleatórios no ClientHello, e o verdadeiro Chrome faz o mesmo, então o hash JA3 difere de conexão para conexão. O que permanece parecido com um navegador é a forma do handshake, que é o que uma verificação de impressão digital realmente avalia.

Onde o curl_cffi Para

Uma impressão digital TLS de navegador faz a solicitação passar por uma verificação de handshake, mas não renderiza a página. Em um site que gera seu conteúdo com JavaScript, o curl_cffi retorna exatamente o que o servidor enviou, que é uma estrutura vazia, e nenhuma quantidade de impersonação TLS a preenche. É aqui que uma ferramenta de rendering é necessária.

Defina sua chave Scrapeless no terminal. Use a chave real em tempo de execução e mantenha o espaço reservado fora de seu código-fonte.

bash Copy
export SCRAPELESS_API_KEY="sk_your_key_here"

O script abaixo busca uma página de citações renderizadas por JavaScript de duas maneiras: curl_cffi com uma impressão digital perfeita do Chrome, e Scrapeless com rendering ativado.

python Copy
import json
import os
import urllib.request

from curl_cffi import requests

JS_PAGE = "https://quotes.toscrape.com/js/"

response = requests.get(JS_PAGE, impersonate="chrome", timeout=30)
print("status curl_cffi:", response.status_code)
print("blocos de citações curl_cffi:", response.text.count('class="quote"'))


def scrapeless(url: str) -> str:
    payload = json.dumps(
{"ator": "unlocker.webunlocker", "entrada": {"url": url, "js_render": True, "headless": True}}
    ).encode()
    solicitação = urllib.request.Request(
        "https://api.scrapeless.com/api/v2/unlocker/request",
        data=payload,
        headers={"x-api-token": os.environ["SCRAPELESS_API_KEY"], "Content-Type": "application/json"},
        method="POST",
    )
    com urllib.request.urlopen(solicitação, timeout=90) como resposta:
        retornar json.loads(resposta.read())["data"]


html = scrapeless(JS_PAGE)
print("blocos de citação scrapeless:", html.count('class="quote"'))

curl_cffi obtém um 200 limpo e zero citações, porque as citações são geradas por JavaScript, que nunca é executado. Scrapeless renderiza a página e as citações aparecem.

text Copy
status curl_cffi: 200
blocos de citação curl_cffi: 0
blocos de citação scrapeless: 10

O 200 é a armadilha: a solicitação tem sucesso, então nada parece errado, mas o conteúdo não está lá. As duas ferramentas respondem a problemas diferentes. curl_cffi derrota uma verificação de impressão digital TLS; não renderiza, não supera um desafio ou não faz rotação de IPs. Para o conceito por trás da impressão digital, o guia sobre como contornar a impressão digital TLS cobre o que um servidor mede e por quê.

Antes de executar qualquer uma dessas ações em um site, leia seu robots.txt e os termos. O Protocolo de Exclusão de Robôs indica quais caminhos um site pede que os clientes automatizados evitem, e respeitá-lo mantém um scraper sustentável.

Pronto para as páginas que uma impressão digital sozinha não pode alcançar? Crie uma conta Scrapeless gratuita e renderize-as.

Conclusão

curl_cffi é a ferramenta certa para uma tarefa: fazer com que o handshake TLS de uma solicitação Python pareça o de um navegador, o que supera uma verificação de impressão digital sem um processo de navegador. É preciso, e seu limite é igualmente preciso, pois não executa JavaScript e retorna a estrutura vazia de uma página renderizada pelo cliente. Use-o onde a parede é o handshake, e entregue a página ao Scrapeless quando precisar de renderização, um desafio superado ou um IP novo. Comece com os scripts acima e adapte a ferramenta à parede à sua frente.

Comece com o plano gratuito do Scrapeless para páginas renderizadas, e verifique os preços do Scrapeless quando dimensionar um trabalho recorrente.

FAQ

P: O que o curl_cffi realmente imita?

curl_cffi imita o handshake TLS de um navegador e suas configurações HTTP/2, de modo que o ClientHello que um servidor vê corresponde a uma versão de navegador nomeada em vez de a um cliente padrão do Python. Não imita o motor de JavaScript ou a renderização de um navegador, apenas a impressão digital no nível da rede.

P: Por que o hash JA3 muda toda vez que executo a solicitação?

Por causa do GREASE, que insere valores reservados aleatórios no TLS ClientHello. O Chrome real faz isso também, então o hash JA3 varia entre conexões enquanto a forma significativa do handshake permanece parecida com a de um navegador. Um hash que muda é esperado, não um sinal de que a imitação falhou.

P: O curl_cffi pode raspar uma página renderizada por JavaScript?

Não. O curl_cffi não possui um mecanismo JavaScript, então em uma página renderizada pelo cliente retorna a estrutura HTML inicial com um status 200 e nenhum do conteúdo renderizado. Use uma ferramenta de renderização como o Scrapeless para essas páginas e mantenha o curl_cffi para endpoints cujo conteúdo já está na resposta.

P: Como o curl_cffi é diferente das solicitações?

A biblioteca requests envia um handshake TLS padrão do Python que um servidor de impressão digital pode sinalizar, enquanto o curl_cffi envia um handshake de navegador através de seu argumento impersonate. A API é de outra forma familiar, então requests.get(url, impersonate="chrome") é próximo de uma substituição para código que estava sendo bloqueado em sua impressão digital.

P: A impressão digital TLS de um navegador é suficiente para evitar bloqueios?

É suficiente para uma verificação de impressão digital TLS e nada mais. Páginas desafiadoras, análise comportamental e reputação de IP são defesas separadas que o curl_cffi não toca, então quando essas estão em jogo você precisa de renderização, manipulação de desafios ou rotação de proxy além da impressão digital.

Na Scorretless, acessamos apenas dados disponíveis ao público, enquanto cumprem estritamente as leis, regulamentos e políticas de privacidade do site aplicáveis. O conteúdo deste blog é apenas para fins de demonstração e não envolve atividades ilegais ou infratoras. Não temos garantias e negamos toda a responsabilidade pelo uso de informações deste blog ou links de terceiros. Antes de se envolver em qualquer atividade de raspagem, consulte seu consultor jurídico e revise os termos de serviço do site de destino ou obtenha as permissões necessárias.

Artigos mais populares

Catálogo