
Aloísio Vítor
Image Processing Expert


A raspagem web se tornou uma ferramenta essencial para coleta de dados, pesquisa de mercado e análise de concorrência. No entanto, à medida que as técnicas de raspagem evoluíram, os mecanismos de proteção dos sites também se tornaram mais sofisticados. Entre os obstáculos mais comuns que os raspadores enfrentam estão os captchas - esses desafios irritantes projetados para distinguir humanos de robôs.
Se você já tentou raspagem de um site e foi recebido com uma mensagem "Por favor, verifique se você é humano", sabe a frustração. A boa notícia? Há uma combinação poderosa que pode ajudar: Scrapling para raspagem inteligente e CapSolver para resolução automática de captchas.
Neste guia, vamos mostrar tudo o que você precisa saber para integrar essas ferramentas e raspagem com sucesso sites protegidos por captchas. Seja com o Google ReCaptcha v2, o invisível ReCaptcha v3 ou o Cloudflare Turnstile, temos você coberto.
Scrapling é uma biblioteca moderna de raspagem web em Python que se descreve como "a primeira biblioteca de raspagem adaptativa que aprende com as mudanças nos sites e evolui com eles". Foi projetado para tornar a extração de dados fácil, enquanto oferece capacidades poderosas de anti-bot.
Para capacidades básicas de análise:
pip install scrapling
Para funcionalidades completas, incluindo automação de navegador:
pip install "scrapling[fetchers]"
scrapling install
Para tudo, incluindo recursos de IA:
pip install "scrapling[all]"
scrapling install
O Scrapling usa métodos de classe para solicitações HTTP:
from scrapling import Fetcher
# Solicitação GET
response = Fetcher.get("https://example.com")
# Solicitação POST com dados
response = Fetcher.post("https://example.com/api", data={"chave": "valor"})
# Acessar resposta
print(response.status) # Código de status HTTP
print(response.body) # Bytes brutos
print(response.body.decode()) # Texto decodificado
CapSolver é um serviço de resolução de captchas que usa inteligência artificial avançada para resolver automaticamente vários tipos de captchas. Ele fornece uma API simples que se integra perfeitamente com qualquer linguagem de programação ou framework de raspagem.
Aumente seu orçamento de automação instantaneamente!
Use o código de bônus SCRAPLING ao recarregar sua conta no CapSolver para obter um bônus adicional de 6% em cada recarga — especialmente para usuários de integração com Scrapling.
Redimir agora no seu Painel do CapSolver
O CapSolver usa dois pontos de extremidade principais:
POST https://api.capsolver.com/createTaskPOST https://api.capsolver.com/getTaskResultAntes de mergulhar nos tipos específicos de captcha, vamos criar uma função auxiliar reutilizável que lida com o fluxo de trabalho da API do CapSolver:
import requests
import time
CAPSOLVER_API_KEY = "SUA_CHAVE_DE_API"
def solve_captcha(task_type, website_url, website_key, **kwargs):
"""
Solucionador de captcha genérico usando a API do CapSolver.
Args:
task_type: O tipo de tarefa de captcha (ex: "ReCaptchaV2TaskProxyLess")
website_url: A URL da página com o captcha
website_key: A chave do site para o captcha
**kwargs: Parâmetros adicionais específicos do tipo de captcha
Returns:
dict: A solução contendo o token e outros dados
"""
payload = {
"clientKey": CAPSOLVER_API_KEY,
"task": {
"type": task_type,
"websiteURL": website_url,
"websiteKey": website_key,
**kwargs
}
}
# Criar a tarefa
response = requests.post(
"https://api.capsolver.com/createTask",
json=payload
)
result = response.json()
if result.get("errorId") != 0:
raise Exception(f"Falha na criação da tarefa: {result.get('errorDescription')}")
task_id = result.get("taskId")
print(f"Tarefa criada: {task_id}")
# Verificar resultados
max_attempts = 60 # Máximo de 2 minutos de verificação
for attempt in range(max_attempts):
time.sleep(2)
response = requests.post(
"https://api.capsolver.com/getTaskResult",
json={
"clientKey": CAPSOLVER_API_KEY,
"taskId": task_id
}
)
result = response.json()
if result.get("status") == "ready":
print(f"Captcha resolvido em {(attempt + 1) * 2} segundos")
return result.get("solution")
if result.get("errorId") != 0:
raise Exception(f"Erro: {result.get('errorDescription')}")
print(f"Esperando... (tentativa {attempt + 1})")
raise Exception("Tempo esgotado: A resolução do captcha demorou demais")
Essa função lida com todo o fluxo de trabalho: criar uma tarefa, verificar resultados e retornar a solução. Usaremos ela ao longo deste guia.
O ReCaptcha v2 é o clássico "Não sou um robô" captcha de checkbox. Quando dispar

A raspagem web se tornou uma ferramenta essencial para coleta de dados, pesquisa de mercado e análise de concorrência. No entanto, à medida que as técnicas de raspagem evoluíram, os mecanismos de proteção dos sites também se tornaram mais sofisticados. Entre os obstáculos mais comuns que os raspadores enfrentam estão os captchas - esses desafios irritantes projetados para distinguir humanos de robôs.
Se você já tentou raspagem de um site e foi recebido com uma mensagem "Por favor, verifique se você é humano", sabe a frustração. A boa notícia? Há uma combinação poderosa que pode ajudar: Scrapling para raspagem inteligente e CapSolver para resolução automática de captchas.
Neste guia, vamos mostrar tudo o que você precisa saber para integrar essas ferramentas e raspagem com sucesso sites protegidos por captchas. Seja com o Google ReCaptcha v2, o invisível ReCaptcha v3 ou o Cloudflare Turnstile, temos você coberto.
Scrapling é uma biblioteca moderna de raspagem web em Python que se descreve como "a primeira biblioteca de raspagem adaptativa que aprende com as mudanças nos sites e evolui com eles". Foi criado para tornar a extração de dados fácil, enquanto oferece capacidades poderosas de anti-bot.
Para capacidades básicas de análise:
pip install scrapling
Para funcionalidades completas, incluindo automação de navegador:
pip install "scrapling[fetchers]"
scrapling install
Para tudo, incluindo recursos de IA:
pip install "scrapling[all]"
scrapling install
O Scrapling usa métodos de classe para solicitações HTTP:
from scrapling import Fetcher
# Solicitação GET
response = Fetcher.get("https://example.com")
# Solicitação POST com dados
response = Fetcher.post("https://example.com/api", data={"chave": "valor"})
# Acessar resposta
print(response.status) # Código de status HTTP
print(response.body) # Bytes brutos
print(response.body.decode()) # Texto decodificado
CapSolver é um serviço de resolução de captchas que usa inteligência artificial avançada para resolver automaticamente vários tipos de captchas. Ele fornece uma API simples que se integra perfeitamente com qualquer linguagem de programação ou framework de raspagem.
Aumente seu orçamento de automação instantaneamente!
Use o código de bônus SCRAPLING ao recarregar sua conta no CapSolver para obter um bônus adicional de 6% em cada recarga — especialmente para usuários de integração com Scrapling.
Redimir agora no seu Painel do CapSolver
O CapSolver usa dois pontos de extremidade principais:
POST https://api.capsolver.com/createTaskPOST https://api.capsolver.com/getTaskResultAntes de mergulhar nos tipos específicos de captcha, vamos criar uma função auxiliar reutilizável que lida com o fluxo de trabalho da API do CapSolver:
import requests
import time
CAPSOLVER_API_KEY = "SUA_CHAVE_DE_API"
def solve_captcha(task_type, website_url, website_key, **kwargs):
"""
Solucionador de captcha genérico usando a API do CapSolver.
Args:
task_type: O tipo de tarefa de captcha (ex: "ReCaptchaV2TaskProxyLess")
website_url: A URL da página com o captcha
website_key: A chave do site para o captcha
**kwargs: Parâmetros adicionais específicos do tipo de captcha
Returns:
dict: A solução contendo o token e outros dados
"""
payload = {
"clientKey": CAPSOLVER_API_KEY,
"task": {
"type": task_type,
"websiteURL": website_url,
"websiteKey": website_key,
**kwargs
}
}
# Criar a tarefa
response = requests.post(
"https://api.capsolver.com/createTask",
json=payload
)
result = response.json()
if result.get("errorId") != 0:
raise Exception(f"Falha na criação da tarefa: {result.get('errorDescription')}")
task_id = result.get("taskId")
print(f"Tarefa criada: {task_id}")
# Verificar resultados
max_attempts = 60 # Máximo de 2 minutos de verificação
for attempt in range(max_attempts):
time.sleep(2)
response = requests.post(
"https://api.capsolver.com/getTaskResult",
json={
"clientKey": CAPSOLVER_API_KEY,
"taskId": task_id
}
)
result = response.json()
if result.get("status") == "ready":
print(f"Captcha resolvido em {(attempt + 1) * 2} segundos")
return result.get("solution")
if result.get("errorId") != 0:
raise Exception(f"Erro: {result.get('errorDescription')}")
print(f"Esperando... (tentativa {attempt + 1})")
raise Exception("Tempo esgotado: A resolução do captcha demorou demais")
Essa função lida com todo o fluxo de trabalho: criar uma tarefa, verificar resultados e retornar a solução. Usaremos ela ao longo deste guia.
O ReCaptcha v2 é o clássico "Não sou um robô" captcha de checkbox. Quando acionado, ele pode pedir aos usuários que identifiquem objetos em imagens (semáforos, faixas de pedestres, etc.). Para raspadores, precisamos resolver isso de forma programática.
A chave de site geralmente está no HTML da página:
<div class="g-recaptcha" data-sitekey="6LcxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxABCD"></div>
Ou em uma tag de script:
<script src="https://www.google.com/recaptcha/api.js?render=6LcxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxABCD"></script>
from scrapling import Fetcher
def scrape_with_recaptcha_v2(target_url, site_key, form_url=None):
"""
Raspagem de uma página protegida por ReCaptcha v2.
Args:
target_url: A URL da página com o captcha
site_key: A chave de site do ReCaptcha
form_url: A URL para submeter o formulário (padrão para target_url)
Returns:
A resposta da página protegida
"""
# Resolver o captcha usando o CapSolver
print("Resolvendo ReCaptcha v2...")
solution = solve_captcha(
task_type="ReCaptchaV2TaskProxyLess",
website_url=target_url,
website_key=site_key
)
captcha_token = solution["gRecaptchaResponse"]
print(f"Obtido token: {captcha_token[:50]}...")
# Submeter o formulário com o token de captcha usando o Scrapling
# Nota: Use Fetcher.post() como método de classe (não método de instância)
submit_url = form_url or target_url
response = Fetcher.post(
submit_url,
data={
"g-recaptcha-response": captcha_token,
# Adicione quaisquer outros campos de formulário necessários pelo site
}
)
return response
# Exemplo de uso
if __name__ == "__main__":
url = "https://example.com/pagina-protegida"
site_key = "6LcxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxABCD"
result = scrape_with_recaptcha_v2(url, site_key)
print(f"Status: {result.status}")
print(f"Comprimento do conteúdo: {len(result.body)}") # Use .body para bytes brutos
Para o ReCaptcha v2 Invisível (sem checkbox, acionado na submissão do formulário), adicione o parâmetro isInvisible:
solution = solve_captcha(
task_type="ReCaptchaV2TaskProxyLess",
website_url=target_url,
website_key=site_key,
isInvisible=True
)
Para o ReCaptcha v2 Enterprise, use um tipo de tarefa diferente:
solution = solve_captcha(
task_type="ReCaptchaV2EnterpriseTaskProxyLess",
website_url=target_url,
website_key=site_key,
enterprisePayload={
"s": "valor_s_se_necessário"
}
)
O ReCaptcha v3 é diferente do v2 — ele roda em segundo plano e atribui uma pontuação (0,0 a 1,0) com base no comportamento do usuário. Uma pontuação mais próxima de 1,0 indica atividade provavelmente humana.
| Aspecto | ReCaptcha v2 | ReCaptcha v3 |
|---|---|---|
| Interação do Usuário | Checkbox/Desafios de Imagem | Nenhum (invisível) |
| Saída | Pass/Fail | Pontuação (0,0-1,0) |
| Parâmetro de Ação | Não necessário | Necessário |
| Quando usar | Formulários, logins | Todos os carregamentos de página |
A ação é especificada no JavaScript do site:
grecaptcha.execute('6LcxxxxxxxxxxxxxxxxABCD', {action: 'submit'})
Ações comuns incluem: submit, login, register, homepage, contact.
from scrapling import Fetcher
def scrape_with_recaptcha_v3(target_url, site_key, page_action="submit", min_score=0.7):
"""
Raspagem de uma página protegida pelo ReCaptcha v3.
Args:
target_url: A URL da página com o captcha
site_key: A chave de site do ReCaptcha
page_action: O parâmetro de ação (encontrado em grecaptcha.execute)
min_score: Pontuação mínima solicitada (0,1-0,9)
Returns:
A resposta da página protegida
"""
print(f"Resolvendo ReCaptcha v3 (ação: {page_action})...")
solution = solve_captcha(
task_type="ReCaptchaV3TaskProxyLess",
website_url=target_url,
website_key=site_key,
pageAction=page_action
)
captcha_token = solution["gRecaptchaResponse"]
print(f"Obtido token com pontuação: {solution.get('score', 'N/A')}")
# Submeter a solicitação com o token usando o método de classe do Scrapling
response = Fetcher.post(
target_url,
data={
"g-recaptcha-response": captcha_token,
},
headers={
"User-Agent": solution.get("userAgent", "Mozilla/5.0")
}
)
return response
# Exemplo de uso
if __name__ == "__main__":
url = "https://example.com/api/dados"
site_key = "6LcxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxABCD"
result = scrape_with_recaptcha_v3(url, site_key, page_action="obterDados")
print(f"Resposta: {result.body.decode()[:200]}") # Use .body para conteúdo
solution = solve_captcha(
task_type="ReCaptchaV3EnterpriseTaskProxyLess",
website_url=target_url,
website_key=site_key,
pageAction=page_action,
enterprisePayload={
"s": "parâmetro_s_opcional"
}
)
O Cloudflare Turnstile é uma alternativa mais recente ao captcha tradicional, projetada como uma "solução amigável ao usuário, preservando a privacidade" para substituir os captchas tradicionais. Ele está cada vez mais presente em sites que usam o Cloudflare.
O Turnstile vem em três modos:
Boa notícia? O CapSolver lida com todos os três automaticamente.
Procure o Turnstile no HTML da página:
<div class="cf-turnstile" data-sitekey="0x4xxxxxxxxxxxxxxxxxxxxxxxxxx"></div>
Ou no JavaScript:
turnstile.render('#container', {
sitekey: '0x4xxxxxxxxxxxxxxxxxxxxxxxxxx',
callback: function(token) { ... }
});
from scrapling import Fetcher
def scrape_with_turnstile(target_url, site_key, action=None, cdata=None):
"""
Raspagem de uma página protegida pelo Cloudflare Turnstile.
Args:
target_url: A URL da página com o captcha
site_key: A chave de site do Turnstile (começa com 0x4...)
action: Parâmetro de ação opcional
cdata: Parâmetro cdata opcional
Returns:
A resposta da página protegida
"""
print("Resolvendo Cloudflare Turnstile...")
# Construir metadados se fornecido
metadata = {}
if action:
metadata["action"] = action
if cdata:
metadata["cdata"] = cdata
task_params = {
"task_type": "AntiTurnstileTaskProxyLess",
"website_url": target_url,
"website_key": site_key,
}
if metadata:
task_params["metadata"] = metadata
solution = solve_captcha(**task_params)
turnstile_token = solution["token"]
user_agent = solution.get("userAgent", "")
print(f"Obtido token do Turnstile: {turnstile_token[:50]}...")
# Submeter com o token usando o método de classe do Scrapling
headers = {}
if user_agent:
headers["User-Agent"] = user_agent
response = Fetcher.post(
target_url,
data={
"cf-turnstile-response": turnstile_token,
},
headers=headers
)
return response
# Exemplo de uso
if __name__ == "__main__":
url = "https://example.com/protected"
site_key = "0x4AAAAAAAxxxxxxxxxxxxxx"
result = scrape_with_turnstile(url, site_key)
print(f"Sucesso! Obteve {len(result.body)} bytes") # Use .body para conteúdo
Alguns implementações exigem parâmetros adicionais:
solution = solve_captcha(
task_type="AntiTurnstileTaskProxyLess",
website_url=target_url,
website_key=site_key,
metadata={
"action": "login",
"cdata": "session_id_ou_dados_customizados"
}
)
Às vezes, requisições HTTP básicas não são suficientes. Alguns sites usam detecção de bots sofisticada que verifica:
O StealthyFetcher do Scrapling fornece proteção contra bots de nível de navegador usando um motor de navegador real com modificações de stealth.
O StealthyFetcher usa um navegador Firefox modificado com:
| Cenário | Use Fetcher | Use StealthyFetcher |
|---|---|---|
| Formulários simples com captcha | Sim | Não |
| Páginas com muito JavaScript | Não | Sim |
| Múltiplas camadas de proteção contra bots | Não | Sim |
| Velocidade é crítica | Sim | Não |
| Modo "Cloudflare Under Attack" | Não | Sim |
Aqui está como usar ambos juntos para máxima eficácia:
from scrapling import StealthyFetcher
import asyncio
async def scrape_with_stealth_and_recaptcha(target_url, site_key, captcha_type="v2"):
"""
Combina as funcionalidades anti-bot do StealthyFetcher com o CapSolver para ReCaptcha.
Args:
target_url: A URL para scraping
site_key: A chave do captcha
captcha_type: "v2" ou "v3"
Returns:
O conteúdo da página após resolver o captcha
"""
# Primeiro, resolva o captcha usando o CapSolver
print(f"Resolvendo ReCaptcha {captcha_type}...")
if captcha_type == "v2":
solution = solve_captcha(
task_type="ReCaptchaV2TaskProxyLess",
website_url=target_url,
website_key=site_key
)
token = solution["gRecaptchaResponse"]
elif captcha_type == "v3":
solution = solve_captcha(
task_type="ReCaptchaV3TaskProxyLess",
website_url=target_url,
website_key=site_key,
pageAction="submit"
)
token = solution["gRecaptchaResponse"]
else:
raise ValueError(f"Tipo de captcha desconhecido: {captcha_type}")
print(f"Obteve token: {token[:50]}...")
# Use o StealthyFetcher para comportamento de navegador
fetcher = StealthyFetcher()
# Navegue até a página
page = await fetcher.async_fetch(target_url)
# Injeta a solução do ReCaptcha usando JavaScript
await page.page.evaluate(f'''() => {{
// Encontre o campo g-recaptcha-response e defina seu valor
let field = document.querySelector('textarea[name="g-recaptcha-response"]');
if (!field) {{
field = document.createElement('textarea');
field.name = "g-recaptcha-response";
field.style.display = "none";
document.body.appendChild(field);
}}
field.value = "{token}";
}}''')
# Encontre e clique no botão de submissão
submit_button = page.css('button[type="submit"], input[type="submit"]')
if submit_button:
await submit_button[0].click()
# Aguarde a navegação
await page.page.wait_for_load_state('networkidle')
# Obtenha o conteúdo final da página
content = await page.page.content()
return content
# Wrapper síncrono para uso mais fácil
def scrape_stealth(target_url, site_key, captcha_type="v2"):
"""Wrapper síncrono para o scraper assíncrono do stealth."""
return asyncio.run(
scrape_with_stealth_and_recaptcha(target_url, site_key, captcha_type)
)
# Exemplo de uso
if __name__ == "__main__":
url = "https://example.com/pagina-altamente-protegida"
site_key = "6LcxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxABCD"
content = scrape_stealth(url, site_key, captcha_type="v2")
print(f"Obteve {len(content)} bytes de conteúdo")
from scrapling import StealthyFetcher
import asyncio
class StealthScraper:
"""Um scraper que mantém sessão entre múltiplas páginas."""
def __init__(self, api_key):
self.api_key = api_key
self.fetcher = None
async def __aenter__(self):
self.fetcher = StealthyFetcher()
return self
async def __aexit__(self, *args):
if self.fetcher:
await self.fetcher.close()
async def solve_and_access(self, url, site_key, captcha_type="v2"):
"""Resolve o ReCaptcha e acessa a página."""
global CAPSOLVER_API_KEY
CAPSOLVER_API_KEY = self.api_key
# Resolve o ReCaptcha
task_type = f"ReCaptcha{captcha_type.upper()}TaskProxyLess"
solution = solve_captcha(
task_type=task_type,
website_url=url,
website_key=site_key
)
token = solution["gRecaptchaResponse"]
# Navegue e injete o token
page = await self.fetcher.async_fetch(url)
# ... continue com interação na página
return page
# Uso
async def main():
async with StealthScraper("sua_api_key") as scraper:
page1 = await scraper.solve_and_access(
"https://example.com/login",
"site_key_aqui",
"v2"
)
# Sessão é mantida para requisições subsequentes
page2 = await scraper.solve_and_access(
"https://example.com/dashboard",
"outro_site_key",
"v3"
)
asyncio.run(main())
Não ataque os sites com muitas requisições. Implemente atrasos entre as requisições:
import time
import random
def scrape_polite(urls, min_delay=2, max_delay=5):
"""Scrape com atrasos aleatórios para parecer mais humano."""
results = []
for url in urls:
result = scrape_page(url)
results.append(result)
# Atraso aleatório entre requisições
delay = random.uniform(min_delay, max_delay)
time.sleep(delay)
return results
Sempre trate falhas com cuidado:
def robust_solve_captcha(task_type, website_url, website_key, max_retries=3, **kwargs):
"""Resolve captcha com tentativas automáticas."""
for attempt in range(max_retries):
try:
return solve_captcha(task_type, website_url, website_key, **kwargs)
except Exception as e:
print(f"Tentativa {attempt + 1} falhou: {e}")
if attempt < max_retries - 1:
time.sleep(5) # Espere antes de tentar novamente
else:
raise
Verifique o robots.txt do site antes de fazer scraping:
from urllib.robotparser import RobotFileParser
def pode_scrape(url):
"""Verifique se o scraping é permitido pelo robots.txt."""
rp = RobotFileParser()
rp.set_url(f"{url}/robots.txt")
rp.read()
return rp.can_fetch("*", url)
Ao fazer scraping em larga escala, rotacione proxies para evitar bloqueios de IP:
# O CapSolver suporta tarefas com proxy
solution = solve_captcha(
task_type="ReCaptchaV2Task", # Note: sem "ProxyLess"
website_url=target_url,
website_key=site_key,
proxy="http://user:pass@proxy.example.com:8080"
)
Tokens de captcha geralmente são válidos por 1-2 minutos. Se precisar fazer várias requisições, reutilize o token:
import time
class CaptchaCache:
def __init__(self, ttl=120): # TTL padrão de 2 minutos
self.cache = {}
self.ttl = ttl
def get_or_solve(self, key, solve_func):
"""Obtenha o token em cache ou resolva um novo."""
if key in self.cache:
token, timestamp = self.cache[key]
if time.time() - timestamp < self.ttl:
return token
token = solve_func()
self.cache[key] = (token, time.time())
return token
| Funcionalidade | ReCaptcha v2 | ReCaptcha v3 | Turnstile do Cloudflare |
|---|---|---|---|
| Interação do Usuário | Caixa de seleção + desafio possível | Nenhuma | Mínima ou nenhuma |
| Formato da Chave do Site | 6L... |
6L... |
0x4... |
| Campo de Resposta | g-recaptcha-response |
g-recaptcha-response |
cf-turnstile-response |
| Parâmetro de Ação | Não | Sim (necessário) | Opcional |
| Tempo para Resolver | 1-10 segundos | 1-10 segundos | 1-20 segundos |
| Tarefa do CapSolver | ReCaptchaV2TaskProxyLess |
ReCaptchaV3TaskProxyLess |
AntiTurnstileTaskProxyLess |
| Funcionalidade | Fetcher | StealthyFetcher |
|---|---|---|
| Velocidade | Muito rápida | Mais lenta |
| Suporte a JavaScript | Não | Sim |
| Impressão Digital do Navegador | Nenhuma | Firefox real |
| Uso de Memória | Baixo | Maior |
| Bypass do Cloudflare | Não | Sim |
| Ideal Para | Requisições simples | Anti-bot complexo |
Verifique a página de preços do CapSolver para as taxas atuais.
Procure no código fonte da página (Ctrl+U) por:
data-sitekeygrecaptcha.executerender= em URLs de scripts do reCaptchaclass="cf-turnstile" para TurnstileTokens geralmente expiram após 1-2 minutos. Resolva o captcha o mais perto possível da submissão do formulário. Se obtiver erros de validação, resolva novamente com um token novo.
Sim! Envolva a função de resolução em um executor assíncrono:
import asyncio
async def async_solve_captcha(*args, **kwargs):
loop = asyncio.get_event_loop()
return await loop.run_in_executor(
None,
lambda: solve_captcha(*args, **kwargs)
)
Resolva cada captcha separadamente e inclua todos os tokens em sua submissão:
# Resolva múltiplos ReCaptchas
solution_v2 = solve_captcha("ReCaptchaV2TaskProxyLess", url, key1)
solution_v3 = solve_captcha("ReCaptchaV3TaskProxyLess", url, key2, pageAction="submit")
# Submeta os tokens usando o método da classe Scrapling
response = Fetcher.post(url, data={
"g-recaptcha-response": solution_v2["gRecaptchaResponse"],
"g-recaptcha-response-v3": solution_v3["gRecaptchaResponse"],
})
Combinando Scrapling e CapSolver, você obtém uma solução poderosa para scraping de sites protegidos por captchas. Aqui está um resumo rápido:
Lembre-se de escrapear de forma responsável:
Pronto para começar a escrapear? Obtenha sua chave de API do CapSolver em capsolver.com e instale o Scrapling com pip install "scrapling[all]".
Aprenda arquitetura de raspagem web escalável em Rust com reqwest, scraper, raspagem assíncrona, raspagem de navegador headless, rotação de proxies e tratamento de CAPTCHA compatível.

Compare o Selenium vs Puppeteer para resolver CAPTCHA. Descubra benchmarks de desempenho, notas de estabilidade e como integrar o CapSolver para o máximo de sucesso.
