Cómo scrapear tablas de sitios web - un tutorial de Python

Cómo hacerlo, Python, Scraping, 13-dic-20245 minutos de lectura

El web scraping se ha convertido en una habilidad vital para los desarrolladores de Python, los analistas de datos y cualquiera que trabaje con conjuntos de datos. Cuando se trata de datos estructurados y ricos, las tablas que se encuentran en los sitios web son a menudo minas de oro de información. Tanto si buscas catálogos de productos, estadísticas deportivas o datos financieros, la capacidad de extraer y guardar datos de tablas con Python es una herramienta inestimable.

Esta guía práctica te lleva paso a paso a través del proceso de scraping de tablas de sitios web utilizando Python. Al final, sabrás cómo utilizar librerías populares como requests, Beautiful Soup e incluso pandas para acceder a los datos de las tablas y almacenarlos en formatos reutilizables como archivos CSV.

Requisitos previos

Antes de entrar en detalles técnicos, esto es lo que necesitarás para seguirnos:

  • Asegúrese de que Python está instalado en su sistema. Puede descargar la última versión aquí.
  • Bibliotecas necesarias:
    • requests-Paraobtener el contenido HTML de sitios web. Es un paquete popular para enviar peticiones HTTP en Python.
    • Beautiful Soup-Unapotente librería para analizar documentos HTML y XML. La utilizaremos para extraer elementos específicos de nuestra página web.
    • pandas-Lalibrería para manipulación y análisis de datos en Python. Este será nuestro destino final donde almacenaremos los datos extraídos de la tabla.

Utilizaremos el comando pip para instalar las librerías necesarias. Simplemente ejecute el siguiente comando en su terminal para completar la instalación:

pip install peticiones beautifulsoup4 pandas

Guía paso a paso para el scraping de tablas

Paso 1: Comprender la estructura del sitio web

El primer paso en cualquier proyecto de web scraping es analizar la estructura del sitio web de destino. En este ejemplo, extraeremos datos de un sitio web de ejemplo que contiene una tabla con la clasificación de los equipos de hockey. A continuación se muestra una vista previa de la tabla:

Así es como aparece esta tabla dentro de la estructura HTML.

Paso 2: Envío de una solicitud HTTP

El primer paso es obtener la página web que queremos raspar. Utilizaremos la librería requests para enviar una petición HTTP y recuperar el contenido HTML de la página web ficticia que estamos utilizando para obtener el contenido de la tabla.

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()

Paso 3: Extracción de datos de la tabla

En HTML, una tabla es una forma estructurada de presentar datos en filas y columnas, como en una hoja de cálculo. Las tablas se crean con la función <table> y su contenido se divide en filas (<tr>) y células (<td> para celdas de datos o <th> para las celdas de cabecera). Aquí tienes un rápido desglose de cómo funciona la estructura de una tabla:

  • Mesa: Encerrado en <table> actúa como contenedor de todas las filas y celdas.
  • Filas: Cada <tr> (fila de la tabla) representa un corte horizontal de la tabla.
  • Células: Dentro de cada fila, <td> contienen valores de datos individuales (o <th> para las cabeceras).
  • Atributos: Las tablas suelen tener clases, ID u otros atributos para darles estilo o identificarlas.

Por ejemplo, en esta secuencia de comandos, localizamos el archivo <table> con una clase específica (class="tabla") y extraer sus filas y celdas utilizando Sopa hermosa. Esto nos permite extraer los datos sistemáticamente y prepararlos para analizarlos o guardarlos.

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

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

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

Paso 4: Guardar los datos en un archivo CSV

En este paso, guardaremos los datos extraídos de la tabla en un archivo CSV para su uso futuro y también los mostraremos como un DataFrame de pandas para que pueda ver cómo están estructurados los datos. Guardar los datos como CSV permite analizarlos posteriormente en herramientas como Excel, Google Sheets o el propio 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}")

Cuando ejecute este código, pandas creará un archivo llamado scraped_table_data.csv en su directorio de trabajo, y los datos extraídos se imprimirán en la consola de la siguiente manera:

          Nombre del equipo Año Ganancias Pérdidas OT Pérdidas % de victorias Goles a favor (GF) Goles en 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: Extracción y almacenamiento de datos de tablas

A continuación se muestra el script completo en Python para extraer datos de tablas de un sitio web, guardarlos en un archivo CSV y mostrar los datos extraídos. Este script combina todos los pasos cubiertos en esta guía en un único flujo de trabajo cohesivo.

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}")

Conclusión

Esta guía le ha guiado paso a paso por el proceso: comprender la estructura del sitio web, extraer los datos y guardarlos para su análisis. Tanto si estás creando conjuntos de datos para investigación, automatizando la recopilación de datos o simplemente explorando las posibilidades del web scraping, dominar estas técnicas te abre un mundo de oportunidades.

Durante el scraping, es posible que te encuentres con problemas como prohibiciones de IP o límites de velocidad impuestos por los sitios web. Aquí es donde los proxies son cruciales. Los proxies te permiten:

  • Evite los límites de velocidad: Rote las direcciones IP para evitar que los sitios web le bloqueen por enviar demasiadas solicitudes.
  • Mantener el anonimato: Mantén tu identidad oculta enmascarando tu dirección IP real.
  • Acceda a datos con restricciones geográficas: Utilice proxies con ubicaciones específicas para raspar contenidos específicos de una región.

ProxyScrape ofrece una amplia gama de proxies, incluidos proxies residenciales, premium, dedicados y móviles, adaptados para el raspado web. Sus soluciones de proxy fiables y escalables pueden ayudarle a gestionar proyectos de scraping a gran escala sin interrupciones, garantizando una recopilación de datos fluida y eficiente.