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.
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.
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
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
= webdriver.Firefox(service=FirefoxService(GeckoDriverManager().install()))
driver "http://www.python.org")
driver.get(= driver.find_element(By.NAME, "q")
elem
elem.clear()"pycon")
elem.send_keys(
elem.send_keys(Keys.RETURN)input("Aperte enter para encerrar o navegador")
driver.close()
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:
get(<url>)
: Acessa uma página da web.find_element(<como_procurar>, <valor>)
:
Devolve um elemento da página. É comum usar no primeiro
argumento By.ID
, By.CLASS_NAME
,
By.TAG_NAME
, By.XPATH
. Por exemplo:
driver.find_element(By.ID, "search")
procura um elemento
na página cujo atributo id
na página seja
search
.find_elements(<como_procurar>, <valor>)
: O
mesmo que find_element
, mas devolve uma
lista de elementos que satisfazem a busca. Para mais
informações sobre find_element
e
find_elements
, veja esse
recurso.send_keys(<keys>)
: Envia teclas para a página ou
para o elemento selecionado. Para enviar teclas que não são facilmente
representáveis com uma string (por exemplo, enter, ctrl, etc), use os
valores Keys.RETURN
, Keys.CTRL
, etc (veja uma
lista com esses valores aqui)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).
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:
= 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") busca
E assim por diante… algumas estratégias podem funcionar melhor que outras.
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:
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!
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
...
5) # dorme por 5 segundos
time.sleep( driver.close()
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 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