Explorando a biblioteca BeautifulSoup


Neste mês, dediquei meu tempo para estudar a fundo a biblioteca BeautifulSoup e suas capacidades para fazer web scraping. E antes que você pense que estou falando de scraping em sites de apostas, relaxe!

Aqui está um pequeno tutorial de como extrair dados do Instituto Brasileiro de Geografia e Estatística (IBGE).

Presumo que você já tenha algum conhecimento de Python, mais qualquer coisa segue o link.

Vamos lá!

Abra um terminal ou prompt de comando e execute o seguinte comando para instalar a biblioteca BeautifulSoup:

pip install beautifulsoup4

Após a instalação, importe a biblioteca BeautifulSoup no seu código Python:

from bs4 import BeautifulSoup

Para extrair os dados do IBGE, também utilizaremos as bibliotecas pandas e requests.

Para extrair os dados do IBGE, também utilizaremos as bibliotecas pandas e requests. Importe-as da seguinte forma:

import requests
from bs4 import BeautifulSoup
import pandas as pd

Agora, podemos começar a explorar a biblioteca BeautifulSoup para extrair dados do IBGE.


def scraping_uf(uf: str):
    # Construir a URL para a UF específica
    uf_url = f'https://www.ibge.gov.br/cidades-e-estados/{uf}.html'

    # Definir os cabeçalhos para a requisição
    headers = {
        'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"
    }

    # Enviar uma requisição GET para a URL com os cabeçalhos
    page = requests.get(uf_url, headers=headers)

    # Criar um objeto BeautifulSoup para analisar o conteúdo HTML
    soup = BeautifulSoup(page.content, 'html.parser')

    # Selecionar todos os elementos com a classe 'indicador'
    indicadores = soup.select('.indicador')

    # Criar um dicionário para armazenar os dados da UF
    uf_dict = {
        dado.select('.ind-label')[0].text: dado.select('.ind-value')[0].text
        for dado in indicadores
    }

    # Retornar o dicionário contendo os detalhes da UF
    return uf_dict

Essa função é usada para obter dados específicos de uma Unidade Federativa (UF) do Brasil através do código da UF fornecido como entrada. Em seguida, ela constrói a URL correspondente à UF desejada. A função realiza uma requisição HTTP GET para a URL utilizando um cabeçalho específico. O conteúdo da página é analisado usando a biblioteca BeautifulSoup para encontrar elementos com a classe ‘indicador'.

Para cada elemento encontrado, o código extrai o rótulo (classe ‘ind-label') e o valor (classe ‘ind-value') correspondentes, e os armazena em um dicionário. Por fim, a função retorna o dicionário com os detalhes da UF, tais como indicadores demográficos, econômicos ou sociais.

estado = scraping_uf('sp')
print(estado)

{'Governador': 'TARCISIO GOMES DE FREITASxa0xa0xa0[2023]',
 'Capital': 'São Pauloxa0xa0xa0[2010]',
 'Gentílico': 'paulista',
 'Área Territorial': '248.219,485 km²xa0xa0xa0[2022]',
 'População estimada': '46.649.132 pessoasxa0xa0xa0[2021]',
 'Densidade demográfica': '166,25 hab/km²xa0xa0xa0[2010]',
 'Matrículas no ensino fundamental': '5.396.803 matrículasxa0xa0xa0[2021]',
 'IDH Índice de desenvolvimento humano': '0,783xa0xa0xa0[2010]',
 'Receitas realizadas': '232.822.496,57 R$ (×1000)xa0xa0xa0[2017]',
 'Despesas empenhadas': '231.982.243,69 R$ (×1000)xa0xa0xa0[2017]',
 'Rendimento mensal domiciliar per capita': '2.148 R$xa0xa0xa0[2022]',
 'Total de veículos': '32.293.191 veículosxa0xa0xa0[2022]'}

O exemplo acima apresenta dados de São Paulo, porém os dados não estão bem limpos.

#Função para limpar alguns dados
for indicador in estado:
    if ']' in estado[indicador]:
        estado[indicador] = estado[indicador].split(']')[0][:-8]
    else:
        estado[indicador] = estado[indicador]
estado

{'Governador': 'TARCISIO GOMES DE FREITAS',
 'Capital': 'São Paulo',
 'Gentílico': 'paulista',
 'Área Territorial': '248.219,485 km²',
 'População estimada': '46.649.132 pessoas',
 'Densidade demográfica': '166,25 hab/km²',
 'Matrículas no ensino fundamental': '5.396.803 matrículas',
 'IDH Índice de desenvolvimento humano': '0,783',
 'Receitas realizadas': '232.822.496,57 R$ (×1000)',
 'Despesas empenhadas': '231.982.243,69 R$ (×1000)',
 'Rendimento mensal domiciliar per capita': '2.148 R$',
 'Total de veículos': '32.293.191 veículos'}

Colocando em um Data Frame:

df = pd.DataFrame(estado.values(), index=estado.keys())
df

Governador TARCISIO GOMES DE FREITAS
Capital São Paulo
Gentílico paulista
Área Territorial 248.219,485 km²
População estimada 46.649.132 pessoas
Densidade demográfica 166,25 hab/km²
Matrículas no ensino fundamental 5.396.803 matrículas
IDH Índice de desenvolvimento humano 0,783
Receitas realizadas 232.822.496,57 R$ (×1000)
Despesas empenhadas 231.982.243,69 R$ (×1000)
Rendimento mensal domiciliar per capita 2.148 R$
Total de veículos 32.293.191 veículos

É só uma pequena amostra do quão poderosa é a biblioteca BeautifulSoup. Com ela, é possível extrair informações valiosas de páginas da web de forma eficiente e precisa.

19/07/2023