Como fazer webscraping em paginas dinâmicas e paginas estaticas
Guilherme Freitas
Posted on April 13, 2023
Oque é web scraping
É uma forma de mineração que permite a extração de dados de sites da web convertendo-os em informação estruturada para posterior análise. O tipo mais básico de coleta é o download manual das páginas, copiando e colando o conteúdo, e isso pode ser feito por
Diferença entre páginas estáticas e dinâmicas
Primeiro vamos temos que saber diferenciar a pagina que queremos realizar o scraping.
- Um site estático é aquele com conteúdo estável, onde cada usuário vê exatamente a mesma coisa em cada página individual.
- Um site dinâmico é aquele em que o conteúdo é carregado de forma dinâmica, permitindo que ele mude de acordo com o usuário.
Web scraping em páginas Estáticas
Para realizar um scraping de uma página estática vamos usar uma lib do python muito famosa para esta função que é a beautifulsoup4
Vamos rodar o comando abaixo para instalar a lib, de preferencia em um ambiente virtual.
$ pip install beautifulsoup4
Após realizar a instalação da lib podemos começar a usala, primeiro precisamos do nosso html, para isso usaremos o site do imdb com os melhores 250 filmes https://www.imdb.com/chart/top/?ref_=nv_mv_250.
Usaremos a lib urllib.request
nativa do python para abrir um arquivo html.
from bs4 import BeautifulSoup
from urllib.request import urlopen
html = urlopen("https://www.imdb.com/chart/top/?ref_=nv_mv_250")
bs = BeautifulSoup(html, 'html.parser')
Temos que ve na nossa pagina html qual o valor da tag e da classe css que estão localizado os dados que queremos extrair, no caso dos nossos filmes, estão na tag td
com classe titleColumn
. Passamos esses valores para nos bs.find_all()
e criamos uma lista para armazenar o resultado.
filmes = bs.find_all('td', {'class': 'titleColumn'})
lista_filmes = []
Agora é só iterar sobre nossa variavel filmes
, informar para o elemento qual tag desejamos que ele pegue os dados a
e passar o resultado em formato de string para nossa lista.
for filme in filmes:
item = filme.findChildren("a")
lista_filmes.append(item[0].text)
Podemos criar um arquivo txt e salvar os nomes dos filmes no mesmo arquivo.
arquivo_txt = open("nomes_filmes.txt", "w")
for filme in lista_filmes:
arquivo_txt.write(f'{filme}\n')
E assim finalizamos o scraping de uma página html estática.
Web scraping em paginas Dinâmicas
Scraping em páginas dinâmicas exigem um pouco mais de complexidade, porém são os meus favoritos.
As paginas dinamicas possuem a presença do JavaScript, onde fazem requisições para o backend baseadas nos usuarios.
Sabendo disso, o que podemos fazer para realizar o scraping é simular a inteção humana.
Introdução as tecnologias utilizadas
Vamos a uma rápida introdução as tecnologias que usaremos.
O Selenium
O selenium tem o objetivo de automazinar a navegação no browser.
É conjunto de ferramentas de código aberto multiplataforma, usado para testar aplicações web pelo browser de forma automatizada.
O webdriver
WebDriver é uma API e protocolo que define uma interface de linguagem neutra para controlar o comportamento dos navegadores da web. Cada navegador é apoiado por uma implementação WebDriver específica, chamada de driver.
Começando
Nesse tutorial usaremos o Google Chrome.
Primeiro precisamos instalar o webdriver, para isso é necessario que você saiba a versão do seu navegador.
Entre nesse link para realizar o download do webdriver.
Caso esteja utilizando WSL2 você pode seguir esse tutorial para instalar o webdriver no WSL2
Agora precisamos instalar o selenium
de preferencia em um ambiente virtual.
Nesse link se encontra a Documentação do seleminum para python.
Vamos instalar as libs do nosso projeto.
$ pip install selenium
$ pip install webdriver-manager
$ pip install beautifulsoup4
Vamos importar os modulos do nosso projeto.
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from bs4 import BeautifulSoup
import time
O site que usaremos como exemplo sera uma tabela com resultados do NBA https://stats.nba.com/players/traditional/?PerMode=Totals&Season=2019-20&SeasonType=Regular%20Season&sort=PLAYER_NAME&dir=-1
Primeiro vamos configurar nosso webdriver.
install_chrome = ChromeDriverManager().install()
config = Service(install_chrome)
browser = webdriver.Chrome(service=config)
Caso você não queria que a janela do navegador abra, você pode usar colocar na configuração a opção --headless
conforme está o código abaixo, porem nesse tutorial para fins didaticos usaremos sem essa opção.
install_chrome = ChromeDriverManager().install()
config = Service(install_chrome)
options = webdriver.ChromeOptions()
options.add_argument("--headless")
browser = webdriver.Chrome(service=config, options=options)
Agora iremos abrir nosso link do NBA e para um comportamente mais próximo do comportamento humano usaremos o time.sleep(2)
para nosso script esperar 2 segundos antes de ir para o próximo passo
browser.get("https://stats.nba.com/players/traditional/?PerMode=Totals&Season=2019-20&SeasonType=Regular%20Season&sort=PLAYER_NAME&dir=-1")
time.sleep(2)
Podemos executar código javascript no nosso navegador, então vamos realizar uma rolangem de scroll na página.
browser.execute_script("window.scroll(0, 300)")
Para esse tutorial iremos extrair o nome dos jogadores. Para isso iremos pegar o valor xpath da nossa tag tbody
, pois é nela que contem o valor dos resultados.
element = browser.find_element('xpath', '//*[@id="__next"]/div[2]/div[2]/div[3]/section[2]/div/div[2]/div[3]/table/tbody')
html = element.get_attribute('outerHTML')
Agora é só passar nossa variavel html
para nossa bs
e gerar nossos dados em um arquivo txt
bs = BeautifulSoup(html, 'html.parser')
nomes = bs.find_all("td", {'class' : 'Crom_text__NpR1_ Crom_primary__EajZu Crom_stickySecondColumn__29Dwf'})
lista_nomes = []
for nome in nomes:
item = nome.findChildren('a')
lista_nomes.append(item[0].text)
arquivo_txt = open('nomes_jogadores.txt', "w")
for nome in lista_nomes:
arquivo_txt.write(f'{nome}\n')
Conclusão
Nesse post vemos como realizar um scraping em dois modelos de páginas, as estáticas e as dinâmicas.
Posted on April 13, 2023
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.