Como extrair tabelas de sítios Web - um tutorial Python

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

O Web scraping tornou-se uma competência vital para os programadores 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 são muitas vezes minas de ouro de informações. Quer esteja a pesquisar na Web catálogos de produtos, estatísticas desportivas ou dados financeiros, a capacidade de extrair e guardar dados de tabelas utilizando Python é uma ferramenta inestimável.

Este guia prático leva-o passo a passo através do processo de recolha de dados de tabelas de sítios Web utilizando Python. No final, saberá como utilizar bibliotecas populares como requests, Beautiful Soup e até pandas para aceder a dados de tabelas e armazená-los em formatos reutilizáveis como ficheiros CSV.

Pré-requisitos

Antes de entrarmos nos pormenores técnicos, eis o que precisa para acompanhar o processo:

  • Certifique-se de que o Python está instalado no seu sistema. Pode descarregar a versão mais recente aqui.
  • Bibliotecas necessárias:
    • requests-Paraobter o conteúdo HTML de sítios Web. É um pacote popular para enviar pedidos HTTP em Python.
    • Beautiful Soup-Umabiblioteca poderosa para analisar documentos HTML e XML. Vamos utilizá-la para extrair elementos específicos da nossa página Web.
    • pandas-Abiblioteca de referência para manipulação e análise de dados em Python. Este será o nosso destino final, onde armazenaremos os dados extraídos da tabela.

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

pip install requests beautifulsoup4 pandas

Guia passo a passo para raspar tabelas

Passo 1: Compreender a estrutura do sítio Web

O primeiro passo em qualquer projeto de recolha de dados da Web é analisar a estrutura do sítio Web alvo. Neste exemplo, vamos extrair dados de um site de amostra que apresenta uma tabela com a classificação das equipas de hóquei. Abaixo está uma pré-visualização da tabela:

Eis como esta tabela aparece na estrutura HTML.

Passo 2: Enviar um pedido HTTP

O primeiro passo é obter a página Web que pretende extrair. Vamos utilizar a biblioteca requests para enviar um pedido HTTP e obter o conteúdo HTML do sítio Web fictício que estamos a utilizar 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()

Passo 3: Extração de dados da tabela

Em HTML, uma tabela é uma forma estruturada de apresentar dados em linhas e colunas, tal como numa folha de cálculo. As tabelas são criadas utilizando a função <table> e o seu conteúdo é dividido em linhas (<tr>) e células (<td> para células de dados ou <th> para células de cabeçalho). Eis uma breve descrição de como funciona a estrutura de uma tabela:

  • Tabela: Fechado no interior <table> funciona como um contentor para todas as linhas e células.
  • Filas: 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 os cabeçalhos).
  • Atributos: As tabelas têm frequentemente classes, IDs ou outros atributos para as estilizar ou identificar.

Por exemplo, neste script, localizamos o <table> com uma classe específica (class="tabela") e extrair as suas linhas e células utilizando Sopa bonita. Isto permite-nos extrair os dados de forma sistemática e prepará-los para serem analisados ou guardados.

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

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

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

Passo 4: Guardar dados num ficheiro CSV

Nesta etapa, salvaremos os dados da tabela extraída 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 analisá-los posteriormente em ferramentas como Excel, Planilhas Google 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 executar este código, o pandas criará um ficheiro com o nome dados_da_tabela_raspada.csv no seu diretório de trabalho, e os dados extraídos serão impressos na consola da seguinte forma:

          Nome da equipa Ano Vitórias Perdas OT Perdas Vitórias % Golos a favor (GF) Golos 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: Raspagem e gravação de dados de tabela

Abaixo está o script Python completo para extrair 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 acompanhou-o ao longo do processo, passo a passo: compreender a estrutura do sítio Web, extrair os dados e guardá-los para análise. Quer esteja a criar conjuntos de dados para investigação, a automatizar a recolha de dados ou simplesmente a explorar as possibilidades da recolha de dados da Web, o domínio destas técnicas abre um mundo de oportunidades.

Ao fazer scraping, pode deparar-se com desafios como proibições de IP ou limites de taxa impostos pelos sítios Web. É aqui que os proxies se tornam cruciais. Os proxies permitem-lhe:

  • Contornar os limites de taxa: Rodar endereços IP para evitar ser bloqueado por sítios Web por enviar demasiados pedidos.
  • Manter o anonimato: Mantenha a sua identidade oculta, mascarando o seu verdadeiro endereço IP.
  • Aceder a dados com restrições geográficas: Utilize proxies com localizações específicas para extrair conteúdo específico de uma região.

ProxyScrape oferece uma vasta gama de proxies, incluindo proxies residenciais, premium, dedicados e móveis, concebidos para a recolha de dados da Web. As suas soluções de proxy fiáveis e escaláveis podem ajudá-lo a lidar com projectos de raspagem em grande escala sem interrupções, assegurando uma recolha de dados suave e eficiente.