Como contornar CAPTCHAs com Selenium em Python

Aprenda a contornar CAPTCHAs no Selenium com este tutorial abrangente. Descubra técnicas práticas para lidar com os desafios do CAPTCHA no Scraping de dados.
12 min de leitura
How to bypass CAPTCHAs with Selenium blog image

Neste tutorial sobre como contornar o CAPTCHA do Selenium, você aprenderá:

  • O que são CAPTCHAs e se eles podem ser evitados
  • Como evitar um CAPTCHA no Selenium
  • O que fazer se um CAPTCHA ainda aparecer

Vamos começar!

O que são CAPTCHAs e é possível evitá-los?

CAPTCHA, abreviação de “Completely Automated Public Turing test to tell Computers and Humans Apart” (Teste de Turing público completamente automatizado para diferenciar computadores de humanos), é um mecanismo projetado para diferenciar usuários humanos de bots. Ele apresenta desafios fáceis para os humanos, mas difíceis para as máquinas resolverem. Provedores de CAPTCHA bem conhecidos incluem Google reCAPTCHA, hCaptcha e BotDetect.

Os tipos populares de CAPTCHA incluem:

  • Desafios baseados em texto: os usuários precisam digitar uma sequência de letras e números distorcidos.
  • Desafios baseados em imagens: os usuários precisam identificar objetos específicos em uma grade de imagens.
  • Desafios baseados em áudio: os usuários devem digitar as palavras que ouvem.
  • Desafios de quebra-cabeças: os usuários têm a tarefa de resolver quebra-cabeças simples, como navegar em um labirinto.
Text CAPTCHA example

Os CAPTCHAs geralmente fazem parte de fluxos específicos do usuário, como a etapa final de um processo de envio de formulário:

captcha as a step of a form submission process example

Nesses casos, os CAPTCHAs existem para garantir que os bots não concluam o fluxo do usuário. Para automatizar esses desafios, você pode usar bibliotecas ou serviços de Resolução de CAPTCHA que dependem de operadores humanos para resolver os desafios em tempo real. No entanto, CAPTCHAs codificados são incomuns devido ao seu impacto negativo na experiência do usuário.

Mais frequentemente, os CAPTCHAs fazem parte de soluções abrangentes anti-bot, como um WAF (Web Application Firewall):

Example-of-a-Web-Application-Firewall

Esses sistemas exibem CAPTCHAs dinamicamente quando suspeitam de atividade de bots. Nesses casos, os CAPTCHAs podem ser contornados fazendo com que seu bot imite o comportamento humano em um navegador do mundo real. Ainda assim, isso requer a atualização constante de seus scripts para se antecipar aos novos métodos de detecção de bots.

Uma solução mais eficaz para evitar CAPTCHAs é usar uma ferramenta de última geração, como o recurso de Resolução de CAPTCHA da Bright Data. Essa ferramenta em nuvem está sempre atualizada e pode lidar com uma ampla variedade de tipos de CAPTCHA para você.

Tratamento de CAPTCHA com Selenium: tutorial passo a passo

Como você acabou de aprender, uma maneira eficaz de evitar CAPTCHAs é fazer com que seu script automatizado imite o comportamento humano enquanto controla um navegador com uma impressão digital do mundo real. Uma das melhores ferramentas para esse fim é o Selenium, uma biblioteca popular de automação de navegadores.

Nesta seção do tutorial, você aprenderá como evitar CAPTCHAs no Selenium usando um script Python. Vamos começar!

Etapa 1: crie um novo projeto Python

Antes de começar, certifique-se de ter o Python 3 e o Chrome instalados localmente.

Se você já tem um script de Scraping de dados ou teste do Selenium, pode pular as três primeiras etapas. Caso contrário, crie uma pasta para o seu projeto de demonstração de bypass de CAPTCHA do Selenium e navegue até ela no terminal:

mkdir selenium_demo

cd selenium_demo

Em seguida, adicione um novo ambiente virtual Python dentro dela:

python -m venv venv

Abra a pasta do projeto em seu IDE Python favorito e crie um novo arquivo chamado script.py.

Ótimo! A pasta do seu projeto agora contém um aplicativo Python.

Etapa 2: Instale o Selenium

Ative o ambiente virtual Python com o comando abaixo:

venvScriptsactivate

Ou, de forma equivalente, se você for um usuário Linux ou macOS:

source venv/bin/activate

Em seguida, instale o Selenium através do pacote pip para selenium usando este comando:

pip install selenium

O processo de instalação pode demorar um pouco, então seja paciente.

Ótimo! Você está pronto para inicializar seu script Selenium.

Etapa 3: Configure seu script Selenium

Importe o Selenium adicionando a seguinte linha ao script.py:

from selenium import webdriver

Agora, crie um objeto ChromeOptions para configurar o Chrome para iniciar no modo headless:

options = webdriver.ChromeOptions()

options.add_argument("--headless")

Se você não estiver familiarizado com essa opção, saiba mais em nosso guia sobre navegadores headless.

Inicialize uma instância do Chrome WebDriver com essas opções e, por fim, feche-a com quit(). Este é o aspecto que o seu arquivo script.py deve ter atualmente:

from selenium import webdriver

# configure o Chrome para iniciar no modo headless

options = webdriver.ChromeOptions()

options.add_argument("--headless")

# inicie uma instância do Chrome

driver = webdriver.Chrome(options=options)

# lógica de automação do navegador...

# feche o navegador e libere seus recursos

driver.quit()

O script acima inicia uma nova instância do Chrome no modo headless antes de fechar o navegador. Ótimo! É hora de implementar a lógica de automação do navegador.

Etapa 4: adicionar a lógica de automação do navegador

Para avaliar a lógica de bypass do CAPTCHA do Selenium, o script automatizado se conectará ao bot.sannysoft.com e fará uma captura de tela. Essa página da web especial executa vários testes no navegador para determinar se o usuário é um humano ou um bot. Se você visitar a página no seu navegador favorito, verá que todos os testes foram aprovados.

Instrua a instância do Chrome a visitar a página de destino usando o método get():

driver.get("https://bot.sannysoft.com/")

Em seguida, você precisa fazer uma captura de tela de toda a página. Infelizmente, o Selenium não oferece uma função para fazer isso diretamente. Como solução alternativa, você pode definir a janela do navegador com a largura e a altura do nó <body> e, em seguida, fazer uma captura de tela:

# obter a largura e a altura do corpo

full_width = driver.execute_script("return document.body.parentNode.scrollWidth")

full_height = driver.execute_script("return document.body.parentNode.scrollHeight")

# definir a janela do navegador para a largura e altura do corpo

driver.set_window_size(full_width, full_height)

# tirar uma captura de tela de toda a página

driver.save_screenshot("screenshot.png")

# restaurar o tamanho original da janela

driver.set_window_size(original_size["width"], original_size["height"])

O truque acima funcionará, e screenshot.png conterá a captura de tela de toda a página.

Junte tudo e você terá a seguinte lógica:

from selenium import webdriver

# configurar o Chrome para iniciar no modo headless

options = webdriver.ChromeOptions()

options.add_argument("--headless")

# iniciar uma instância do Chrome

driver = webdriver.Chrome(options=options)

# conectar-se à página de destino

driver.get("https://bot.sannysoft.com/")

# obter o tamanho da janela atual

original_size = driver.get_window_size()

# obter a largura e a altura do corpo

full_width = driver.execute_script("return document.body.parentNode.scrollWidth")

full_height = driver.execute_script("return document.body.parentNode.scrollHeight")

# definir a janela do navegador para a largura e altura do corpo

driver.set_window_size(full_width, full_height)

# tirar uma captura de tela de toda a página

driver.save_screenshot("screenshot.png")

# restaurar o tamanho original da janela

driver.set_window_size(original_size["width"], original_size["height"])

# fechar o navegador e liberar seus recursos

driver.quit()

Inicie o arquivo script.py acima com este comando:

python script.py

O script iniciará uma instância do Chromium no modo headless, conectará-se à página desejada, fará uma captura de tela e fechará o navegador. Ao final da execução do script, um arquivo screenshot.png aparecerá na pasta raiz do projeto. Abra-o e você verá:

screenshot.png file example

Como você pode ver pelas caixas vermelhas, o Chrome no modo headless controlado via Selenium vanilla não passa em vários testes. Isso significa que seu script provavelmente será detectado como um bot. A consequência é que um site protegido com tecnologia anti-bot pode exibir um CAPTCHA quando você interagir com ele. A solução para evitar um CAPTCHA no Selenium? O plugin Stealth!

Etapa 5: instale o plugin Selenium Stealth

O Selenium Stealth é um pacote Python projetado para tornar a instância do Chrome/Chromium controlada pelo Selenium menos detectável como um bot. O objetivo deste projeto é configurar o navegador para contornar quase todas as estratégias conhecidas de detecção de bots.

Especificamente, o Selenium Stealth modifica as propriedades do navegador para evitar vazamentos que exponham o navegador como automatizado. Se você está familiarizado com soluções de contorno anti-bot, este pacote pode ser visto como uma reimplementação do Puppeteer Stealth.

Instale o Selenium Stealth através do pacote pip selenium-stealth:

pip install selenium-stealth

Em seguida, importe a biblioteca adicionando esta linha ao arquivo script.py:

from selenium_stealth import stealth

Pronto! Agora só falta configurar as definições de ocultação.

Etapa 6: Configure as definições Stealth para evitar CAPTCHAs

Para registrar o Selenium Stealth e configurar o Chrome WebDriver para evitar CAPTCHAs, chame a função stealth() da seguinte maneira:

stealth(

driver,

user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36",

languages=["en-US", "en"],

vendor="Google Inc.",

platform="Win32",

webgl_vendor="Intel Inc.",

renderer="Intel Iris OpenGL Engine",

fix_hairline=True,

)

Configure os argumentos da função como preferir, mas lembre-se de que os valores acima são suficientes para contornar a maioria das medidas anti-bot.

Muito bem! O navegador controlado pelo Selenium agora aparecerá como um navegador real usado por um usuário humano.

Etapa 7: repita o teste de detecção de bots

Abaixo está o arquivo script.js final:

from selenium import webdriver

from selenium_stealth import stealth

# configure o Chrome para iniciar no modo headless

options = webdriver.ChromeOptions()

options.add_argument("--headless")

# inicie uma instância do Chrome

driver = webdriver.Chrome(options=options)

# configure o WebDriver para evitar a detecção de bots

# com o Selenium Stealth

stealth(

driver,

user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36",

languages=["en-US", "en"],

vendor="Google Inc.",

platform="Win32",

webgl_vendor="Intel Inc.",

renderer="Intel Iris OpenGL Engine",

fix_hairline=True,

)

# conectar-se à página de destino

driver.get("https://bot.sannysoft.com/")

# obter o tamanho atual da janela

original_size = driver.get_window_size()

# obter a largura e a altura do corpo

full_width = driver.execute_script("return document.body.parentNode.scrollWidth")

full_height = driver.execute_script("return document.body.parentNode.scrollHeight")

# definir a janela do navegador para a largura e altura do corpo

driver.set_window_size(full_width, full_height)

# tirar uma captura de tela de toda a página

driver.save_screenshot("screenshot.png")

# restaurar o tamanho original da janela

driver.set_window_size(tamanho_original["width"], tamanho_original["height"])

# fechar o navegador e liberar seus recursos

driver.quit()

Execute novamente o script Python do Selenium para ignorar o CAPTCHA:

python script.py

Dê uma olhada em screenshot.png e você verá que todos os testes de detecção de bots foram aprovados:

All bot detection tests passed on the new screenshot.png

Et voilà! Agora você conhece o truque para evitar CAPTCHAs anti-bot no Selenium.

O que fazer se a solução Selenium para contornar o CAPTCHA acima não funcionar

Infelizmente, as configurações do navegador não são o único aspecto em que as soluções anti-bot se concentram. A reputação do IP é outro aspecto importante, e você não pode simplesmente alterar seu IP para um mais confiável usando uma biblioteca gratuita. Isso requer a integração do Proxy Selenium!

Em outras palavras, mesmo que você configure seu navegador de maneira ideal, os CAPTCHAs ainda podem aparecer. Para CAPTCHAs simples que exigem apenas um único clique, você pode tentar usar pacotes como selenium-recaptcha-solver ou selenium-recptcha. No entanto, essas bibliotecas funcionam apenas com o reCAPTCHA v2 e não são mais mantidas.

O principal problema com a abordagem do capítulo anterior e esses pacotes é que eles funcionam apenas contra CAPTCHAs básicos. Ao lidar com sistemas anti-bot mais complexos, como o Cloudflare, você precisa de uma solução muito mais poderosa.

Procurando uma solução CAPTCHA Selenium real? Experimente as soluções de Scraping de dados da Bright Data!

Elas vêm com recursos superiores de desbloqueio, com um recurso dedicado para a Resolução de CAPTCHA, para lidar automaticamente com reCAPTCHA, hCaptcha, px_captcha, SimpleCaptcha, GeeTest CAPTCHA, FunCaptcha, Cloudflare Turnstile, AWS WAF Captcha, KeyCAPTCHA e muitos outros.

Integrar o CAPTCHA Solver da Bright Data ao seu script é fácil, pois ele funciona com qualquer cliente HTTP ou ferramenta de automação de navegador, incluindo o Selenium.

Saiba mais sobre como usar o CAPTCHA Solver da Bright Data e confira a documentação para obter todos os detalhes de configuração.

Conclusão

Neste artigo, você viu por que os CAPTCHAs são um desafio para softwares automatizados e como lidar com eles no Selenium. Graças à biblioteca Selenium Stealth, você pode substituir as configurações padrão do Chrome para limitar a detecção de bots. No entanto, essa abordagem não é uma solução definitiva.

Independentemente de quão sofisticada seja sua lógica de contorno de CAPTCHA do Selenium, ferramentas avançadas de detecção de bots ainda serão capazes de bloqueá-lo. A solução real é conectar-se ao site de destino por meio de uma API de desbloqueio que pode retornar o HTML sem CAPTCHA de qualquer página da web.

Essa API não é um sonho. Ela existe e se chama Web Unlocker, uma API de scraping que alterna automaticamente seu IP de saída a cada solicitação por meio da integração de Proxy e lida com impressões digitais do navegador, novas tentativas automáticas e resolução de CAPTCHA para você. Lidar com CAPTCHAs nunca foi tão fácil!

Inscreva-se agora e comece seu teste grátis.