Raspagem de dados

Raspagem de dados é uma técnica de extrair informações atráves da navegação automatizada na internet. Nesse exercício, vamos usar a biblioteca selenium para criar um navegador da internet que podemos “controlar” usando python.

Aviso

Resolver esse exercício envolve manipulação das linguagens HTML e CSS, utilizadas pelos navegadores para exibir websites. É possível aprender o que é necessário sobre elas durante o trabalho, mas um pouco de familiaridade com elas deve ajudar.

Selenium

Instalando o Selenium

Para instalar o selenium, vamos precisar usar alguns comandos no terminal. Primeiro, vamos criar um ambiente virtual na pasta venv:

$ python -m venv venv

Depois vamos ativar esse ambiente virtual. No linux:

$ . venv/bin/activate

e no windows:

$ . venv/Scripts/activate

Por fim, instalamos dois pacotes via pip. Um deles é o próprio selenium e o outro vai nos ajudar a instalar uma versão “robotizável” do firefox.

$ pip install selenium webdriver-manager

Um exemplo simples

Reproduza o exemplo a seguir, verificando que tudo está funcionando como deveria. Esse programa acessa o site python.org, pesquisa a palavra “pycon” (que não deve dar nenhum resultado) e aguarda uma interação do usuário para encerrar o navegador (exemplo adaptado daqui).

from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium import webdriver
from selenium.webdriver.firefox.service import Service as FirefoxService

from webdriver_manager.firefox import GeckoDriverManager

driver = webdriver.Firefox(service=FirefoxService(GeckoDriverManager().install()))
driver.get("http://www.python.org")
elem = driver.find_element(By.NAME, "q")
elem.clear()
elem.send_keys("pycon")
elem.send_keys(Keys.RETURN)
input("Aperte enter para encerrar o navegador")
driver.close()

As ferramentas mais importantes

O exemplo acima nos dá ideia de quais são as ferramentas mais importantes para realizarmos a navegação. O objeto driver representa o próprio navegador, e usamos funções “dentro dele” (elas chamam-se métodos) para navegar pela internet. Os principais métodos são:

Repare que a maioria dessas funções pode ser chamada tanto através do driver quanto através de qualquer elemento da página (veja no exemplo acima).

Como eu acho um elemento na página?

Suponha que eu estou raspando um determinado site e quero que meu programa clique no botão de “busca”. Eu estou vendo o botão, mas como fazer o meu programa reconhecê-lo? Nosso amigo aí é o inspetor das “ferramentas do desenvolvedor”: uma opção nos navegadores que nos permitem ver o código que gera a página que estamos vendo. Num navegador, basta apertar “Ctrl-Shift-C” e passar o mouse em cima do elemento que desejamos.

Suponha que estamos no site do mercado livre e queremos selecionar o botão de busca. Usando o inspetor do Firefox, descubro que o código desse botão é o seguinte:

<input type="text" class="nav-search-input" id="cb1-edit"
aria-label="Digite o que você quer encontrar" name="as_word"
placeholder="Buscar produtos, marcas e muito mais…" maxlength="120"
autocapitalize="none" autocorrect="off" spellcheck="false"
autocomplete="off" value="" aria-activedescendant=""
aria-controls="cb1-list" aria-autocomplete="list" aria-expanded="false"
role="combobox" style="padding-right: 257px;">

Tem um monte de coisa que eu não entendo aí no meio! Mas ao mesmo tempo tem muita informação que eu posso usar para identificar esse botão. Veja alguns exemplos:

busca = driver.find_element(By.ID, "cb1-edit")
busca = driver.find_element(By.CSS_CLASS, "nav-search-input")
busca = driver.find_element(By.NAME, "as_word")

E assim por diante… algumas estratégias podem funcionar melhor que outras.

Esperando os sites carregarem

Alguns sites demoram para carregar. Se não tomarmos cuidado, nosso programa vai tentar acessar links ou clicar em botões que ainda não foram carregados! Você pode usar três estratégias para evitar que isso aconteça:

  1. Faça como no exemplo: espere por uma entrada do usuário com input(). Isso é bom para testar o programa nas suas fases iniciais, mas não serve para um programa pronto: se a ideia é automatizar um processo manual, não tem sentido fazer o usuário ficar apertando esperando a página carregar para apertar Enter!

  2. Usar a função time.sleep(). Essa função faz o programa “dormir”, isto é, interromper sua execução, por um número especificado de segundos. Veja como poderíamos ter adaptado o nosso exemplo para usá-la.

    ...
    
    from webdriver_manager.firefox import GeckoDriverManager
    import time
    
    ...
    
    time.sleep(5) # dorme por 5 segundos
    driver.close()
  3. Usar métodos de espera do próprio selenium. Esses métodos estão descritos aqui. É um uso um pouco mais avançado do selenium e do python, então pode ser uma boa ideia deixar para um momento posterior da implementação!

O exercício: procurando casa para alugar

O objetivo desse exercício é implementar um programa que ajude o usuário a buscar um imóvel para comprar ou alugar. Seu programa deve:

Recomenda-se começar pela parte do scraping, e implementar a interação com o usuário por último.

Bom trabalho!



π


Última modificação: 29-05-2023