
Anh Tuan
Data Science Expert
SeleniumBase é uma estrutura Python que simplifica a automação e os testes da web. Ela estende os recursos do Selenium WebDriver com uma API mais amigável, seletores avançados, esperas automáticas e ferramentas de teste adicionais.
Antes de começarmos, certifique-se de que o Python 3 esteja instalado em seu sistema. Siga estas etapas para configurar o SeleniumBase:
Instale o SeleniumBase:
pip install seleniumbase
Verifique a Instalação:
sbase --help
Vamos começar criando um script simples que navega para quotes.toscrape.com e extrai citações e autores.

Exemplo: Raspe citações e seus autores da página inicial.
# scrape_quotes.py
from seleniumbase import BaseCase
class QuotesScraper(BaseCase):
def test_scrape_quotes(self):
self.open("https://quotes.toscrape.com/")
quotes = self.find_elements("div.quote")
for quote in quotes:
text = quote.find_element("span.text").text
author = quote.find_element("small.author").text
print(f"\"{text}\" - {author}")
if __name__ == "__main__":
QuotesScraper().main()
Execute o script:
python scrape_quotes.py
Saída:
“The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.” - Albert Einstein
...
Para aprimorar suas habilidades de web scraping, vamos explorar exemplos mais avançados usando SeleniumBase.
Muitos sites exibem conteúdo em várias páginas. Vamos modificar nosso script para navegar por todas as páginas e raspar citações.
# scrape_quotes_pagination.py
from seleniumbase import BaseCase
class QuotesPaginationScraper(BaseCase):
def test_scrape_all_quotes(self):
self.open("https://quotes.toscrape.com/")
while True:
quotes = self.find_elements("div.quote")
for quote in quotes:
text = quote.find_element("span.text").text
author = quote.find_element("small.author").text
print(f"\"{text}\" - {author}")
# Verifique se existe uma próxima página
if self.is_element_visible('li.next > a'):
self.click('li.next > a')
else:
break
if __name__ == "__main__":
QuotesPaginationScraper().main()
Explicação:
is_element_visible para verificar se o botão "Próximo" está disponível.Alguns sites carregam conteúdo dinamicamente usando AJAX. SeleniumBase pode lidar com esses cenários esperando que os elementos carreguem.
Exemplo: Raspe tags do site, que carregam dinamicamente.
# scrape_dynamic_content.py
from seleniumbase import BaseCase
class TagsScraper(BaseCase):
def test_scrape_tags(self):
self.open("https://quotes.toscrape.com/")
# Clique no link 'Top Ten tags' para carregar tags dinamicamente
self.click('a[href="/tag/"]')
self.wait_for_element("div.tags-box")
tags = self.find_elements("span.tag-item > a")
for tag in tags:
tag_name = tag.text
print(f"Tag: {tag_name}")
if __name__ == "__main__":
TagsScraper().main()
Explicação:
div.tags-box carregue para garantir que o conteúdo dinâmico seja carregado.wait_for_element garante que o script não prossiga até que o elemento esteja disponível.Às vezes, você precisa fazer login em um site antes de raspar o conteúdo. Aqui está como você pode lidar com o envio de formulários.
Exemplo: Faça login no site e raspe as citações da página do usuário autenticado.
# scrape_with_login.py
from seleniumbase import BaseCase
class LoginScraper(BaseCase):
def test_login_and_scrape(self):
self.open("https://quotes.toscrape.com/login")
# Preencha o formulário de login
self.type("input#username", "testuser")
self.type("input#password", "testpass")
self.click("input[type='submit']")
# Verifique o login procurando um link de logout
if self.is_element_visible('a[href="/logout"]'):
print("Logado com sucesso!")
# Agora raspe as citações
self.open("https://quotes.toscrape.com/")
quotes = self.find_elements("div.quote")
for quote in quotes:
text = quote.find_element("span.text").text
author = quote.find_element("small.author").text
print(f"\"{text}\" - {author}")
else:
print("Falha ao logar.")
if __name__ == "__main__":
LoginScraper().main()
Explicação:
Observação: Como quotes.toscrape.com permite qualquer nome de usuário e senha para demonstração, podemos usar credenciais fictícias.
Os sites costumam apresentar dados em tabelas. Aqui está como extrair dados de tabela.
Exemplo: Raspe dados de uma tabela (exemplo hipotético, pois o site não possui tabelas).
# scrape_table.py
from seleniumbase import BaseCase
class TableScraper(BaseCase):
def test_scrape_table(self):
self.open("https://www.example.com/table-page")
# Espere a tabela carregar
self.wait_for_element("table#data-table")
rows = self.find_elements("table#data-table > tbody > tr")
for row in rows:
cells = row.find_elements("td")
row_data = [cell.text for cell in cells]
print(row_data)
if __name__ == "__main__":
TableScraper().main()
Explicação:
quotes.toscrape.com não possui tabelas, substitua a URL por um site real que contenha uma tabela.Embora quotes.toscrape.com não tenha CAPTCHAs, muitos sites do mundo real têm. Para nos prepararmos para tais casos, demonstraremos como integrar o CapSolver em nosso script SeleniumBase usando a extensão do navegador CapSolver.
Baixe a Extensão CapSolver:
./capsolver_extension.Localize o Arquivo de Configuração:
config.json localizado no diretório capsolver_extension/assets.Atualize a Configuração:
enabledForcaptcha e/ou enabledForRecaptchaV2 como true dependendo dos tipos de CAPTCHA que você deseja resolver.captchaMode ou reCaptchaV2Mode como "token" para resolução automática.Exemplo config.json:
{
"apiKey": "YOUR_CAPSOLVER_API_KEY",
"enabledForcaptcha": true,
"captchaMode": "token",
"enabledForRecaptchaV2": true,
"reCaptchaV2Mode": "token",
"solveInvisibleRecaptcha": true,
"verbose": false
}
"YOUR_CAPSOLVER_API_KEY" por sua chave de API CapSolver real.Para usar a extensão CapSolver no SeleniumBase, precisamos configurar o navegador para carregar a extensão quando ele iniciar.
Modifique seu Script SeleniumBase:
ChromeOptions de selenium.webdriver.chrome.options.Exemplo:
from seleniumbase import BaseCase
from selenium.webdriver.chrome.options import Options as ChromeOptions
import os
class QuotesScraper(BaseCase):
def setUp(self):
super().setUp()
# Caminho para a extensão CapSolver
extension_path = os.path.abspath('capsolver_extension')
# Configure as opções do Chrome
options = ChromeOptions()
options.add_argument(f"--load-extension={extension_path}")
options.add_argument("--disable-gpu")
options.add_argument("--no-sandbox")
# Atualize o driver com as novas opções
self.driver.quit()
self.driver = self.get_new_driver(browser_name="chrome", options=options)
Certifique-se de que o Caminho da Extensão esteja Correto:
extension_path aponte para o diretório onde você descompactou a extensão CapSolver.Aqui está um script completo que integra o CapSolver ao SeleniumBase para resolver CAPTCHAs automaticamente. Continuaremos usando https://recaptcha-demo.appspot.com/recaptcha-v2-checkbox.php como nosso site de exemplo.
# scrape_quotes_with_capsolver.py
from seleniumbase import BaseCase
from selenium.webdriver.chrome.options import Options as ChromeOptions
import os
class QuotesScraper(BaseCase):
def setUp(self):
super().setUp()
# Caminho para a pasta da extensão CapSolver
# Certifique-se de que este caminho aponte corretamente para a pasta da extensão do Chrome CapSolver
extension_path = os.path.abspath('capsolver_extension')
# Configure as opções do Chrome
options = ChromeOptions()
options.add_argument(f"--load-extension={extension_path}")
options.add_argument("--disable-gpu")
options.add_argument("--no-sandbox")
# Atualize o driver com as novas opções
self.driver.quit() # Feche qualquer instância de driver existente
self.driver = self.get_new_driver(browser_name="chrome", options=options)
def test_scrape_quotes(self):
# Navegue para o site de destino com reCAPTCHA
self.open("https://recaptcha-demo.appspot.com/recaptcha-v2-checkbox.php")
# Verifique se o CAPTCHA está presente e resolva-o se necessário
if self.is_element_visible("iframe[src*='recaptcha']"):
# A extensão CapSolver deve lidar com o CAPTCHA automaticamente
print("CAPTCHA detectado, aguardando a extensão CapSolver para resolvê-lo...")
# Espere o CAPTCHA ser resolvido
self.sleep(10) # Ajuste o tempo com base no tempo médio de resolução
# Prossiga com as ações de raspagem após o CAPTCHA ser resolvido
# Ação de exemplo: clicando em um botão ou extraindo texto
self.assert_text("reCAPTCHA demo", "h1") # Confirme o conteúdo da página
def tearDown(self):
# Limpe e feche o navegador após o teste
self.driver.quit()
super().tearDown()
if __name__ == "__main__":
QuotesScraper().main()
Explicação:
Método setUp:
setUp para configurar o navegador Chrome com a extensão CapSolver antes de cada teste.Método test_scrape_quotes:
Método tearDown:
Executando o Script:
python scrape_quotes_with_capsolver.py
Observação: Embora quotes.toscrape.com não tenha CAPTCHAs, a integração do CapSolver prepara seu scraper para sites que o possuem.
Neste guia, exploramos como realizar web scraping usando SeleniumBase, cobrindo técnicas básicas de raspagem e exemplos mais avançados como lidar com paginação, conteúdo dinâmico e envio de formulários. Também demonstramos como integrar o CapSolver em seus scripts SeleniumBase para resolver CAPTCHAs automaticamente, garantindo sessões de raspagem ininterruptas.
Aprenda como resolver desafios do AWS WAF e CAPTCHAs sem um navegador. Utilize a API do CapSolver para gerar tokens e contornar códigos de status 405.

Configure a raspagem de web no Linux com Python, proxies e tratamento de CAPTCHA. Um guia prático para desenvolvedores que aborda Scrapy, Playwright, CapSolver e pipelines de dados.

Aprenda o que causa o erro 1020 Acesso Negado do Cloudflare, como o Firewall de Aplicação Web e a detecção de bots funcionam e como os desenvolvedores podem reduzir falsos positivos em fluxos de trabalho de automação legítimos.
