Herramientas8 min read

BeautifulSoup vs Scrapy vs Playwright: ¿cuál usar?

BeautifulSoup vs Scrapy vs Playwright: ¿cuál usar?

BeautifulSoup vs Scrapy vs Playwright no es una pelea entre tres opciones para el mismo problema. BeautifulSoup lee HTML, Scrapy recorre sitios enteros y Playwright maneja un navegador real. Si la página es estática y son pocas URLs, usá requests + BeautifulSoup. Si son miles de páginas, Scrapy. Si el contenido aparece recién cuando carga el JavaScript, Playwright. Y muchas veces la respuesta es combinarlas.

El problema: elegir mal te cuesta semanas

Alguien busca "web scraping python", encuentra un tutorial de BeautifulSoup y arranca. Funciona. Tres semanas después tiene que scrapear 20.000 páginas, el script tarda 9 horas y se corta a la mitad. Reescribe todo.

O al revés: alguien arranca con Playwright porque "sirve para todo", abre un navegador por cada URL y para monitorear 500 productos necesita una máquina que cuesta más que el dato que busca.

Las tres herramientas aparecen juntas en cada comparativa, pero resuelven capas distintas del mismo trabajo. Entender eso ahorra más tiempo que cualquier benchmark.

Qué es cada una (y por qué no compiten entre sí)

Un scraper hace tres cosas: pide una página, lee el HTML y guarda los datos. Cada herramienta cubre una parte diferente.

BeautifulSoup: el parser

BeautifulSoup no descarga nada. Recibe un HTML y te deja buscar adentro: "dame todos los

h3
con clase
title
". Por eso casi siempre aparece acompañada de
requests
, que es la que hace la petición.

  • Se aprende en una tarde.
  • Perfecta para scripts chicos y páginas estáticas (el HTML ya trae los datos).
  • Es sincrónica: pide una página, espera, pide la siguiente. Con cientos de URLs se nota.
  • No soporta XPath (solo CSS selectors y sus propios métodos
    find
    y
    find_all
    ).

Scrapy: el framework

Scrapy es un proyecto completo: hace las peticiones, sigue links, parsea con su propio motor (

parsel
, con CSS y XPath), reintenta errores, respeta
robots.txt
si se lo pedís y exporta a CSV, JSON o una base de datos. Todo asíncrono.

  • Pensado para rastrear sitios enteros, no una página suelta.
  • Tiene pipelines, middlewares y throttling automático incorporados.
  • La curva de aprendizaje es más alta: hay que entender su estructura de proyecto y sus callbacks.
  • Tampoco ejecuta JavaScript por sí solo.

Playwright: el navegador

Playwright abre un Chromium, Firefox o WebKit real, carga la página como lo haría un usuario y te deja interactuar: hacer click, scrollear, esperar que aparezca un elemento. Lo mantiene Microsoft y nació para testing, pero se volvió el estándar para scrapear sitios que cargan el contenido con JavaScript.

  • Si los datos aparecen recién después de que corre el JS, es la única de las tres que los ve.
  • Puede interceptar las llamadas a la API interna del sitio, que muchas veces es la forma más limpia de obtener los datos.
  • Es la más pesada: cada navegador consume CPU y memoria. Scrapear 10.000 páginas con Playwright es un problema de infraestructura, no de código.

El mismo scraper hecho tres veces

Usamos books.toscrape.com, un sitio creado para practicar scraping. Objetivo: título y precio de los libros de la primera página.

Con requests + BeautifulSoup

import requests
from bs4 import BeautifulSoup

url = "https://books.toscrape.com/"
html = requests.get(url, timeout=10).content
soup = BeautifulSoup(html, "html.parser")

for libro in soup.select("article.product_pod"):
    titulo = libro.h3.a["title"]
    precio = libro.select_one("p.price_color").text
    print(titulo, precio)

Once líneas. Si solo necesitás esta página una vez por semana, acá terminó el proyecto.

Con Scrapy

import scrapy

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

    def parse(self, response):
        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(),
            }
        siguiente = response.css("li.next a::attr(href)").get()
        if siguiente:
            yield response.follow(siguiente, self.parse)

Se corre con

scrapy runspider libros.py -o libros.csv
. Fijate las últimas tres líneas: con eso recorre las 50 páginas del catálogo, en paralelo, con reintentos, y guarda el CSV. Eso en BeautifulSoup lo tenés que programar vos.

Con Playwright

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch()
    page = browser.new_page()
    page.goto("https://books.toscrape.com/")
    page.wait_for_selector("article.product_pod")

    for libro in page.query_selector_all("article.product_pod"):
        titulo = libro.query_selector("h3 a").get_attribute("title")
        precio = libro.query_selector("p.price_color").inner_text()
        print(titulo, precio)

    browser.close()

Para este sitio es matar una mosca con un cañón: el HTML ya viene con los datos. Pero cambiá la URL por una tienda que carga precios con React y los otros dos scripts devuelven una lista vacía. Este sigue funcionando.

BeautifulSoup vs Scrapy vs Playwright: tabla comparativa

BeautifulSoup (+ requests)ScrapyPlaywright
Qué esParser de HTMLFramework de crawlingAutomatización de navegador
Ejecuta JavaScriptNoNoSí
Velocidad en muchas páginasBaja (sincrónica)Alta (asíncrona)Baja (un navegador por página)
Curva de aprendizajeUna tardeUnos díasUn par de días, más tiempo en infraestructura
Consumo de recursosMínimoBajoAlto
SelectoresCSS,
find
CSS y XPathCSS, XPath, texto, roles
Reintentos, throttling, pipelinesLos programás vosIncluidosLos programás vos
Ideal paraScripts puntuales, aprender, páginas estáticasCatálogos, sitios enteros, crawls recurrentesSPAs, scroll infinito, logins propios, contenido dinámico
Mantenimiento cuando cambia el sitioBajoMedioAlto

Las 3 preguntas para decidir

**1. ¿Los datos están en el HTML o aparecen después?**Abrí la página, click derecho, "Ver código fuente". Si encontrás el precio ahí, es estática: BeautifulSoup o Scrapy alcanzan. Si no está, se carga con JavaScript: Playwright, o mejor todavía, buscá en la pestaña Network la API interna que trae ese dato en JSON.

**2. ¿Cuántas páginas y con qué frecuencia?**Menos de 100 páginas y de vez en cuando: BeautifulSoup. Miles de páginas, varias veces por semana, siguiendo links: Scrapy. Scrapy fue hecho para eso y te va a ahorrar escribir colas, reintentos y paralelismo.

**3. ¿Hay que interactuar con la página?**Scroll infinito, botones "cargar más", filtros que cambian la URL sin recargar: Playwright. Si no hay interacción, no pagues el costo de un navegador.

La combinación que más usamos en producción: Scrapy como motor del crawl y Playwright solo para las páginas que lo necesitan (existe

scrapy-playwright
para eso). Y BeautifulSoup aparece igual en scripts de limpieza, porque leer un HTML con ella sigue siendo lo más cómodo que hay.

Errores comunes al elegir

  • Empezar con Playwright "por las dudas". Diez veces más lento y más caro, y en la mayoría de los sitios no hace falta.
  • Hacer un crawl de 50.000 URLs con un
    for
    y requests.
    Sin paralelismo ni reintentos, se corta en la URL 3.000 y perdés todo.
  • Ignorar la API interna del sitio. Muchos sitios dinámicos cargan los datos desde un endpoint JSON. Una petición a esa URL reemplaza al navegador entero.
  • Creer que la herramienta evita los bloqueos. Ninguna de las tres lo hace sola. Los bloqueos se manejan con ritmo de peticiones, proxies y headers coherentes, y eso es otro artículo.
  • No mirar
    robots.txt
    ni los términos del sitio.
    La herramienta no te protege legalmente. Si hay datos personales, aplica GDPR o la ley local, elijas lo que elijas.

Recurso: el cheat sheet del stack de scraping

Armamos un PDF de una página con las herramientas que usamos en 2026 (parsers, frameworks, navegadores, proxies y APIs), qué cuesta cada una y cuándo conviene. Comentá STACK en el reel o el carrusel de esta nota y te lo mandamos por mensaje.

¿Y a escala?

Elegir bien la librería resuelve el primer scraper. Lo que nadie cuenta es el segundo mes: el sitio cambia el HTML, aparece un captcha, el crawl de 200.000 productos necesita proxies rotativos y alguien tiene que mirar los logs un domingo.

En AUTOScraping ese "segundo mes" es nuestro trabajo diario. Con DataFactory no te entregamos un scraper: te entregamos los datos, limpios y a la frecuencia que necesites, en CSV, base de datos o API. El stack, los bloqueos y el mantenimiento quedan de nuestro lado. Somos Bright Data Solution Partner y operamos dentro del marco legal (robots.txt, términos de uso, GDPR y CCPA).

Si tu equipo ya tiene el script andando con 100 URLs y la pregunta es qué pasa con un millón, esa conversación es la que más nos gusta tener.

Preguntas frecuentes

¿Scrapy puede reemplazar a BeautifulSoup? Sí para el parsing: Scrapy trae su propio motor con CSS y XPath. Pero si solo necesitás leer un HTML que ya tenés, BeautifulSoup es más simple y no requiere armar un proyecto.

¿Playwright es mejor que Selenium? Para scraping nuevo, en general sí: API más moderna, esperas automáticas, intercepción de red y menos fallos intermitentes. Selenium sigue siendo válido si ya lo tenés en producción.

¿Puedo usar BeautifulSoup para páginas con JavaScript? Solo si antes obtenés el HTML renderizado con Playwright (o encontrás la API interna). BeautifulSoup no ejecuta JavaScript.

¿Cuál es la más rápida? Scrapy, por ser asíncrona y liviana. Playwright es la más lenta porque renderiza la página completa, incluidos CSS e imágenes, salvo que los bloquees.

¿Cuál conviene para aprender web scraping? requests + BeautifulSoup. Entendés el flujo completo en un script de diez líneas. Después, Scrapy y Playwright se aprenden sobre esa base.

Angelica Yasmin Meca Molina

Written by

Angelica Yasmin Meca Molina

Apasionada por la intersección entre la tecnología, el diseño y la innovación digital, soy diseñadora gráfica y desarrolladora Front-End. Mi trabajo se enfoca en transformar ideas complejas en soluciones visuales y funcionales, combinando estética con lógica para crear experiencias digitales significativas. Comprometida con el aprendizaje constante, busco compartir conocimiento de forma clara y práctica, aportando valor tanto a profesionales como a quienes están dando sus primeros pasos en el mundo digital.

Stay in the loop

Web scraping tips, industry news and use cases — weekly, no spam.

Share this article

Did you find it useful?

Related Articles

More from the same category