DEV Community

Cover image for Como fazer webscraping em paginas dinâmicas e paginas estaticas
Guilherme Freitas
Guilherme Freitas

Posted on • Updated on

Como fazer webscraping em paginas dinâmicas e paginas estaticas

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
Enter fullscreen mode Exit fullscreen mode

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')
Enter fullscreen mode Exit fullscreen mode

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 = []
Enter fullscreen mode Exit fullscreen mode

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)
Enter fullscreen mode Exit fullscreen mode

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')
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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)
Enter fullscreen mode Exit fullscreen mode

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)

Enter fullscreen mode Exit fullscreen mode

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)
Enter fullscreen mode Exit fullscreen mode

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)")
Enter fullscreen mode Exit fullscreen mode

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')
Enter fullscreen mode Exit fullscreen mode

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')
Enter fullscreen mode Exit fullscreen mode

Conclusão

Nesse post vemos como realizar um scraping em dois modelos de páginas, as estáticas e as dinâmicas.

Top comments (0)