Crawlee para Python: Una Guía Práctica para Flujos de Trabajo de Web Scraping
TL;DR
Crawlee para Python es un marco de trabajo para flujos de trabajo de rastreo. Gestiona solicitudes, colas, manejadores y conjuntos de datos alrededor de tu código de extracción; es más que un analizador o un controlador de navegador.
Comienza con un rastreador HTTP para páginas estáticas o renderizadas por servidor. Elige BeautifulSoupCrawler o ParselCrawler; pasa a PlaywrightCrawler solo cuando el contenido realmente requiera renderizado por navegador.
La documentación oficial actual de Python es la versión 1.11 y requiere Python 3.10 o posterior. Fija la versión que validas, especialmente al actualizar el almacenamiento o el comportamiento del cliente HTTP.
Usa un límite de páginas y un dominio en la lista permitida en tu primera ejecución. Crawlee deduplica las URL en cola, pero aún necesitas definir el alcance, extraer solo los datos autorizados y medir la completitud.
¿Qué es Crawlee para Python?
Crawlee para Python es un marco de trabajo de código abierto para construir rastreadores web y flujos de trabajo de extracción de datos. Un rastreador comienza con URLs, envía cada solicitud a través de una cola, invoca un manejador para cada página y almacena los registros extraídos en un conjunto de datos. Eso proporciona una estructura de proyecto para la orquestación de rastreos que una llamada cruda a requests.get() no ofrece. Si prefieres un servicio gestionado para la recolección de URLs y sitios permitidos, Nstdata Crawl es otra opción; no reemplaza los manejadores personalizados de Crawlee o la lógica de API específica de la aplicación.
La distinción práctica es:
Solicitudes + Beautiful Soup: controlas cada solicitud y analizas el HTML. Bueno para una tarea pequeña y fija.
defines cómo procesar cada solicitud mientras que el marco gestiona una cola de rastreo, solicitudes duplicadas, manejadores y almacenamiento.
Descubre Nstproxy Crawl - Empieza Tu Prueba Gratuita Hoy
Crawlee:
Playwright: automatizas un navegador. Puede renderizar JavaScript, pero por sí solo no proporciona un flujo de trabajo de rastreador completo.
El actual inicio rápido de Crawlee Python lista tres clases de rastreadores: BeautifulSoupCrawler, ParselCrawler, y PlaywrightCrawler. Los rastreadores HTTP no renderizan JavaScript; el rastreador de Playwright controla un navegador sin cabeza.
Crawlee para Python vs Scrapy vs Playwright
Herramienta
Rol principal
Cola de solicitudes y flujo de trabajo de rastreo
Renderizado de JavaScript
Almacenamiento de datos
Buena opción
Crawlee para Python
Marco de rastreo en Python
Cola de solicitudes incorporada, manejadores, enrutamiento y almacenamiento
Sí, a través de PlaywrightCrawler
Almacenamiento de conjuntos de datos y clave-valor
Equipos de Python que quieren un bucle de rastreo gestionado y una opción de HTTP a navegador
Scrapy
Marco de rastreo completo en Python
Programador, Descargador, Middleware y tuberías incorporados
No por sí mismo; añade una integración de navegador cuando sea necesario
Tuberías de ítems y feeds
Proyectos de rastreo más grandes y altamente personalizados con un stack de Scrapy establecido
Playwright
Biblioteca de automatización de navegador
No tiene cola de rastreo de propósito general ni conjunto de datos por sí mismo
Sí
Tu código de aplicación
Pruebas de navegador y páginas cuyo contenido autorizado debe ser renderizado o interactuado
Solicitudes + Beautiful Soup
Cliente HTTP más analizador HTML
No tiene cola de rastreo por sí mismo
No
Tu código de aplicación
Algunas URLs conocidas o un analizador simple de API/página
Un error común es comparar Crawlee y Playwright como si resolvieran la misma capa. Crawlee puede usar Playwright como su motor de navegador; Playwright por sí solo deja el descubrimiento de URL, la deduplicación, los límites de trabajo, la salida y el comportamiento de reinicio a tu aplicación. Consulta la documentación de araña de Scrapy y la documentación de Playwright para Python para los límites de esas herramientas.
Rastreador: elige una implementación respaldada por HTTP o navegador y ejecuta el trabajo.
Solicitud / RequestQueue: representa las páginas a visitar y mantiene la lista de trabajo. Crawlee deduplica solicitudes utilizando una clave única derivada de la URL por defecto.
Router y manejador: deciden cómo procesar una solicitud. Un único manejador por defecto es suficiente para un primer raspador; etiquetas y manejadores de ruta ayudan a separar las páginas de listado de las páginas de detalle más adelante.
Conjunto de datos: almacena registros estructurados. El almacenamiento clave-valor es útil para artefactos como archivos, capturas de pantalla o estado.
Rastreadores HTTP vs Rastreadores de Navegador
Usa un rastreador HTTP cuando el servidor devuelve los datos en la respuesta HTML. Evita la sobrecarga de iniciar un navegador y suele ser más simple de implementar. Usa PlaywrightCrawler cuando una página necesite renderizado del lado del cliente para exponer el contenido que estás autorizado a recolectar.
Antes de pasar a un navegador, inspeccione la respuesta inicial de la página y verifique si sus datos están disponibles en HTML o en una API documentada. La representación en el navegador añade CPU y memoria, binarios de navegador, tiempos de carga de página más largos y más puntos de fallo. No es una forma de eludir los controles de acceso o los desafíos de CAPTCHA.
Colas de Solicitudes, Enrutamiento y Conjuntos de Datos
Una cola es útil cuando las páginas enlazan a más páginas, o cuando un trabajo comienza con una lista conocida pero descubre trabajo adicional a medida que se ejecuta. El manejador de solicitudes puede extraer un registro y encolar los siguientes enlaces permitidos. La cola se encarga de la deduplicación de URL; su código aún tiene que definir qué páginas están en el alcance y qué califica como un registro válido.
Para un catálogo de comercio electrónico, un manejador de listados puede extraer tarjetas de productos y encolar el único enlace de siguiente página. Un manejador de detalles separado puede procesar URLs de productos si el proyecto necesita más campos de los que proporciona el listado. Mantenga los esquemas de página de lista y página de detalle explícitos para que un registro de listado vacío no se confunda con un producto.
Requisitos Previos e Instalación
Crawlee para Python actualmente requiere Python 3.10 o más reciente. La instalación rápida es:
Para un rastreador respaldado por un navegador, instale las dependencias del navegador Playwright como se documenta:
playwright install
Fije la dependencia en un archivo de bloqueo para implementaciones reproducibles. La documentación actual es la versión 1.11; la guía de actualización a Crawlee 1.0 describe cambios en el almacenamiento y el cliente HTTP predeterminado, así que no asuma que un ejemplo de código anterior se comporta de manera idéntica después de una actualización importante.
Paso 1: Construya Su Primer Rastreador de Python con Crawlee
Este ejemplo utiliza Books to Scrape, un catálogo de demostración. Lee tarjetas de productos de la página de listado, sigue solo el enlace de "siguiente página", limita el rastreo a tres solicitudes y exporta el conjunto de datos predeterminado a CSV. Ejecute ejemplos en un sitio destinado a pruebas o uno al que esté autorizado a rastrear.
Configure el Rastreador y las URLs de Inicio
Guarde lo siguiente como books_catalog.py:
import asyncio
from crawlee.crawlers import BeautifulSoupCrawler, BeautifulSoupCrawlingContext
asyncdefmain()->None: crawler = BeautifulSoupCrawler(max_requests_per_crawl=3)@crawler.router.default_handlerasyncdefhandle_page(context: BeautifulSoupCrawlingContext)->None: soup = context.soup
for card in soup.select("article.product_pod"): title_link = card.select_one("h3 a") price = card.select_one(".price_color") availability = card.select_one(".availability")if title_link isNone:continueawait context.push_data({"source_url": context.request.url,"title": title_link.get("title")or title_link.get_text(strip=True),"product_url": title_link.get("href"),"price_text": price.get_text(strip=True)if price elseNone,"availability_text": availability.get_text(" ", strip=True)if availability
elseNone,})# Siga el enlace de siguiente página del listado únicamente; permanezca en el mismo hostname.await context.enqueue_links(selector="li.next a")await crawler.run(["https://books.toscrape.com/"])await crawler.export_data(path="books.csv")if __name__ =="__main__": asyncio.run(main())
Luego ejecútelo:
python books_catalog.py
El límite de solicitudes mantiene intencionadamente la muestra pequeña. Para un proyecto real, establezca un presupuesto de página o solicitud que coincida con el alcance que tiene permiso para recoger, y registre por qué se aceptó cada solicitud.
Extraer Datos y Guardar Resultados
Cada llamada a context.push_data() añade un registro al conjunto de datos predeterminado. El paso de exportación escribe ese conjunto de datos en un archivo CSV. Una fila representativa tiene esta forma:
{"source_url":"https://books.toscrape.com/","title":"A Light in the Attic","product_url":"catalogue/a-light-in-the-attic_1000/index.html","price_text":"£51.77","availability_text":"In stock"}
Los valores actuales exactos pueden cambiar en un sitio en vivo; el fragmento muestra los campos, no un resultado prometido capturado. Preserve la URL de origen con cada registro. Para producción, normalice enlaces relativos con urljoin(), almacene un sello horario de rastreo y valide que cada producto tenga los campos que su trabajo posterior requiere.
Paso 2: Rastree Múltiples Páginas con Colas de Solicitudes
El ejemplo ya utiliza la cola de solicitudes implícita de Crawlee: crawler.run() añade la URL de inicio, y el controlador encola la siguiente página. Cuando un sitio tiene muchas URL conocidas, utiliza crawler.run(urls) o las API de la cola para iniciar el trabajo. La introducción oficial de Crawlee explica cómo funcionan las colas de solicitudes y el descubrimiento de enlaces.
Descubrir y Encolar Enlaces
Por defecto, context.enqueue_links() se mantiene en el mismo nombre de host; un selector reduce cuáles anclajes se consideran. Para sitios de documentación, un rastreo puede usar un selector como a.sidebar-link y un límite de página, y luego aplicar patrones de inclusión/exclusión para secciones.
Normaliza las URL antes de almacenarlas. También decide si las cadenas de consulta identifican páginas distintas: los filtros y los parámetros de seguimiento pueden crear muchas URL que muestran el mismo contenido. La deduplicación de la cola ayuda con variantes de URL exactas, pero no puede inferir que dos URL semánticamente diferentes contengan el mismo artículo.
Utilizar Rutas para Diferentes Tipos de Página
Cuando las páginas de lista y detalle necesitan selectores diferentes, asigna etiquetas cuando encolas URL y registra controladores de ruta separados. Esto mantiene la lógica de extracción legible:
Controlador de lista: recopilar tarjetas, luego encolar enlaces de detalle.
Controlador de detalle: extraer los campos que existen solo en una página de producto.
Controlador de errores: registrar URL fallida, estado y una categoría de error breve.
No pongas todos los tipos de página en una gran condicional una vez que el rastreador crezca. Los controladores separados facilitan probar un fixture de página contra el esquema correcto.
Paso 3: Extraer Sitios Web Renderizados por JavaScript
Cambia a PlaywrightCrawler cuando el contenido de página permitido falta en la respuesta HTTP y aparece solo después de la renderización del lado del cliente. El inicio rápido oficial muestra la misma interfaz básica de controlador con un contexto de Playwright:
Esto ilustra la API del rastreador de navegador; no promete que un objetivo dinámico sea accesible. Si tu propia aplicación se renderiza después de que aparece un selector conocido, espera ese selector en un controlador específico del sitio y establece un tiempo de espera. Evita un sueño fijo largo cuando hay una condición de preparación explícita disponible. No uses la automatización del navegador para eludir un desafío o restricción de acceso.
Paso 4: Limpiar y Validar los Datos Extraídos
Un rastreador puede finalizar con éxito mientras produce registros incompletos. Añade comprobaciones que fallen el trabajo o enrole registros en un conjunto de revisión cuando faltan campos requeridos:
Requiere un identificador o URL de origen estable.
Rechaza un registro de producto sin un título; mantén el precio como nulo si la página no proporciona uno.
Normaliza el espacio en blanco, la moneda y las URL relativas en un paso de transformación separado.
Deduplica en una clave de negocio, como la URL canónica del producto, no solo en el título.
Guarda fixtures HTML en bruto o representativas para pruebas de regresión del parser.
Sigue las URL descubiertas, las URL procesadas, los registros válidos y las solicitudes fallidas por separado.
La guía de almacenamiento de Crawlee documenta conjuntos de datos y almacenamiento clave-valor. Mantén grandes artefactos fuera de una fila relacional; almacena una referencia o clave de objeto en su lugar.
Paso 5: Evaluar el Rendimiento y la Fiabilidad
No estimes el rendimiento de producción a partir de la ejecución de un tutorial de tres páginas. Evalúa el mismo conjunto de URL autorizadas en la misma máquina y registra:
Medición
Por qué es importante
Registros válidos / páginas solicitadas
Separa la calidad de extracción del éxito HTTP
Latencia media y p95 de las páginas
Captura páginas lentas sin ocultar el extremo
Solicitudes por minuto
Mide el rendimiento bajo la concurrencia elegida
CPU y memoria máxima
Los rastreadores de navegador pueden tener un perfil de recurso diferente
Cantidades de reintentos y fallos
Revela objetivos frágiles o problemas de configuración
Bytes de salida y crecimiento del almacenamiento
Importa para trabajos prolongados o pesados en artefactos
Ejecuta un pequeño piloto, inspecta muestras manualmente, luego aumenta el volumen gradualmente. Establece un conteo máximo de solicitudes, concurrencia por dominio y tiempo de espera del trabajo antes de pasar a la ejecución programada.
Paso 6: Desplegar un Trabajo de Python Crawlee
Para un rastreo HTTP programado pequeño, empaquete el entorno de Python y la salida de almacenamiento, luego ejecute el script desde un contenedor o programador de trabajos. Una ejecución con respaldo de navegador también necesita binarios de navegador compatibles y dependencias del sistema; inclúyelos en la imagen y prueba la imagen base exacta de implementación.
Planea para reinicios de procesos e idempotencia. Asigna un ID a cada ejecución, preserva las URL de origen y las marcas de tiempo, y haz que las escrituras en el flujo descendente sean seguras para repetir. Si un rastreo debe reanudar desde una cola persistida después de un fallo, prueba ese comportamiento con la configuración de almacenamiento que pretendes implementar en lugar de asumir que una ejecución local prueba la persistencia en la nube.
Cuándo usar Crawlee para Python vs una API de rastreo administrada
Crawlee es una opción sólida cuando necesitas lógica de extracción personalizada, deseas control sobre la programación y el almacenamiento, y puedes operar el rastreador tú mismo. Una API de rastreo administrada puede reducir el trabajo de infraestructura de navegador y devolver contenido de página normalizado, pero aún posees la política de rastreo, la validación de datos y el procesamiento en el flujo descendente.
Nstdata Crawl describe el rastreo a nivel de URL o sitio con límites de página configurables y salidas como Markdown y HTML. Es útil cuando la aplicación necesita contenido de página en lugar de una base de código de rastreador personalizada. No es la herramienta adecuada para cada tarea: usa Crawlee cuando el control personalizado o la autoalojamiento sea un requisito; usa un servicio administrado cuando reducir las operaciones de navegador y la infraestructura de rastreo sea más valioso. Las guías relacionadas de Nstdata cubren páginas renderizadas con JavaScript en Python, raspado sin cabeza para sitios web dinámicos, y recolección de datos automatizada.
Conclusión
Crawlee para Python proporciona a un proyecto de Python un bucle de rastreo reutilizable: las solicitudes entran en una cola, los controladores extraen registros y un conjunto de datos almacena la salida. Comienza con un rastreador HTTP, haz explícito el alcance de URL permitido, y añade Playwright solo cuando sea necesario el renderizado. Un límite de páginas y controles de calidad de datos son más útiles que un gran rastreo que almacena silenciosamente filas incompletas.
Experimenta Nstdata — Comienza tu prueba gratuita hoy
Si prefieres un servicio administrado para la recolección de URL y sitios permitidos, revisa las entradas y salidas documentadas de Nstdata Crawl antes de un concepto de prueba.
Crawlee es de código abierto y su documentación lo describe como gratuito. Aún pagas por la computación, el tiempo de ejecución del navegador, el almacenamiento y la infraestructura que operas.
P: ¿Puede Crawlee renderizar JavaScript?
Sí. Crawlee para Python incluye PlaywrightCrawler para páginas con respaldo de navegador. BeautifulSoupCrawler y ParselCrawler utilizan respuestas HTTP y no renderizan JavaScript.
P: ¿Es Crawlee mejor que Scrapy?
Depende del proyecto. Crawlee ofrece una cola integrada, controladores y un flujo de trabajo de almacenamiento con una opción de rastreador HTTP a Playwright; Scrapy es un marco maduro con su propio programador, middleware y tuberías. Compara las integraciones que tu equipo ya opera.
P: ¿Evita Crawlee automáticamente las URL duplicadas?
Su cola de solicitudes deduplica las solicitudes utilizando una clave única derivada de la URL por defecto. Aún debes canonizar las URL y deduplicar los registros según el identificador comercial que tu aplicación necesita.
P: ¿Cómo exporto datos de Crawlee?
El patrón de inicio rápido almacena registros en un conjunto de datos bajo almacenamiento local. La API del rastreador también proporciona un método de exportación, como crawler.export_data(path="books.csv"), para formatos soportados por la versión instalada.
Ivy Lin
Oct. 19th 2026
Rastrea sitios web completos con una sola solicitud API
99,8% de éxito con renderizado JavaScript
Obtén datos limpios, listos para LLM, en múltiples formatos
Convierte cualquier sitio web en Markdown, HTML, JSON, enlaces, PDF y más, sin gestionar infraestructura de rastreo.