Implementando nuestro web scrapper: Obteniendo artículos

Clase 18 de 38Curso de Ingeniería de Datos con Python

Contenido del curso

Web scraping

Pandas

Resumen

Aprende a construir un scraper robusto para sitios de noticias: valida y normaliza vínculos, extrae título y cuerpo de los artículos y prepara un dataset confiable. Verás cómo definir queries en la configuración, aplicar herencia y abstracción en Page Objects y usar programación defensiva con propiedades en Python para datos limpios y útiles.

¿Cómo preparar la configuración con keywords article body y article title?

La base está en el archivo de configuración: agrega las llaves necesarias para localizar el cuerpo y el título del artículo. Se definen como article body y article title y se replican también en el objeto del país. Para el sitio del Universal, se usan los queries ya identificados: para el cuerpo, la clase .Field Name Body; para el título, Pain Content seleccionando el primer elemento H1.

{ "queries": { "article body": ".Field Name Body", "article title": "Pain Content h1" } }

Claves prácticas:

  • Validar que los vínculos estén en el formato correcto y convertirlos si no lo están.
  • Mantener los queries en la configuración para cambiar selectores sin tocar la lógica.
  • Tomar el primer H1 para el título cuando el selector apunte a un contenedor.

¿Cómo organizar el código con herencia en News Page?

Se crea una abstracción común: News Page. Tanto Home Page como Article Page son especializaciones que comparten lógica de navegación y selección. Así, se evita duplicación y se concentra la funcionalidad común en una sola clase.

¿Cómo inicializar con super en Python?

Se define __init__ en la clase base y se invoca con super desde las subclases: es claro y reutilizable.

class NewsPage: def __init__(self, news_site_uid, url): self._news_site_uid = news_site_uid self._url = url class HomePage(NewsPage): def __init__(self, news_site_uid, url): super().__init__(news_site_uid, url) # Propiedad específica del HomePage: article_links. class ArticlePage(NewsPage): def __init__(self, news_site_uid, url): super().__init__(news_site_uid, url)

¿Qué métodos auxiliares se comparten con Article Page?

Los métodos auxiliares select y visit se mueven a la clase base para que ambos tipos de página los utilicen. Home Page conserva solo su propiedad específica article_links.

class NewsPage: def visit(self, url=None): # Lógica de visita a la URL. pass def select(self, query): # Retorna una lista de nodos que cumplen el query. return [] class HomePage(NewsPage): @property def article_links(self): # Retorna los vínculos de artículos desde la portada. return []

¿Cómo obtener body y title con programación defensiva?

La clase Article Page expone propiedades calculadas: body y title. Se reutiliza select para consultar los queries de la configuración. Se aplica programación defensiva: si no hay resultados, se devuelve un string vacío para mantener el flujo sin errores.

class ArticlePage(NewsPage): @property def body(self): result = self.select('article body') return result[0].text if result else '' @property def title(self): result = self.select('article title') return result[0].text if result else ''

Beneficios inmediatos:

  • Propiedades claras: acceso directo a título y cuerpo.
  • Queries centralizados: cambios rápidos cuando el HTML del sitio varía.
  • Código robusto: listas vacías y cambios de estructura no rompen el scraper.

¿Qué sigue en el flujo?

  • Recorrer cada vínculo del home page.
  • Instanciar Article Page con news_site_uid y url.
  • Extraer title y body para construir el dataset.

Si algo no quedó claro o quieres ver otro ejemplo de queries o herencia en Page Objects, cuéntalo en los comentarios y seguimos la conversación.