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 BeautifulSoupEjemplo 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()
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()
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_pagedescarga 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 elrobots.txty 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.
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
- Automatización en Python: programación y automatización de tareas
- Creación de API REST con FastAPI: un marco moderno de Python
- Pruebas unitarias en Python con pytest: una guía completa
Feliz programación y disfruta explorando el poder del scraping web con BeautifulSoup!
Explorar más artículos
Aquí hay más artículos de la misma categoría para ayudarte a profundizar en el tema.
Reutilización
Cómo citar
@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}
}
