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
= "https://www.worldometers.info/world-population/population-by-country/"
url
# Obtener la página web
= requests.get(url)
response # Analizar el contenido HTML
= BeautifulSoup(response.text, "html.parser")
soup
# Extraiga e imprima el título de la página
= soup.title.string
page_title 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)
= soup.find("table")
table # Extraer encabezados de tabla
= [header.text.strip() for header in table.find_all("th")]
headers
# Extraer filas de la tabla
= []
rows for row in table.find_all("tr")[1:]:
= [cell.text.strip() for cell in row.find_all("td")]
cells if cells:
rows.append(cells)
# Crea un `DataFrame` utilizando los encabezados y las filas extraídos
= pd.DataFrame(rows, columns=headers)
df 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):
= requests.get(url)
response return BeautifulSoup(response.text, "html.parser")
# El sitio web utiliza un parámetro de consulta `#listing-listing-page=` para la paginación
= "https://quarto.org/docs/blog/#listing-listing-page="
base_url = 1
page_number = []
all_data
# Ejemplo: extraer las dos primeras páginas
while page_number <= 2:
= base_url + str(page_number)
url = scrape_page(url)
soup # 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"):
= h3.find("a")
a_tag if a_tag:
= a_tag.text.strip()
title = a_tag.get("href")
link "title": title, "url": link})
posts.append({
all_data.extend(posts)+= 1
page_number # Retraso respetuoso entre solicitudes
1)
time.sleep(
# Convierta la salida a un DataFrame e imprima los datos
= pd.DataFrame(all_data)
df 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_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
= requests.Session()
session "User-Agent": "Mozilla/5.0"})
session.headers.update({
# Utilice la sesión para realizar solicitudes
= "https://www.worldometers.info/world-population/population-by-country/"
url = session.get(url)
response = BeautifulSoup(response.text, "html.parser")
soup 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.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.
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}
}