Como fazer uma raspagem de dados (Web Scraping) que faça sentido para mim?!

Passo a passo de WebScraping para o seu portifólio usando Python

Nayane Maia
Data Girls
7 min readApr 5, 2021

--

woman sitting programming on Unsplash

O que é Web Scraping?

Web Scraping é uma técnica de programação que permite extrair informações de páginas da web (websites).

Você provavelmente já deve ter ouvido sobre raspagem de dados ou já pensou em fazer um. Quando se está iniciando nesse mundo “Data Science” sempre estamos a procura de banco de dados novo para mostrar nossas habilidades, e esses dados precisam representar quem somos, fazer sentido com os nossos gostos e a nossa especialidade quando estamos construindo nosso portifólio.

Um bom exemplo sobre isso sou eu, sou Engenheira Agrônoma e trabalho com mudanças climáticas, qualidade de solos e produtividade de grandes culturas agrícolas como o Milho, Algodão e Soja. Existe um banco de dados gigantesco sobre essa temática no mundo inteiro, como o título diz, preciso procurar um banco de dados que faça sentindo com o que eu trabalho, por isso vou mostar duas formas de raspagem de dados nessa área. Mas ao final da leitura você será capaz de fazer a raspagem de dados que mais faça sentindo com o seu gosto pessoal, que pode ser sobre esportes, jornalismo, preço de produtos, saúde, finanças, dados climáticos, entre outros.

Existem duas formas de se fazer a raspagem de dados:

  1. Fácil: Você abre o banco de dados diretamente na sua máquina em forma de data frame.
  2. Que vai te gerar um pouco mais de esforço: Aqui você vai precisar de um conhecimento básico de HTML para buscar informações de websites (Calmaa que vamos conseguir juntes okk?!?! Ninguém larga a mão de ninguém aqui hahaha).
woman walking and smiling

Então vamos comigo e começar pelo jeito fácil né, que eu gosto é da facilididade….

Alguns data scientists não consideram essa técnica como raspagem de dados por causa da sua facilidade. Mas se o dado que você queria se encontra na internet e hospedado em algum website, na sua essência mais pura, você está sim realizando uma raspagem de dados!

Usando a biblioteca Pandas

Com o Pandas você consegue baixar arquivos em formatos .txt, .csv e .xlsx a partir de links de websites. Aqui vou usar um exemplo de um banco de dados de soja que está hospedado no meu GitHub, como:

import pandas as pdsoybean = pd.read_csv(‘https://raw.githubusercontent.com/nayanemaia/Dataset_Soja/main/soja%20sidra.csv')soybean.head()

Vamos visualizar esses dados:

import seaborn as sns
sns.set_theme(style=”whitegrid”)
g = sns.catplot(
data=soybean, kind=”bar”,
x=”ano”, y=”Produção”,
palette=”dark”, alpha=.6, height=6
)
g.despine(left=True)
g.set_axis_labels(“Production (kg/ha)”)
Produção de soja (kg/ha) no Brasil
woman opens laptop

Agora mãos à massa (no caso, na máquina haha) porque agora vamos ter um pouco mais de trabalhinho!!

Primeiramente vamos lembrar alguns conceitos básicos de HTML, caso você nunca tenha visto nada sobre, esse é o momento de começar! Vou tentar ser bem breve nessa parte, mas você pode estudar mais sobre HTML aqui.

O que são Tags do HTML???

As tags são representadas por </>, e o HTML é dividido em cabeça (head) e corpo (body). Dentro do corpo vamos encontrar várias divisões <div> contendo as classes, parágrafos, imagens, links, listas e tabelas.

Exemplo de código HTML

Agora já sabemos onde achar o nosso banco de dados! Sabemos que ele fica escondido dentro da Tag <body> do HTML. Agora vamos começar a dar uma olhadinha no banco de dados que vamos baixar. O banco de dados que eu escolhi foi sobre a produção mundial de Cebolas, que ta hospedado nesse site. O script completo você encontra no meu GitHub. Essa é a página que vamos baixar os dados:

página da web que vamos fazer a raspagem

Fazendo a raspagem de dados

Ao encontrar a página da onde você vai realizar a raspagem de dados, clique com o lado direito do mouse sobre qualquer lugar da página, depois clique em INSPECIONAR ou F12. Ao fazer isso, vamos inspencionar a página do navegador e abrir as configurações de HTML e CSS da página no item “Elements”, e comece a procurar pelo Body e Table. Uma forma mais rápida de você achar é passar o mouse por cima da tag Table onde você está querendo realizar o webscraping, pois a tabela vai ser destacada na web, como na imagem a seguir. Cuidado para não pegar o elemento errado, precisa ser apenas a tabela!

página html

Após encontrarmos a tag table, já temos a identificação (‘id=’) do elemento que vamos usar, e vamos para o Python!!

Resumidamente, vamos precisar instalar duas bibliotecas:

  • Requests: A biblioteca requests fará uma solicitação GET ao servidor, que fará o download dos conteúdos HTML da página solicitada para nós. Existem vários tipos de solicitação diferentes que podemos realizar utilizando essa biblioteca. Se você quer aprender mais sobre isso, acesse este link.
  • BeautifulSoup: É uma ferramenta incrível para extrair informações de uma página da web. A biblioteca Requests lhe permite fazer uso do HTTP dentro dos seus programas Python em um formato legível, e o módulo Beautiful Soup é projetado para fazer web scraping rapidamente.
import pandas as pd
import requests
from bs4 import BeautifulSoup

Agora vamos fazer uma requisição da página usando o GET, vamos verificar se a requisição foi bem sucedida, e usar o content para acessar a página.

req = requests.get('https://www.atlasbig.com/en-us/countries-onion-production')
if req.status_code == 200:
print('Requisição bem sucedida!')
content = req.content

Agora que temos acesso a página, vamos usar a biblioteca BeautifulSoup para ter acesso as tabelas. Nessa etapa vamos baixar a tabela em forma de objeto de acordo com as Tags da página, lembram que falamos das tags logo acima?! Agora vamos pedir a permissão da Tag Table.

soup = BeautifulSoup(content, 'html.parser')
table = soup.find(name='table')

Agora que já temos o acesso a nossa tabela, vamos usar a biblioteca pandas para usar esse objeto. Antes vamos transforma-la em sting, para depois usar ela como lista no DataFrame, começando pela posição 0 para ter acesso a todos os dados da tabela.

table_str = str(table)
df = pd.read_html(table_str))[0]

Se a página tiver mais de uma tabela, vamos usar a identificação da Tag, como falamos anteriormente. Assim, as chances de pegar só o dado que você quer é mais certeiro! Nesse passo vamos ussar a função attrs do find, usando o inspetor do navegador para achar essa “id=”, como monstrato na figura anterior. Após achar o id, o código da nossa tabela é esse:

table = soup.find(name=’table’, attrs={‘id’:’data-table-2–0–1'})

Agora já temos acesso a nossa tabela, a próxima etapa é a limpeza dos nossos dados. Nessa etapa vamos limpar os dados que se repetem, no caso da minha tabela, vamos apagar os dados dos países que se repetem, como:

drop_indexes = df[df[‘Country’] == ‘Country’].index # Pega indexes onde a coluna ‘Country’ possui valor ‘Country’
df.drop(drop_indexes, inplace=True) # elimina os valores dos index passados da tabela
df.head()
Tabela com os dados de produção mundial de cebola

Prontinhoo!!

Agora já temos a nossa tabela, mas vamos prestar atenção em um detalhe importante: quando baixamos nossa tabela da web usando essas bibliotecas, os nossos dados sempre vem em formato de objetos, e com esse formato não podemos fazer nem uma análise com esses dados!!! Uma forma de verificar qual o tipo dos nossos dados é usando o Type, como no código abaixo:

df.dtypes
usando o type

Ao analisar o resultado do nosso type, percebemos que eu tive um pouco de sorte quando baixei esses dados, todos os meus dados vieram corretamente em forma numérica através de int64 e float64. Mas os países (country) ainda estão como objetos, precisamos transformar para dados categóricos para a gente conseguir usar esses dados (se quer saber mais sobre a diferença entre dados categóricos e numéricos veja aqui), usando o astype, como no código abaixo:

df = df.astype({“Country”:’category’})
df.dtypes
usando o type, mudança para category

Se todos os nossos dados fossem baixados como objetos, também seria necessário transformar as nossas variavéis em numéricas, como no código abaixo:

df[‘Production (Tons)’] = pd.to_numeric(df[‘Production (Tons)’], errors=’coerce’)
df[‘Production per Person (Kg)’] = pd.to_numeric(df[‘Production per Person (Kg)’], errors=’coerce’)
df[‘Acreage (Hectare)’] = pd.to_numeric(df[‘Acreage (Hectare)’], errors=’coerce’)
df[‘Yield (Kg / Hectare)’] = pd.to_numeric(df[‘Yield (Kg / Hectare)’], errors=’coerce’)

Agora que todos os nossos dados são númericos e categóricos, vamos visualizar esses dados:

import matplotlib as plt
import seaborn as sns
df.pairplot(data)
distribuição dos dados de produção mundial de Cebola

Conclusão

Agora já temos o nosso passo a passo de raspagem de dados da web, agora é só achar um material legal que faça sentido para você e embarcar no mundo da ciência de dados na sua área!!! Lembrando que esse exemplo é só um entre vários outros métodos que existem de raspagem de dados, eu mostrei um exemplo utilizando banco de dados de tabelas em formato público, mas você também pode testar a raspagem de dados usando:

  • Banco de textos de uma página web.
  • Preços de produtos de páginas de lojas comerciais.
  • Nomes e avaliações de filmes.
  • Baixar vários arquivos de uma única vez, exemplo de arquivos .txt de um site.

A possibilidade de bancos de dados que faça sentindo para você é infinita, esse artigo é só o começo das possibilidades que você pode testar! Em caso de dúvidas ou sugestão, estou aberta para conexões no LinkedIn!

--

--

Nayane Maia
Data Girls

Agronomist and Data Scientist, with the application of advanced statistical modeling techniques in agriculture