Web Scraping con Python y Scrapy

Cristian Rivera | Mar 25, 2026 mins. de lectura

¿Qué es el Web Scraping?

Vivimos en un mundo donde una cantidad enorme de información está disponible en internet: precios de productos, noticias, datos climáticos, ofertas de empleo, resultados deportivos y mucho más. Sin embargo, gran parte de esa información no está lista para ser analizada directamente; está dispersa en páginas web, presentada visualmente para los usuarios, pero no estructurada para su procesamiento automático.

El web scraping es el proceso de extracción automatizada de datos desde sitios web. En términos sencillos, consiste en programar un sistema que visite páginas web, las lea tal como lo haría un navegador, y extraiga de ellas la información que nos interesa, guardándola en un formato que podamos usar: una hoja de cálculo, una base de datos, un archivo de texto, entre otros.

Esta técnica tiene aplicaciones en múltiples áreas: investigación académica, periodismo de datos, inteligencia de mercado, monitoreo de precios, análisis de redes sociales y construcción de conjuntos de datos para entrenar modelos de machine learning, por mencionar algunas.

Es importante señalar que el web scraping debe practicarse de manera ética y responsable. Antes de extraer datos de un sitio web, conviene revisar sus términos de uso y su archivo robots.txt, que es un documento que los sitios publican para indicar qué partes pueden ser rastreadas automáticamente y cuáles no. No todos los sitios permiten esta práctica, y en algunos contextos puede tener implicaciones legales.


Python y el Web Scraping

Python se ha convertido en el lenguaje de referencia para el web scraping, y no es casualidad. Su sintaxis clara y legible, combinada con un ecosistema robusto de bibliotecas especializadas, lo hacen ideal tanto para principiantes como para desarrolladores con experiencia.

Entre las herramientas más utilizadas del ecosistema Python para esta tarea se encuentran:

  • Requests: permite realizar peticiones HTTP para obtener el contenido de una página web.
  • BeautifulSoup: facilita el análisis y navegación del HTML de una página para extraer datos específicos.
  • Selenium: útil cuando se necesita interactuar con sitios dinámicos que cargan contenido mediante JavaScript.
  • Scrapy: un framework completo y robusto para construir proyectos de scraping a mayor escala.

Para tareas simples, una combinación de Requests y BeautifulSoup puede ser suficiente. Sin embargo, cuando el proyecto crece en complejidad —múltiples páginas, manejo de errores, almacenamiento de datos, respeto de tiempos de espera— un framework como Scrapy ofrece una estructura mucho más sólida y eficiente.


Scrapy: Un Framework para Web Scraping Profesional

Scrapy es un framework de código abierto escrito en Python, diseñado específicamente para extraer datos de sitios web de manera estructurada, rápida y escalable. Fue creado originalmente por Scrapinghub (hoy Zyte) y es mantenido activamente por su comunidad. A diferencia de soluciones más simples, Scrapy ofrece una arquitectura completa que gestiona desde las peticiones HTTP hasta el almacenamiento de los datos extraídos.

Algunas de sus características más destacadas son:

  • Velocidad: realiza múltiples peticiones de forma asíncrona, lo que acelera significativamente el proceso.
  • Estructura clara: organiza el proyecto en componentes bien definidos (spiders, pipelines, middlewares).
  • Exportación de datos: permite guardar los resultados en formatos como JSON, CSV o XML con un simple comando.
  • Extensibilidad: se puede personalizar y extender para adaptarse a casi cualquier necesidad.

Para conocer más sobre Scrapy, su documentación oficial es un excelente punto de partida: docs.scrapy.org


Instalación y Configuración

Para comenzar a usar Scrapy, es necesario tenerlo instalado en el entorno de Python. Se recomienda hacerlo dentro de un entorno virtual para mantener las dependencias organizadas:

# Crear un entorno virtual
python -m venv entorno_scraping

# Activar el entorno virtual (Windows)
entorno_scraping\Scripts\activate

# Activar el entorno virtual (Mac/Linux)
source entorno_scraping/bin/activate

# Instalar Scrapy
pip install scrapy

Una vez instalado, se puede crear un nuevo proyecto con el siguiente comando:

scrapy startproject mi_proyecto

Esto genera una estructura de carpetas como la siguiente:

mi_proyecto/
├── scrapy.cfg
└── mi_proyecto/
    ├── __init__.py
    ├── items.py
    ├── middlewares.py
    ├── pipelines.py
    ├── settings.py
    └── spiders/
        └── __init__.py

Cada archivo cumple un rol específico dentro del framework, aunque para comenzar, el directorio más importante es spiders/, que es donde se definen los robots de extracción.


El Componente Central: Los Spiders

En Scrapy, un spider es una clase de Python que define cómo se debe navegar un sitio web y qué información se debe extraer de él. El nombre hace referencia a las arañas que tejen y recorren una telaraña, en este caso, la web.

A continuación se muestra un ejemplo básico de un spider que extrae los títulos y enlaces de las noticias publicadas en books.toscrape.com, un sitio creado específicamente para practicar web scraping:

import scrapy

class LibrosSpider(scrapy.Spider):
    name = "libros"
    start_urls = ["https://books.toscrape.com/"]

    def parse(self, response):
        # Extraer el título y precio de cada libro en la página
        for libro in response.css("article.product_pod"):
            yield {
                "titulo": libro.css("h3 a::attr(title)").get(),
                "precio": libro.css("p.price_color::text").get(),
            }

        # Seguir a la página siguiente si existe
        siguiente_pagina = response.css("li.next a::attr(href)").get()
        if siguiente_pagina:
            yield response.follow(siguiente_pagina, self.parse)

Para ejecutar este spider y guardar los resultados en un archivo CSV:

scrapy crawl libros -o libros.csv

Este ejemplo ilustra tres aspectos clave del funcionamiento de Scrapy: la petición inicial (start_urls), la extracción de datos mediante selectores CSS, y la paginación automática, que permite recorrer múltiples páginas de manera encadenada.


Selectores: CSS y XPath

Una de las habilidades fundamentales en web scraping es saber cómo identificar y extraer los elementos que nos interesan dentro del HTML de una página. Scrapy ofrece dos sistemas de selección:

Selectores CSS

Son la opción más intuitiva si se tiene alguna experiencia con diseño web. Funcionan de manera similar a como se aplican estilos en una hoja de estilos CSS:

# Seleccionar el texto de todos los encabezados h2
response.css("h2::text").getall()

# Seleccionar el atributo href de todos los enlaces
response.css("a::attr(href)").getall()

# Seleccionar el primer elemento con clase 'titulo'
response.css(".titulo::text").get()

Selectores XPath

XPath es un lenguaje más expresivo y potente para navegar documentos HTML y XML. Aunque su sintaxis es menos intuitiva al principio, permite construir consultas más precisas:

# Seleccionar el texto de todos los párrafos
response.xpath("//p/text()").getall()

# Seleccionar el href de enlaces que contengan la palabra 'contacto'
response.xpath("//a[contains(@href, 'contacto')]/@href").getall()

Ambos sistemas son válidos y pueden combinarse en un mismo spider. La elección depende principalmente de la preferencia del desarrollador y de la complejidad de la estructura HTML que se esté analizando.

Para explorar los selectores en profundidad: Scrapy Selectors — Documentación oficial


Items y Pipelines: Estructurando y Procesando los Datos

Scrapy ofrece dos mecanismos adicionales que resultan especialmente útiles en proyectos de mayor envergadura: los Items y los Pipelines.

Items

Los Items permiten definir una estructura clara para los datos que se van a extraer, similar a como se definiría un esquema en una base de datos:

# items.py
import scrapy

class LibroItem(scrapy.Item):
    titulo = scrapy.Field()
    precio = scrapy.Field()
    disponibilidad = scrapy.Field()
    calificacion = scrapy.Field()

Usar Items en lugar de diccionarios simples hace que el código sea más ordenado y facilita la detección de errores.

Pipelines

Los Pipelines son el lugar donde se procesan los datos una vez extraídos. Se pueden usar para limpiar la información, validarla, transformarla o almacenarla en una base de datos:

# pipelines.py
class LimpiezaPrecioPipeline:
    def process_item(self, item, spider):
        # Eliminar el símbolo de moneda y convertir a número
        precio_texto = item.get("precio", "£0.00")
        item["precio"] = float(precio_texto.replace("£", "").strip())
        return item

Los pipelines se activan en el archivo settings.py:

ITEM_PIPELINES = {
    "mi_proyecto.pipelines.LimpiezaPrecioPipeline": 300,
}

El número (300) indica la prioridad de ejecución; valores menores se ejecutan primero.


Buenas Prácticas y Consideraciones Éticas

Hacer web scraping de forma responsable implica más que saber escribir el código. Algunas consideraciones importantes son:

Respetar el archivo robots.txt: este archivo, presente en la mayoría de los sitios web bajo la ruta /robots.txt, indica qué secciones pueden ser rastreadas automáticamente. Scrapy lo respeta por defecto cuando la configuración ROBOTSTXT_OBEY = True está activa en settings.py.

Establecer retardos entre peticiones: hacer demasiadas solicitudes en muy poco tiempo puede sobrecargar el servidor del sitio web. Scrapy permite configurar un tiempo de espera entre peticiones:

# settings.py
DOWNLOAD_DELAY = 2  # Esperar 2 segundos entre cada petición

Identificarse correctamente: algunos sitios web verifican el encabezado User-Agent para saber qué tipo de cliente está haciendo la solicitud. Es una buena práctica identificarse de forma honesta.

Verificar los términos de uso: algunos sitios prohíben explícitamente el scraping en sus condiciones de servicio. Es fundamental leerlas antes de proceder.


Recursos para Profundizar

Si este tema ha despertado tu interés, los siguientes recursos son un excelente punto de partida para continuar aprendiendo:

  • 📘 Documentación oficial de Scrapy: docs.scrapy.org La referencia más completa y actualizada sobre el framework.

  • 📗 Web Scraping with Python — Ryan Mitchell (O’Reilly, 2018): Un libro muy accesible que cubre desde los fundamentos hasta técnicas avanzadas, incluyendo el manejo de JavaScript y el uso de APIs.

  • 📙 books.toscrape.com: books.toscrape.com Un sitio creado específicamente para practicar web scraping sin preocupaciones éticas o legales.

  • 📺 Scrapy Tutorial en YouTube — freeCodeCamp: freeCodeCamp.org YouTube Tutoriales en video gratuitos con proyectos prácticos.

  • 📄 The Ethics of Web Scraping — Towards Data Science: Un artículo que reflexiona sobre las implicaciones éticas y legales de esta práctica. towardsdatascience.com


Conclusión

El web scraping es una habilidad cada vez más relevante en un mundo donde los datos son un recurso fundamental. Python, con su ecosistema de herramientas, ofrece las condiciones ideales para iniciarse en esta práctica, y Scrapy eleva esas posibilidades a un nivel profesional, permitiendo construir proyectos robustos, escalables y bien organizados.

Como cualquier herramienta, su valor no reside solo en la capacidad técnica de quien la usa, sino también en la responsabilidad con la que se aplica. Conocer sus posibilidades es el primer paso; usarla con criterio ético y propósito claro es lo que distingue a un buen desarrollador de datos.

Si estás comenzando, el mejor consejo es practicar con sitios diseñados para ello, como books.toscrape.com, antes de avanzar hacia proyectos más complejos. La curva de aprendizaje de Scrapy puede parecer pronunciada al principio, pero la estructura que ofrece vale ampliamente el esfuerzo.