Scrapy vs. Beautiful Soup

Comparación entre Scrapy y Beautiful Soup. Descubra las dos opciones más populares para el Scraping web.
10 min de lectura
Scrapy vs Beautiful Soup

En lo que respecta al Scraping web, Python ofrece una gran variedad de herramientas entre las que elegir. Selenium, MechanicalSoup, Scrapy, Requests, Beautiful Soup y lxml se utilizan a menudo en este contexto. Sin embargo, estas herramientas no son iguales, ya que cada una de ellas tiene su propio conjunto de casos de uso en los que destaca. Algunas de ellas son incluso complementarias, como se demostrará en este artículo.

En este artículo, analizaremos más detenidamente Scrapy y Beautiful Soup, dos opciones populares para el Scraping web.

Beautiful Soup es una biblioteca de parseo. Permite la navegación por documentos utilizando selectores XPath y CSS. Esto facilita la transformación de datos de lenguajes de marcado (como HTML y XML) en datos estructurados. Por el contrario, Scrapy es un completo marco de trabajo para el Scraping web que carga un documento y (opcionalmente) lo almacena.

Más información sobre el Scraping web con Beautiful Soup.

En esta comparación, se tendrán en cuenta los siguientes aspectos: facilidad de uso del rastreo, facilidad de uso del scraping, velocidad, ejecución en varios pasos, Proxy rotativo y Resolución de CAPTCHA.

Scrapy vs. Beautiful Soup: comparación rápida

Si tienes prisa, aquí tienes una comparación rápida entre Scrapy y Beautiful Soup para el Scraping web con Python.

Scrapy es un marco de trabajo completo para el Scraping web, perfecto para proyectos de extracción de datos a gran escala y que ofrece soporte integrado para el rastreo, mientras que Beautiful Soup es una biblioteca de Parseo más adecuada para tareas de scraping más pequeñas y sencillas, sin capacidades de rastreo integradas.

Scrapy destaca por su velocidad y eficiencia en operaciones de scraping extensas, y Beautiful Soup destaca por su simplicidad y facilidad de uso para tareas rápidas. Elige Scrapy para proyectos complejos o Beautiful Soup para necesidades de parseo simples y directas.

Scrapy

Scrapy es una suite todo en uno para rastrear la web, descargar documentos, procesarlos y almacenar los datos resultantes en un formato accesible. La instalación de Scrapy se realiza fácilmente con pip o conda:

pip install scrapy
conda install -c conda-forge scrapy

Rastreo web con Scrapy

Scrapy le ayuda a rastrear conjuntos de páginas y sitios web para recopilar URL que rastrear o para descubrir si una página contiene la información específica que está buscando. Scrapy funciona con arañas, que son clases de Python en las que se puede definir cómo navegar por un sitio web, hasta qué profundidad debe llegar en la estructura del sitio web, qué datos debe extraer y cómo deben almacenarse. Para crear una lista de URL, Scrapy puede navegar por documentos HTML, XML y CSV e incluso cargar mapas de sitio.

Además, Scrapy ofrece el shell de Scrapy, un shell interactivo para probar y depurar expresiones XPath y CSS en páginas específicas. El uso del shell puede ahorrarle tiempo a la hora de rastrear y extraer datos, ya que elimina la necesidad de reiniciar la araña cada vez que se realizan cambios.

Scraping web con Scrapy

Cuando se trata de scraping, normalmente se necesita mucha flexibilidad. Scrapy ofrece dos formas de seleccionar elementos en un documento: a través de expresiones XPath y CSS. La primera se utiliza principalmente para documentos XML, mientras que la segunda es exclusiva para documentos HTML.

Una característica única de Scrapy es la posibilidad de definir canalizaciones. Cuando se extrae un elemento, se puede enviar a una canalización en la que se realiza una secuencia de acciones sobre él: limpieza, validación, hash, deduplicación y enriquecimiento.

Velocidad

Otro aspecto importante del scraping web es el tiempo que lleva. Evaluar la velocidad de Scrapy no es fácil, ya que tiene mucha sobrecarga que debe procesarse. Por esta razón, la sobrecarga solo se carga una vez, mientras que el rastreo y la extracción se realizan diez veces.

En el siguiente ejemplo, se extrae el h2 de una página web simple (es decir, no dinámica). Todo el código se ejecuta en un Jupyter Notebook.

En primer lugar, cargue las bibliotecas Scrapy necesarias:

import scrapy
from scrapy.crawler import CrawlerProcess

A continuación, establezca la clase MySpider que describe el trabajo de rastreo:

class MySpider(scrapy.Spider):
    name = "myspider"
    start_urls = [
        'https://edition.cnn.com' # O repita esto 10 veces para calcular el tiempo marginal.
    ]
    def parse(self, response):
        yield {'output': response.css('h2.container_lead-package__title_url-text::text').extract()}
process = CrawlerProcess(
    settings={
        "FEEDS": {
            "scrapy_output.json": {"format": "json", "overwrite": True}
        }
    })

process.crawl(MySpider)

En tercer lugar, ejecuta el script y cronometra el tiempo:

%%timeit -n 1 -r 1
process.start()

La secuencia de rastreo, extracción y almacenamiento de un único documento web tardó aproximadamente 400 milisegundos. Sin embargo, repetir el mismo proceso diez veces tardó 1200 milisegundos. Esto implica que una sola secuencia tarda alrededor de 80 milisegundos, lo cual es impresionante. Dada la sobrecarga, Scrapy debería ser su primera opción para trabajos intensivos.

Rastreo de múltiples pasos con Scrapy

Muchos sitios web, si no los más populares, como X/Twitter, Substack y LinkedIn, son dinámicos. Esto significa que gran parte de la información está oculta detrás de pantallas de inicio de sesión, consultas de búsqueda, ventanas emergentes, desplazamientos o movimientos del ratón. Por lo tanto, a menudo no basta con que tu araña visite una página para extraer datos de ella.

Scrapy ofrece varios enfoques para manejar estos trabajos como herramienta independiente. Se podrían producir las solicitudes HTTP necesarias o ejecutar los fragmentos de JavaScript pertinentes. Sin embargo, el uso de un navegador sin interfaz ofrece la mayor flexibilidad. Por ejemplo, existen integraciones de Playwright y Selenium para Scrapy que se pueden utilizar para interactuar con elementos dinámicos.

Rotación de proxies y prevención de CAPTCHA con Scrapy

La llegada de los grandes modelos de lenguaje ha motivado a muchas empresas a ajustar los modelos, pero esto requiere datos específicos (a menudo extraídos). Además, muchas organizaciones no quieren que los bots sobrecarguen los servidores de sus sitios web y no tienen ningún interés comercial en compartir sus datos. Por eso, muchos sitios web no solo están configurados como dinámicos, sino que también introducen tecnologías antiescraping, como el bloqueo automático de IP y CAPTCHA.

Para evitar quedar bloqueado, Scrapy no ofrece herramientas listas para usar para usar Proxy rotativo (y direcciones IP). Sin embargo, Scrapy se puede ampliar a través del marco Middleware, un conjunto de ganchos para modificar el proceso de solicitud y respuesta de Scrapy. Para rotar proxies, se puede adjuntar un módulo Python, como scrapy-rotating-proxies, que está específicamente diseñado para ello. A través del mismo mecanismo, se puede adjuntar el módulo DeCAPTCHA.

Beautiful Soup

A diferencia de Scrapy, Beautiful Soup no ofrece una solución completa para extraer y procesar datos de documentos web, sino que solo ofrece la parte de scraping. Solo hay que introducir un documento descargado y Beautiful Soup lo convierte en datos estructurados mediante selectores CSS y XPath.

La instalación de Beautiful Soup se puede realizar a través de pip y conda:

pip install BeautifulSoup4
conda install -c anaconda beautifulsoup4

Rastreo web con Beautiful Soup

Mientras que Scrapy utiliza arañas para navegar por un sitio web, Beautiful Soup no ofrece esa capacidad. Sin embargo, con un poco de creatividad en Python, utilizando tanto Beautiful Soup como la biblioteca Requests, se puede escribir un script para navegar por un sitio web hasta una cierta profundidad. No obstante, ciertamente no es tan fácil como con Scrapy.

Scraping web con Beautiful Soup

El scraping web es lo que hace que Beautiful Soup 4 funcione. No solo ofrece selectores CSS y XPath, sino que también incluye una multitud de métodos para recorrer documentos. Cuando los documentos tienen una estructura compleja, métodos como .parent y .next_sibling pueden extraer elementos que de otro modo serían difíciles de alcanzar. Además, a través de find_all() y métodos similares, se pueden especificar filtros de texto, expresiones regulares e incluso funciones personalizadas para encontrar los elementos requeridos.

Por último, Beautiful Soup cuenta con varios formateadores de salida para imprimir de forma atractiva, codificar, eliminar las comillas tipográficas de Microsoft e incluso realizar el parseo y validar HTML.

Velocidad

A diferencia de Scrapy, Requests y Beautiful Soup no tienen sobrecarga y pueden ejecutarse simplemente diez veces para evaluar su velocidad.

En primer lugar, cargue las bibliotecas necesarias:

import requests, json
from bs4 import BeautifulSoup

En segundo lugar, cronometra el código envolviéndolo en un comando mágicotimeit:

%%timeit -n 10 -r 1
page = requests.get('https://edition.cnn.com')
page_html = BeautifulSoup(page.text, 'html.parser')
page_html = page_html.select_one('h2.container_lead-package__title_url-text').text
json_object = json.dumps({'output': page_html})
with open("bs4_output.json", "w") as output_file:
    output_file.write(json_object)

Ejecutarlo una vez lleva aproximadamente 300 milisegundos. Ejecutarlo diez veces lleva 3000 milisegundos, lo que es considerablemente más lento que Scrapy. Sin embargo, requiere mucha menos configuración y relativamente pocos conocimientos sobre un marco concreto.

Rastreo en varios pasos con Beautiful Soup

Dado que Beautiful Soup no tiene capacidades de rastreo, es evidente que no puede manejar páginas web dinámicas. Sin embargo, al igual que Scrapy, funciona perfectamente con herramientas de automatización, como Playwright, Puppeteer y Selenium. La combinación de herramientas de automatización con Beautiful Soup siempre funciona de la misma manera: los navegadores sin interfaz gráfica manejan los elementos dinámicos, mientras que Beautiful Soup extrae los datos renderizados en esos navegadores.

Proxy rotativo y prevención de CAPTCHA con Beautiful Soup

Dado que Beautiful Soup es una herramienta de scraping y no de rastreo, no ofrece ninguna herramienta para evitar ser bloqueado por los servidores de un sitio web. Si necesitas esto, estas características deben formar parte de la herramienta de rastreo que elijas.

Conclusión

Este artículo ha descrito las diferencias entre Beautiful Soup y Scrapy en cuanto a la usabilidad para el rastreo y el Scraping web en términos de velocidad, manejo de documentos web dinámicos y elusión de medidas anti-scraping.

Como herramienta integral, Scrapy es claramente la favorita para las tareas diarias de scraping. Sin embargo, requiere algún middleware para extraer datos de sitios web dinámicos y garantizar que no se bloquee.

Aunque Beautiful Soup (junto con el paquete request) es bastante lento, ofrece una forma muy familiar y sencilla de realizar trabajos de scraping ad hoc. Al igual que Scrapy, requiere herramientas adicionales para el scraping de sitios web dinámicos y la prevención de bloqueos.

Si buscas una solución integral para el Scraping web, considera Bright Data. Bright Data ofrece numerosos productos, como servicios de Proxy y Web Unlocker, para ayudarte con todas tus necesidades de Scraping web, independientemente de la opción que decidas utilizar.

¿Le interesa saber cómo integrar los Proxies de Bright Data? Lea nuestra guía de integración de Proxies Scrapy y Proxies BeautifulSoup.