← Todos los artículos

Librerías de Python Esenciales para Web Scraping: Un Kit Inicial

Python es el lenguaje por defecto para el web scraping, y con razón. Cuenta con un pequeño conjunto de librerías maduras que cubren cada paso del trabajo: descargar páginas, analizar HTML, controlar un navegador real y limpiar los datos que extraes. Lo difícil cuando empiezas no es escribir código. Es saber qué librería usar y por qué.

Esta guía repasa las librerías que importan, en qué destaca cada una y cómo combinarlas en un stack sobre el que puedas construir.

Cómo Pensar en un Stack de Scraping

Todo trabajo de scraping se descompone en tres pasos:

  1. Descargar la página (obtener el HTML o JSON crudo desde un servidor).
  2. Analizar el contenido (encontrar los valores que te interesan dentro de ese marcado).
  3. Guardar el resultado (escribirlo en CSV, JSON o una base de datos).

Algunos sitios necesitan un cuarto paso: renderizar. Si los datos solo aparecen después de que se ejecuta el JavaScript, una petición HTTP simple devuelve una cáscara vacía, y necesitas un navegador que ejecute la página primero.

No necesitas todas las librerías de abajo desde el primer día. Elige una herramienta por paso, consigue un scraper que funcione y añade más solo cuando un sitio te obligue.

Descargar Páginas: Clientes HTTP

requests

requests es la librería con la que empieza la mayoría. Envía peticiones HTTP con una API limpia y legible, y gestiona sesiones, cabeceras, cookies y redirecciones por ti.

import requests

resp = requests.get("https://example.com", timeout=10)
print(resp.status_code)
print(resp.text[:500])

Es síncrona, lo que significa que descarga una página a la vez. Está bien para trabajos pequeños y para aprender. Cuando necesitas hacer scraping de miles de páginas, el modelo de una en una se convierte en el cuello de botella.

httpx

httpx es una alternativa moderna con casi la misma API que requests, más dos cosas que a requests le faltan: soporte asíncrono y HTTP/2. El modo asíncrono te permite lanzar muchas peticiones a la vez sin hilos, lo que supone una gran mejora de velocidad para trabajo limitado por E/S como el scraping.

import httpx
import asyncio

async def fetch(url, client):
    resp = await client.get(url, timeout=10)
    return resp.status_code

async def main():
    urls = ["https://example.com"] * 20
    async with httpx.AsyncClient(http2=True) as client:
        results = await asyncio.gather(*(fetch(u, client) for u in urls))
    print(results)

asyncio.run(main())

Si eres principiante, empieza con requests. Cuando la velocidad importe, pásate a httpx.

curl_cffi

Algunos sitios bloquean las peticiones según su huella TLS, la firma que deja un cliente durante el saludo HTTPS. Los clientes estándar de Python tienen una huella que los sistemas anti-bot reconocen al instante. curl_cffi puede imitar la huella de un navegador Chrome o Safari real, lo que te permite superar un número sorprendente de bloqueos leves.

from curl_cffi import requests

resp = requests.get("https://example.com", impersonate="chrome")
print(resp.status_code)

Guarda esta en la recámara. No la necesitarás para sitios amables, pero es lo primero que hay que probar cuando una petición normal recibe un 403.

Analizar HTML

BeautifulSoup

Una vez que tienes el HTML, necesitas extraer valores de él. BeautifulSoup es el analizador más amigable de Python. Buscas en el documento por etiqueta, clase o selector CSS, y devuelve los elementos coincidentes.

from bs4 import BeautifulSoup

html = "<div class='price'>$29.99</div>"
soup = BeautifulSoup(html, "html.parser")
print(soup.select_one(".price").text)  # $29.99

Es tolerante con el marcado mal formado y fácil de leer, por eso es el primer analizador estándar que se aprende.

lxml y parsel

lxml es más rápido que BeautifulSoup y soporta XPath, un lenguaje de consulta más preciso para documentos muy anidados. parsel (el analizador que usa Scrapy por debajo) envuelve lxml con una API limpia y funciona bien como herramienta independiente.

from parsel import Selector

sel = Selector(text="<div class='price'>$29.99</div>")
print(sel.css(".price::text").get())        # selector CSS
print(sel.xpath("//div[@class='price']/text()").get())  # XPath

Aprende primero los selectores CSS. Recurre a XPath cuando necesites coincidir por contenido de texto o navegar hasta un elemento padre, algo que CSS no puede hacer.

Frameworks Completos: Scrapy

Scrapy no es una sola librería, es un framework completo. Gestiona peticiones, análisis, concurrencia, reintentos, límite de tasa y exportación de datos de serie. Para un script puntual es excesivo. Para un crawler real que visita miles de páginas y sigue enlaces, te ahorra reinventar mucha fontanería.

import scrapy

class QuotesSpider(scrapy.Spider):
    name = "quotes"
    start_urls = ["https://quotes.toscrape.com"]

    def parse(self, response):
        for quote in response.css("div.quote"):
            yield {
                "text": quote.css("span.text::text").get(),
                "author": quote.css("small.author::text").get(),
            }
        next_page = response.css("li.next a::attr(href)").get()
        if next_page:
            yield response.follow(next_page, self.parse)

Scrapy tiene una curva de aprendizaje, así que no es por donde deben empezar los principiantes. Pero cuando te quedes pequeño con los scripts sueltos, es el paso natural siguiente.

Automatización de Navegador para Sitios con JavaScript

Cuando el contenido se carga mediante JavaScript, los clientes HTTP devuelven una página vacía. Necesitas un navegador real.

Selenium

Selenium es el veterano de la automatización de navegadores. Controla Chrome, Firefox y otros a través de sus drivers oficiales. Está muy documentado y funciona en todas partes, aunque es más lento y pesado que las herramientas más nuevas.

Playwright

Playwright es la opción moderna. Es más rápido, tiene una API más limpia, espera los elementos automáticamente y viene con los binarios del navegador, así que la configuración es indolora. También soporta asíncrono de serie.

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch()
    page = browser.new_page()
    page.goto("https://example.com")
    print(page.title())
    browser.close()

Regla práctica: prueba primero un cliente HTTP. Los navegadores usan mucha más CPU y memoria, así que recurre a uno solo cuando los datos realmente requieran JavaScript para aparecer.

Limpiar y Guardar Datos

Una vez que has extraído valores, pandas es la herramienta estándar para darles forma. Carga tus filas raspadas en un DataFrame, elimina duplicados, corrige tipos y exporta a CSV, Excel o una base de datos con una sola línea.

import pandas as pd

df = pd.DataFrame(rows)
df.drop_duplicates().to_csv("output.csv", index=False)

Para trabajos sencillos, los módulos integrados csv y json de Python son suficientes y no añaden dependencias.

Un Stack Inicial Recomendado

Si quieres un único stack que aprender primero, usa este:

  • requests para descargar páginas
  • BeautifulSoup para analizar HTML
  • pandas para limpiar y exportar

Esa combinación cubre la mayoría de los sitios estáticos. Añade httpx cuando necesites velocidad, playwright cuando necesites JavaScript y curl_cffi cuando encuentres bloqueos.

Cuando los Sitios se Defienden

Las librerías de arriba bastan para sitios simples y cooperativos. En el momento en que haces scraping a escala o apuntas a un sitio con protección anti-bot, te topas con bloqueos, CAPTCHAs, límites de tasa y páginas que devuelven un estado 200 pero sin contenido real. Rotar proxies, gestionar huellas de navegador y resolver los desafíos por tu cuenta es un proyecto grande y continuo de por sí.

Este es el hueco que llena ScrapeUnblocker, y trae una librería oficial de Python para que no tengas que cambiar tu forma de trabajar. Instálala y una sola llamada devuelve el HTML totalmente desbloqueado, con rotación de proxies, renderizado de navegador y gestión anti-bot hechos por ti:

pip install scrapeunblocker
from scrapeunblocker import Client

su = Client(api_key="YOUR_API_KEY")

# HTML totalmente renderizado y desbloqueado - pásalo directo a BeautifulSoup
html = su.get_page_source("https://example.com")

# O consigue datos estructurados ya analizados directamente
result = su.get_parsed("https://www.amazon.com/dp/B08N5WRWNW")
print(result.data["title"], result.data["price"])

Conservas tus herramientas de análisis favoritas. El paso de descarga simplemente deja de fallar. Consulta la documentación para desarrolladores para la API completa.

Preguntas Frecuentes

¿Qué librería de Python debería aprender primero un principiante? Empieza con requests para descargar y BeautifulSoup para analizar. Tienen la curva de aprendizaje más suave y cubren la mayoría de los sitios estáticos. Añade otras herramientas solo cuando un sitio concreto te obligue.

¿Necesito Scrapy o Playwright para empezar? No. Scrapy merece la pena cuando ya rastreas miles de páginas y sigues enlaces. Playwright solo hace falta cuando el contenido se carga mediante JavaScript. Ambos son pasos siguientes, no puntos de partida.

¿Por qué mi scraper obtiene una página vacía aunque el sitio funciona en mi navegador? El sitio casi seguro renderiza el contenido con JavaScript. Una petición HTTP simple solo obtiene el HTML inicial, antes de que se ejecuten los scripts. Usa Playwright o Selenium para ejecutar la página, o un servicio que la renderice por ti.

¿Cómo evito que me bloqueen mientras hago scraping? Respeta los límites de tasa, usa un user agent realista y ve más despacio. Si un sitio te bloquea activamente, necesitarás proxies rotativos y gestión de huellas. Herramientas como curl_cffi ayudan con los bloqueos leves, y un servicio como ScrapeUnblocker gestiona los casos difíciles de principio a fin.

Para Terminar

No necesitas aprender todas las librerías de scraping a la vez. Ponte cómodo con una herramienta de descarga, un analizador y una forma de guardar datos, y luego amplía tu kit a medida que los sitios reales se resistan. Empieza en pequeño, publica un scraper que funcione y añade las herramientas más pesadas solo cuando el trabajo lo exija.

Prueba ScrapeUnblocker gratis

Tasa de éxito del 95%+ · desde 0,55 € por cada 1000 llamadas · 500 solicitudes gratis al registrarte.

Pruébalo gratis → Ver precios