Como fazer scrape tabelas de sites - um tutorial em Python

Como fazer, Pitão, Scraping, 13 de dezembro de 20245 minutos de leitura

A Web scraping tornou-se uma habilidade vital para desenvolvedores Python, analistas de dados e qualquer pessoa que trabalhe com conjuntos de dados. Quando se trata de dados estruturados e ricos, as tabelas encontradas em sites geralmente são minas de ouro de informações. Se estiver vasculhando a Web em busca de catálogos de produtos, estatísticas esportivas ou dados financeiros, a capacidade de extrair e salvar dados de tabelas usando Python é uma ferramenta inestimável.

Este guia prático leva você passo a passo pelo processo de scraping tabelas de sites usando Python. Ao final, você saberá como usar bibliotecas populares, como requests, Beautiful Soup e até mesmo pandas, para acessar dados de tabelas e armazená-los em formatos reutilizáveis, como arquivos CSV.

Pré-requisitos

Antes de entrarmos nos detalhes técnicos, veja o que você precisará para acompanhar o processo:

  • Verifique se o Python está instalado em seu sistema. Você pode fazer o download da versão mais recente aqui.
  • Bibliotecas necessárias:
    • requests - Paraobter o conteúdo HTML de sites. É um pacote popular para enviar solicitações HTTP em Python.
    • Beautiful Soup: umabiblioteca avançada para análise de documentos HTML e XML. Nós a usaremos para extrair elementos específicos de nossa página da Web.
    • pandas - Abiblioteca ideal para manipulação e análise de dados em Python. Esse será o nosso destino final, onde armazenaremos os dados extraídos da tabela.

Usaremos o comando pip para instalar as bibliotecas necessárias. Basta executar o seguinte comando em seu terminal para concluir a instalação:

pip install requests beautifulsoup4 pandas

Guia passo a passo para Scraping Tables

Etapa 1: Entendendo a estrutura do site

A primeira etapa de qualquer projeto scraping da Web é analisar a estrutura do site de destino. Neste exemplo, vamos acessar scraping dados de um site de amostra que apresenta uma tabela com a classificação dos times de hóquei. Abaixo está uma prévia da tabela:

Veja como essa tabela aparece na estrutura HTML.

Etapa 2: envio de uma solicitação HTTP

A primeira etapa é buscar a página da Web que você deseja acessar scrape. Usaremos a biblioteca requests para enviar uma solicitação HTTP e recuperar o conteúdo HTML do site fictício que estamos usando para obter o conteúdo da tabela

url = "https://www.scrapethissite.com/pages/forms/"

response = requests.get(url)

if response.status_code == 200:
   print("Page fetched successfully!")
   html_content = response.text
else:
   print(f"Failed to fetch the page. Status code: {response.status_code}")
   exit()

Etapa 3: Extração de dados da tabela

Em HTML, uma tabela é uma forma estruturada de apresentar dados em linhas e colunas, como em uma planilha eletrônica. As tabelas são criadas usando a tag <table> e seu conteúdo é dividido em linhas (<tr>) e células (<td> para células de dados ou <th> para células de cabeçalho). Aqui está um resumo rápido de como funciona a estrutura de uma tabela:

  • Tabela: Fechado dentro de <table> ela atua como o contêiner de todas as linhas e células.
  • Fileiras: Cada <tr> (linha da tabela) representa uma fatia horizontal da tabela.
  • Células: Dentro de cada linha, <td> contêm valores de dados individuais (ou <th> para cabeçalhos).
  • Atributos: As tabelas geralmente têm classes, IDs ou outros atributos para estilizá-las ou identificá-las.

Por exemplo, neste script, localizamos o <table> com uma classe específica (class="table") e extrair suas linhas e células usando Bela sopa. Isso nos permite extrair os dados sistematicamente e prepará-los para análise ou salvamento.

soup = BeautifulSoup(html_content, "html.parser")

table = soup.find("table", {"class": "table"})

if not table:
   print("No table found on the page!")
   exit()

Etapa 4: Salvando dados em um arquivo CSV

Nesta etapa, salvaremos os dados extraídos da tabela em um arquivo CSV para uso futuro e também os exibiremos como um DataFrame do pandas para que você possa ver como os dados estão estruturados. Salvar os dados como um CSV permite que você os analise posteriormente em ferramentas como Excel, Google Sheets ou o próprio Python.

headers = [header.text.strip() for header in table.find_all("th")]

rows = []
for row in table.find_all("tr", class_="team"):
   cells = [cell.text.strip() for cell in row.find_all("td")]
   rows.append(cells)

df = pd.DataFrame(rows, columns=headers)

csv_filename = "scraped_table_data_pandas.csv"
df.to_csv(csv_filename, index=False, encoding="utf-8")

print(f"Data saved to {csv_filename}")

Quando você executar esse código, o pandas criará um arquivo chamado dados_da_tabela_raspada.csv no seu diretório de trabalho, e os dados extraídos serão impressos no console da seguinte forma:

          Nome da equipe Ano Vitórias Perdas Derrotas OT Vitórias % Gols a favor (GF) Gols contra (GA) + / -
0 Boston Bruins 1990 44 24 0,55 299 264 35
1 Buffalo Sabres 1990 31 30 0,388 292 278 14
2 Calgary Flames 1990 46 26 0,575 344 263 81
3 Chicago Blackhawks 1990 49 23 0,613 284 211 73
4 Detroit Red Wings 1990 34 38 0,425 273 298 -25

Código completo: Scraping e salvando dados da tabela

Abaixo está o script Python completo para scraping dados de tabela de um site, salvando-os em um arquivo CSV e exibindo os dados extraídos. Esse script combina todas as etapas abordadas neste guia em um único fluxo de trabalho coeso.

import requests
from bs4 import BeautifulSoup
import pandas as pd

url = "https://www.scrapethissite.com/pages/forms/"

response = requests.get(url)

if response.status_code == 200:
    print("Page fetched successfully!")
    html_content = response.text
else:
    print(f"Failed to fetch the page. Status code: {response.status_code}")
    exit()

soup = BeautifulSoup(html_content, "html.parser")

table = soup.find("table", {"class": "table"})

if not table:
    print("No table found on the page!")
    exit()

headers = [header.text.strip() for header in table.find_all("th")]

rows = []
for row in table.find_all("tr", class_="team"):
    cells = [cell.text.strip() for cell in row.find_all("td")]
    rows.append(cells)

df = pd.DataFrame(rows, columns=headers)

csv_filename = "scraped_table_data_pandas.csv"
df.to_csv(csv_filename, index=False, encoding="utf-8")

print(df.head())
print(f"Data saved to {csv_filename}")

Conclusão

Este guia o guiou pelo processo passo a passo: compreender a estrutura do site, extrair os dados e salvá-los para análise. Se você estiver criando conjuntos de dados para pesquisa, automatizando a coleta de dados ou simplesmente explorando as possibilidades da Web scraping, o domínio dessas técnicas abre um mundo de oportunidades.

Ao acessar scraping, você pode encontrar desafios como proibições de IP ou limites de taxa impostos pelos sites. É nesse ponto que o proxies se torna crucial. O Proxies permite que você:

  • Contornar limites de taxa: Gire os endereços IP para evitar ser bloqueado pelos sites por enviar muitas solicitações.
  • Mantenha o anonimato: Mantenha sua identidade oculta, mascarando seu endereço IP real.
  • Acesse dados com restrição geográfica: Use proxies com locais específicos para scrape conteúdo específico da região.

ProxyScrape oferece uma ampla gama de proxies, incluindo proxies residencial, premium, dedicada e móvel, adaptada para a Web scraping. Suas soluções proxy confiáveis e dimensionáveis podem ajudá-lo a lidar com projetos scraping de grande escala sem interrupções, garantindo uma coleta de dados tranquila e eficiente.