Blog
Web Scraping com Selenium e Python | Resolvendo Captcha ao fazer Web Scraping

Web Scraping com Selenium e Python | Resolvendo Captcha ao fazer Web Scraping

Logo of Capsolver

CapSolver Blogger

How to use capsolver

24-Jun-2024

Imagine que você pode obter facilmente todos os dados de que precisa na Internet sem ter que navegar manualmente na web ou copiar e colar. Essa é a beleza da raspagem web (web scraping). Quer você seja um analista de dados, pesquisador de mercado ou desenvolvedor, a raspagem web abre um mundo totalmente novo de coleta automatizada de dados.

Nesta era orientada por dados, a informação é poder. No entanto, extrair manualmente informações de centenas ou até milhares de páginas da web não é apenas demorado, mas também propenso a erros. Felizmente, a raspagem web fornece uma solução eficiente e precisa que permite automatizar o processo de extração dos dados necessários da Internet, melhorando muito a eficiência e a qualidade dos dados.

Índice

  1. O que é raspagem web?
  2. Introdução ao Selenium
  3. Contornando Proteções Anti-Raspagem
  4. Conclusão

O que é raspagem web?

A raspagem web é uma técnica para extrair automaticamente informações de páginas da web escrevendo programas. Esta tecnologia tem uma ampla gama de aplicações em muitos campos, incluindo análise de dados, pesquisa de mercado, inteligência competitiva, agregação de conteúdo e muito mais. Com a raspagem web, você pode coletar e consolidar dados de um grande número de páginas da web em um curto período de tempo, em vez de depender de operações manuais.

O processo de raspagem web geralmente inclui as seguintes etapas:

  • Enviar solicitação HTTP: Enviar programaticamente uma solicitação ao site alvo para obter o código-fonte HTML da página web. Ferramentas comumente usadas, como a biblioteca requests do Python, podem fazer isso facilmente.
  • Analisar o conteúdo HTML: Após obter o código-fonte HTML, é necessário analisá-lo para extrair os dados necessários. Bibliotecas de análise HTML, como BeautifulSoup ou lxml, podem ser usadas para processar a estrutura HTML.
  • Extrair dados: Com base na estrutura HTML analisada, localizar e extrair conteúdos específicos, como título do artigo, informações de preço, links de imagens, etc. Métodos comuns incluem o uso de XPath ou seletores CSS.
  • Armazenar dados: Salvar os dados extraídos em um meio de armazenamento adequado, como um banco de dados, arquivo CSV ou arquivo JSON, para posterior análise e processamento.

Além disso, ao usar ferramentas como o Selenium, é possível simular a operação do navegador do usuário, contornando alguns dos mecanismos anti-crawler, para assim completar a tarefa de raspagem web de forma mais eficiente.

Lutando com a falha repetida de resolver completamente o irritante captcha?

Descubra a resolução automática de captcha com a tecnologia de desbloqueio web automatizado com AI do Capsolver!

Reivindique seu Código de Bônus para as melhores soluções de captcha; CapSolver: WEBS. Após resgatar, você receberá um bônus extra de 5% após cada recarga, Ilimitado.

Introdução ao Selenium

Vamos usar o ScrapingClub como exemplo e usar o Selenium para completar o primeiro exercício.

Preparação

Primeiro, você precisa garantir que o Python esteja instalado em sua máquina local. Você pode verificar a versão do Python digitando o seguinte comando em seu terminal:

python --version

Certifique-se de que a versão do Python seja maior que 3. Se não estiver instalado ou a versão for muito baixa, faça o download da versão mais recente no site oficial do Python. Em seguida, você precisa instalar a biblioteca selenium usando o seguinte comando:

pip install selenium

Importar bibliotecas

from selenium import webdriver

Acessando uma página

Usar o Selenium para dirigir o Google Chrome para acessar uma página não é complicado. Após inicializar o objeto Chrome Options, você pode usar o método get() para acessar a página alvo:

import time
from selenium import webdriver

chrome_options = webdriver.ChromeOptions()
driver = webdriver.Chrome(options=chrome_options)
driver.get('https://scrapingclub.com/')

time.sleep(5)
driver.quit()

Parâmetros de inicialização

O Chrome Options pode adicionar muitos parâmetros de inicialização que ajudam a melhorar a eficiência da recuperação de dados. Você pode ver a lista completa de parâmetros no site oficial: Lista de Switches de Linha de Comando do Chromium. Alguns parâmetros comumente usados estão listados na tabela abaixo:

Parâmetro Finalidade
--user-agent="" Definir o User-Agent no cabeçalho da solicitação
--window-size=xxx,xxx Definir a resolução do navegador
--start-maximized Executar com resolução maximizada
--headless Executar no modo headless
--incognito Executar no modo incógnito
--disable-gpu Desativar aceleração de hardware GPU

Exemplo: executando no modo headless

import time
from selenium import webdriver

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
driver = webdriver.Chrome(options=chrome_options)
driver.get('https://scrapingclub.com/')

time.sleep(5)
driver.quit()

Localizando elementos da página

Um passo necessário na raspagem de dados é encontrar os elementos HTML correspondentes no DOM. O Selenium fornece dois métodos principais para localizar elementos na página:

  • find_element: Encontra um único elemento que atenda aos critérios.
  • find_elements: Encontra todos os elementos que atendam aos critérios.

Ambos os métodos suportam oito maneiras diferentes de localizar elementos HTML:

Método Significado Exemplo HTML Exemplo Selenium
By.ID Localizar pelo ID do elemento <form id="loginForm">...</form> driver.find_element(By.ID, 'loginForm')
By.NAME Localizar pelo nome do elemento <input name="username" type="text" /> driver.find_element(By.NAME, 'username')
By.XPATH Localizar por XPath <p><code>My code</code></p> driver.find_element(By.XPATH, "//p/code")
By.LINK_TEXT Localizar hyperlink pelo texto <a href="continue.html">Continue</a> driver.find_element(By.LINK_TEXT, 'Continue')
By.PARTIAL_LINK_TEXT Localizar hyperlink pelo texto parcial <a href="continue.html">Continue</a> driver.find_element(By.PARTIAL_LINK_TEXT, 'Conti')
By.TAG_NAME Localizar pelo nome da tag <h1>Welcome</h1> driver.find_element(By.TAG_NAME, 'h1')
By.CLASS_NAME Localizar pelo nome da classe <p class="content">Welcome</p> driver.find_element(By.CLASS_NAME, 'content')
By.CSS_SELECTOR Localizar pelo seletor CSS <p class="content">Welcome</p> driver.find_element(By.CSS_SELECTOR, 'p.content')

Vamos voltar à página do ScrapingClub e escrever o seguinte código para encontrar o elemento do botão "Get Started" para o primeiro exercício:

import time
from selenium import webdriver
from selenium.webdriver.common.by import By

chrome_options = webdriver.ChromeOptions()
driver = webdriver.Chrome(options=chrome_options)
driver.get('https://scrapingclub.com/')
get_started_button = driver.find_element(By.XPATH, "//div[@class='w-full rounded border

'][1]/div[3]")

time.sleep(5)
driver.quit()

Interação com elementos

Uma vez que encontramos o elemento do botão "Get Started", precisamos clicar no botão para entrar na próxima página. Isso envolve a interação com o elemento. O Selenium fornece vários métodos para simular ações:

  • click(): Clicar no elemento;
  • clear(): Limpar o conteúdo do elemento;
  • send_keys(*value: str): Simular a entrada do teclado;
  • submit(): Enviar um formulário;
  • screenshot(filename): Salvar uma captura de tela da página.

Para mais interações, consulte a documentação oficial: WebDriver API. Vamos continuar a melhorar o código do exercício do ScrapingClub adicionando a interação de clique:

import time
from selenium import webdriver
from selenium.webdriver.common.by import By

chrome_options = webdriver.ChromeOptions()
driver = webdriver.Chrome(options=chrome_options)
driver.get('https://scrapingclub.com/')
get_started_button = driver.find_element(By.XPATH, "//div[@class='w-full rounded border'][1]/div[3]")
get_started_button.click()

time.sleep(5)
driver.quit()

Extração de dados

Quando chegamos à primeira página do exercício, precisamos coletar a imagem do produto, nome, preço e informações de descrição. Podemos usar diferentes métodos para encontrar esses elementos e extraí-los:

from selenium import webdriver
from selenium.webdriver.common.by import By

chrome_options = webdriver.ChromeOptions()
driver = webdriver.Chrome(options=chrome_options)
driver.get('https://scrapingclub.com/')
get_started_button = driver.find_element(By.XPATH, "//div[@class='w-full rounded border'][1]/div[3]")
get_started_button.click()

product_name = driver.find_element(By.CLASS_NAME, 'card-title').text
product_image = driver.find_element(By.CSS_SELECTOR, '.card-img-top').get_attribute('src')
product_price = driver.find_element(By.XPATH, '//h4').text
product_description = driver.find_element(By.CSS_SELECTOR, '.card-description').text

print(f'Product name: {product_name}')
print(f'Product image: {product_image}')
print(f'Product price: {product_price}')
print(f'Product description: {product_description}')

driver.quit()

O código produzirá o seguinte conteúdo:

Product name: Long-sleeved Jersey Top
Product image: https://scrapingclub.com/static/img/73840-Q.jpg
Product price: $12.99
Product description: CONSCIOUS. Fitted, long-sleeved top in stretch jersey made from organic cotton with a round neckline. 92% cotton, 3% spandex, 3% rayon, 2% polyester.

Esperando elementos carregarem

Às vezes, devido a problemas de rede ou outras razões, os elementos podem não ter carregado quando o Selenium terminar de executar, o que pode causar falha na coleta de alguns dados. Para resolver esse problema, podemos definir uma espera até que um determinado elemento esteja completamente carregado antes de prosseguir com a extração de dados. Aqui está um exemplo de código:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

chrome_options = webdriver.ChromeOptions()
driver = webdriver.Chrome(options=chrome_options)
driver.get('https://scrapingclub.com/')
get_started_button = driver.find_element(By.XPATH, "//div[@class='w-full rounded border'][1]/div[3]")
get_started_button.click()

# aguardando até que os elementos da imagem do produto estejam completamente carregados
wait = WebDriverWait(driver, 10)
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.card-img-top')))

product_name = driver.find_element(By.CLASS_NAME, 'card-title').text
product_image = driver.find_element(By.CSS_SELECTOR, '.card-img-top').get_attribute('src')
product_price = driver.find_element(By.XPATH, '//h4').text
product_description = driver.find_element(By.CSS_SELECTOR, '.card-description').text

print(f'Product name: {product_name}')
print(f'Product image: {product_image}')
print(f'Product price: {product_price}')
print(f'Product description: {product_description}')

driver.quit()

Contornando Proteções Anti-Raspagem

O exercício do ScrapingClub é fácil de completar. No entanto, em cenários reais de coleta de dados, obter dados não é tão fácil porque alguns sites empregam técnicas anti-raspagem que podem detectar seu script como um bot e bloquear a coleta. A situação mais comum são os desafios de captcha, como funcaptcha, datadome, recaptcha, hcaptcha, geetest, etc.

Resolver esses desafios de captcha requer vasta experiência em aprendizado de máquina, engenharia reversa e contramedidas de impressão digital do navegador, o que pode levar muito tempo. Felizmente, agora você não precisa fazer todo esse trabalho sozinho. CapSolver fornece uma solução completa para ajudá-lo a contornar todos os desafios facilmente. CapSolver oferece extensões de navegador que podem resolver automaticamente os desafios de captcha enquanto usa o Selenium para coletar dados. Além disso, eles fornecem métodos de API para resolver captchas e obter tokens, tudo em apenas alguns segundos. Consulte a Documentação do CapSolver para mais informações.

Conclusão

Desde a extração de detalhes do produto até a navegação por medidas complexas de anti-raspagem, a raspagem web com Selenium abre portas para um vasto mundo de coleta automatizada de dados. À medida que navegamos pelo cenário em constante evolução da web, ferramentas como o CapSolver pavimentam o caminho para uma extração de dados mais tranquila, tornando desafios outrora formidáveis uma coisa do passado. Portanto, quer você seja um entusiasta de dados ou um desenvolvedor experiente, aproveitar essas tecnologias não só melhora a eficiência, mas também desbloqueia um mundo onde insights orientados por dados estão a apenas uma raspagem de distância.

Mais