Web scraping con BeautifulSoup

Guía práctica para extraer datos de sitios web

Aprende a extraer datos de sitios web con BeautifulSoup en Python. Este tutorial cubre técnicas prácticas para el scraping web, incluyendo el análisis de HTML, la extracción de datos, el manejo de tablas, la paginación y el uso de sesiones, para una recopilación de datos robusta.

Programación
Autor/a
Afiliación
Fecha de publicación

8 de febrero de 2024

Fecha de modificación

9 de mayo de 2025

Palabras clave

Tutorial de BeautifulSoup, Web scraping en Python, Web scraping en Python, Extracción de datos con BeautifulSoup

Introducción

El scraping web es una técnica potente para extraer datos de sitios web con fines de análisis, investigación u otros proyectos basados en datos. En este tutorial, aprenderás a utilizar BeautifulSoup, una popular biblioteca de Python, para analizar HTML y extraer información significativa de páginas web. No solo cubriremos ejemplos básicos como la extracción de títulos y enlaces de páginas, sino también técnicas avanzadas como la extracción de tablas, el manejo de la paginación y el uso de sesiones para mantener el estado en múltiples solicitudes.



Importación de paquetes necesarios

Para mantener nuestro código organizado y evitar repeticiones, comenzamos importando los paquetes necesarios. Esto garantiza que todos los fragmentos de código posteriores tengan acceso a las bibliotecas necesarias.

#| label: import-packages
# Este código importa los paquetes esenciales para el scraping web.
import requests
from bs4 import BeautifulSoup

Ejemplo básico de scraping web

En primer lugar, demostremos cómo recuperar una página web, analizar su HTML y extraer el título de la página.

#| label: basic-scraping
# Definir la URL que se va a extraer
url = "https://www.worldometers.info/world-population/population-by-country/"

# Obtener la página web
response = requests.get(url)
# Analizar el contenido HTML
soup = BeautifulSoup(response.text, "html.parser")

# Extraiga e imprima el título de la página
page_title = soup.title.string
print("Page Title:", page_title)

Resultados:

Page Title: Population by Country (2025) - Worldometer

Extraer tablas

Muchos sitios web presentan los datos en tablas. Puede utilizar BeautifulSoup para extraer datos de tablas y convertirlos a un formato estructurado.

#| label: extract-tables
# Busca una tabla por su etiqueta (o con atributos adicionales, por ejemplo, clase o id)
table = soup.find("table")
# Extraer encabezados de tabla
headers = [header.text.strip() for header in table.find_all("th")]

# Extraer filas de la tabla
rows = []
for row in table.find_all("tr")[1:]:
    cells = [cell.text.strip() for cell in row.find_all("td")]
    if cells:
        rows.append(cells)

# Crea un `DataFrame` utilizando los encabezados y las filas extraídos
df = pd.DataFrame(rows, columns=headers)
df.head()

Tabla extraída

Manejo de la paginación

Para sitios web que muestran datos en varias páginas, puedes automatizar el proceso de iteración a través de las páginas.

El siguiente script extrae las entradas del blog extrayendo el título de cada entrada (del texto de anclaje) y la URL (del atributo href del anclaje):

#| label: pagination-example
import time

def scrape_page(url):
    response = requests.get(url)
    return BeautifulSoup(response.text, "html.parser")

# El sitio web utiliza un parámetro de consulta `#listing-listing-page=` para la paginación
base_url = "https://quarto.org/docs/blog/#listing-listing-page="
page_number = 1
all_data = []

# Ejemplo: extraer las dos primeras páginas
while page_number <= 2:
    url = base_url + str(page_number)
    soup = scrape_page(url)    
    # Extraer entradas de blog: 
    # Cada título y URL se encuentra dentro de un `<h3 class='no-anchor listing-title'>` 
    posts = []
    for h3 in soup.find_all("h3", class_="no-anchor listing-title"):
        a_tag = h3.find("a")
        if a_tag:
            title = a_tag.text.strip()
            link = a_tag.get("href")
            posts.append({"title": title, "url": link})
    
    all_data.extend(posts)
    page_number += 1
    # Retraso respetuoso entre solicitudes
    time.sleep(1)  

# Convierta la salida a un DataFrame e imprima los datos
df = pd.DataFrame(all_data)
df.head()

Entradas de blog extraídas

Cómo funciona

  • Paginación: El script crea la URL de cada página utilizando un parámetro de consulta (por ejemplo, #listing-listing-page=1, #listing-listing-page=2).
  • Scraping de la página: Para cada página, la función scrape_page descarga y analiza el HTML.
  • Extracción de publicaciones: Busca etiquetas <h3> con la clase 'no-anchor listing-title', encuentra la etiqueta secundaria <a> y extrae el título (utilizando .text) y la URL (utilizando .get('href')).
  • Recopilación de datos: Los datos de cada publicación se almacenan como un diccionario en la lista all_data.

Usar sesiones

Al extraer varias páginas del mismo sitio web, el uso de una sesión puede mejorar el rendimiento al reutilizar la configuración (como los encabezados y las cookies) y mantener el estado.

#| label: using-sessions
# Crear un objeto de sesión
session = requests.Session()
session.headers.update({"User-Agent": "Mozilla/5.0"})

# Utilice la sesión para realizar solicitudes
url = "https://www.worldometers.info/world-population/population-by-country/"
response = session.get(url)
soup = BeautifulSoup(response.text, "html.parser")
print("Session-based Page Title:", soup.title.string)

Prácticas recomendadas para el scraping web

  • Respetar las políticas del sitio web:
    Compruebe siempre el robots.txt y los términos de servicio de un sitio web antes de extraer datos.

  • Limitación de velocidad:
    Utiliza retrasos (por ejemplo, time.sleep()) entre solicitudes para evitar sobrecargar el sitio web.

  • Gestión de errores:
    Incorpore un sólido manejo de errores para gestionar problemas de conexión y estructuras HTML inesperadas.

Nota

Asegúrate de que tus actividades de scraping web cumplan con las directrices legales y éticas.

Conclusión

El scraping web con BeautifulSoup es una forma eficaz de extraer y procesar datos de sitios web. Al combinar técnicas básicas con estrategias avanzadas como la extracción de tablas, el manejo de paginación y la gestión de sesiones, puede crear canalizaciones de recopilación de datos robustas para sus proyectos de ciencia de datos. Experimente con estos ejemplos, ajústelos a sus necesidades específicas y practique siempre el scraping ético.

Lecturas adicionales

Feliz programación y disfruta explorando el poder del scraping web con BeautifulSoup!

Explorar más artículos

Nota

Aquí hay más artículos de la misma categoría para ayudarte a profundizar en el tema.

placeholder

placeholder
No hay resultados
Volver arriba

Reutilización

Cómo citar

BibTeX
@online{kassambara2024,
  author = {Kassambara, Alboukadel},
  title = {Web scraping con BeautifulSoup},
  date = {2024-02-08},
  url = {https://www.datanovia.com/es/learn/programming/python/tools/web-scraping-with-beautifulsoup.html},
  langid = {es}
}
Por favor, cita este trabajo como:
Kassambara, Alboukadel. 2024. “Web scraping con BeautifulSoup.” February 8, 2024. https://www.datanovia.com/es/learn/programming/python/tools/web-scraping-with-beautifulsoup.html.