Como fazer webscraping em paginas dinâmicas e paginas estaticas
Published: 2023-04-13 16:09:21

### 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.
  &nbsp;
- 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>.
&nbsp;
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.
&nbsp;
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.
&nbsp;
Entre nesse [link](https://chromedriver.chromium.org/) para realizar o download do webdriver.
&nbsp;
Caso esteja utilizando WSL2 você pode seguir esse [tutorial](https://www.gregbrisebois.com/posts/chromedriver-in-wsl2/) para instalar o webdriver no WSL2

Agora precisamos instalar o `selenium` de preferencia em um ambiente virtual.
&nbsp;
Nesse link se encontra a [Documentação](https://selenium-python.readthedocs.io/installation.html) 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.