Raspagem da web com o guia de Selenium

Este é o único guia passo-a-passo de que necessitará para começar a coletar dados da web a partir dos sítios alvo, e guardá-los como ficheiros CSV em menos de 10 minutos
6 min read
How to use Selenium for web scraping

Neste artigo iremos discutir:

O correspondente repositório GitHub para este artigo pode ser encontrado aqui.

Selenium: O que é, e como é utilizado

Selenium é um software de código aberto que inclui uma variedade de ferramentas e bibliotecas que permitem atividades de automatização de navegadores, incluindo:

  • Ações/recuperação de elementos baseados em páginas web (por exemplo, fechar, voltar, get_cookie, get_screenshot_as_png, get_window_size)
  • Teste do sítio
  • Gestão de avisos de alerta, e cookies (adição/remoção)
  • Apresentação de elementos do formulário
  • Coleta de dados / raspagem da web

É compatível com a maioria dos navegadores, incluindo Firefox, Chrome, Safari e Internet Browser. E pode ser utilizado para escrever testes numa variedade de linguagens de programação tais como Python, Node.js, C#, JavaScript e PHP. Para sua conveniência, incluí um link para a biblioteca de documentação oficial do Selenium 4.1.5.

Puppeteer vs. Selenium

Para aqueles que estão a debater-se, e a considerar “Puppeteer vs. Selenium”, direi que o “Puppeteer” pode servi-lo melhor se planear concentrar-se principalmente no JavaScript, e no Chrome. Selenium, por outro lado, pode ser a melhor escolha se estiver a procurar trabalhar em vários navegadores diferentes para testar aplicações de navegadores e/ou realizar a coleta de dados da web.

Um guia passo-a-passo para raspar com Selenium

Primeiro passo: Instalar Selenium

Para aqueles que têm pip (ou seja, instalador de pacotes para Python) nos vossos computadores, tudo o que precisam de fazer é abri-lo e digitar:

pip install -U selenium

Caso contrário, pode descarregar PyPI, desarquivá-lo, e executar:

python setup.py install

Note que precisará de um driver para que Selenium possa fazer interface com o seu navegador à sua escolha. Aqui tem enlaces para alguns dos mais populares drivers de navegadores para sua conveniência:

Vamos usar o Firefox como um navegador de exemplo. Conseguiria isto abrindo o Firefox, indo a uma página web, digamos Yahoo, procurando por “seleniumhq”, e depois fechando o navegador. Aqui está o que isso pareceria em código:

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

browser = webdriver.Firefox()

browser.get('http://www.yahoo.com')
assert 'Yahoo' in browser.title

elem = browser.find_element(By.NAME, 'p')  # Find the search box
elem.send_keys('seleniumhq' + Keys.RETURN)

browser.quit()

Segundo passo: Importação de pacotes de apoio

Selenium não é utilizado isoladamente, mas sim em conjunto com outros programas, incluindo o Pandas (uma ferramenta de análise de dados de fonte aberta fácil de usar), por exemplo. Eis o que deve estar a teclar, a fim de o conseguir:

from selenium import webdriver
import time
import pandas as pd 

Terceiro passo: Definição de variáveis

Nesta etapa definiremos a nossa pasta de destino, consulta de pesquisa, e site de destino. Neste exemplo, teremos como objetivo mapear diferentes oportunidades de emprego, tal como apresentadas por empresas concorrentes no LinkedIn. O que se escreve deve parecer-se com isto:

FILE_PATH_FOLDER = 'F:....Competitive_Analysis'
search_query = 'https://www.linkedin.com/q-chief-financial-officer-jobs.html'
driver = webdriver.Chrome(executable_path='C:/.../chromedriver_win32/chromedriver.exe')
job_details = []

Quarto passo: Inspeção da etiqueta HTML

Os sítios HTML têm tipicamente um identificador único para cada etiqueta que está associada à informação que é exibida em qualquer sítio alvo. A técnica aqui é aproveitar esta propriedade do sítio HTML para rastejar o sítio alvo em questão. Pode conseguir isto ao:

  • Clicar com o botão direito do rato em qualquer parte da página, e depois clicar em ‘inspecionar’.
  • E depois ao clicar na seta que aparece no canto superior esquerdo ou ao premir as teclas Ctrl+Shift+C para inspecionar um elemento específico e obter a etiqueta HTML desejada

Eis o que isso parece:

driver.get(search_query)
time.sleep(5)
job_list = driver.find_elements_by_xpath("//div[@data-tn-component='organicJob']")

Quinto passo: Extração de pontos de dados específicos

Extrairemos os nossos pontos de dados alvo utilizando o atributo ‘find_elements_by_xpath’ no driver da web de Selenium, sairemos do driver, e fecharemos o navegador assim que os dados alvo tiverem sido coletados.

Visaremos os pontos de dados da seguinte forma:

  • Título do trabalho
  • Empresa
  • Local do trabalho
  • Descrição do trabalho
  • Data em que o trabalho foi carregado

Eis o que isso parece:

for each_job in job_list:
    # Getting job info
    job_title = each_job.find_elements_by_xpath(".//h2[@class='title']/a")[0]
    job_company = each_job.find_elements_by_xpath(".//span[@class='company']")[0]
    job_location = each_job.find_elements_by_xpath(".//span[@class='location accessible-contrast-color-location']")[0]
    job_summary = each_job.find_elements_by_xpath(".//div[@class='summary']")[0]
    job_publish_date = each_job.find_elements_by_xpath(".//span[@class='date ']")[0]
    # Saving job info 
    job_info = [job_title.text, job_company.text, job_location.text, job_summary.text, job_publish_date.text]
 # Saving into job_details
    job_details.append(job_info)
driver.quit()

Note-se que estes seletores podem ser mudados pelo alvo, pelo que as pessoas devem confirmar que os seletores em questão estão corretos, não assumir que o estão.

Sexto passo: Guardar os dados em preparação para os resultados

Nesta altura, desejará adicionar colunas ao quadro de dados e fazer uso do atributo ‘to_csv’ para guardar todos os dados obtidos em formato CSV, como se segue:

job_details_df = pd.DataFrame(job_details)
job_details_df.columns = ['title', 'company', 'location', 'summary', 'publish_date']
job_details_df.to_csv('job_details.csv', index=False)

O seu ficheiro CSV desejado será descarregado para o seguinte local: FILE_PATH_FOLDER

É tudo! Acabou de concluir com sucesso o seu primeiro trabalho de raspagem da web com Selenium.

Integração de proxies com Selenium

A integração de proxies com Selenium pode ajudá-lo:

  • Realizar a coleta de dados em diversas geolocalizações
  • Permitir a coleta de dados à escala sem risco de bloqueio (por exemplo, limitações de taxas sobre IPs que enviam “demasiados” pedidos de dados simultâneos/consecutivos). Neste contexto, poderá também querer analisar os serviços de desbloqueio da web dedicados.
  • Capacitar você a coletar dados do ponto de vista de um IP de usuário real para que você não seja servido informações enganosas por sites alvo potencialmente desconfiados

A integração de proxies com Selenium pode ser realizada ao:

  1. Ir ao seu Painel de Bright Data e clicar em ‘criar uma Zona’.
  2. Escolher ‘Tipo de rede’ e depois clicar em ‘guardar’.
  3. Em seguida, dirigir-se para Selenium, e preencher o ‘Proxy IP:Port’ na função ‘setProxy’, por exemplo: zproxy.lum-superproxy.io:22225 de HTTP e HTTPS.
  4. Em ‘sendKeys’ introduzir o seu ID de conta de Bright Data e nome de zona name:lum-customer-CUSTOMER-zone-YOURZONE e a sua palavra-passe de Zona encontrada nas definições de Zona.