importar subproceso import sys print(“📦 Instalando dependencias del sistema…”) subprocess.run([‘apt-get’, ‘update’, ‘-qq’]capture_output=Verdadero) subproceso.run([‘apt-get’, ‘install’, ‘-y’, ‘-qq’,
‘libnss3’, ‘libnspr4’, ‘libatk1.0-0’, ‘libatk-bridge2.0-0’,
‘libcups2’, ‘libdrm2’, ‘libxkbcommon0’, ‘libxcomposite1’,
‘libxdamage1’, ‘libxfixes3’, ‘libxrandr2’, ‘libgbm1’,
‘libasound2’, ‘libpango-1.0-0’, ‘libcairo2’]capture_output=True) print(“✅ Dependencias del sistema instaladas!”) print(“\n📦 Instalando paquetes de Python…”) subprocess.run([sys.executable, ‘-m’, ‘pip’, ‘install’, ‘-U’, ‘crawl4ai’, ‘nest_asyncio’, ‘pydantic’, ‘-q’]) print(“✅ ¡Paquetes de Python instalados!”) print(“\n📦 Instalando los navegadores Playwright (esto puede tardar un minuto)…”) subprocess.run([sys.executable, ‘-m’, ‘playwright’, ‘install’, ‘chromium’]capture_output=Verdadero) subproceso.run([sys.executable, ‘-m’, ‘playwright’, ‘install-deps’, ‘chromium’]capture_output=True) print(“✅ Navegadores Playwright instalados!”) import nest_asyncio nest_asyncio.apply() import asyncio import json desde escribir lista de importación, opcional desde pydantic import BaseModel, campo print(“\n” + “=”*60) print(“¡INSTALACIÓN COMPLETA! ¡Listo para rastrear!”) print(“=”*60) print(“\n” + “=”*60) print(“📖 PARTE 2: RASTREO BÁSICO”) print(“=”*60) from crawl4ai import AsyncWebCrawler, BrowserConfig, CrawlerRunConfig, CacheMode async def basic_crawl(): “””El rastreo más simple posible: buscar una página web y obtener rebajas.””” print(“\n🔍 Ejecutando rastreo básico en example.com…”) async with AsyncWebCrawler() as rastreador: resultado = await rastreador.arun(url=”https://example.com”) print(f”\n✅ Rastreo exitoso: {result.success}”) print(f”📄 Título: {result.metadata.get(‘title’, ‘N/A’)}”) print(f”📝 Longitud de la reducción: {len(result.markdown.raw_markdown)} caracteres”) print(f”\n— Primeros 500 caracteres de rebajas —“) print(resultado.markdown.raw_markdown[:500]) return result resultado = asyncio.run(basic_crawl()) print(“\n” + “=”*60) print(“⚙️ PARTE 3: RASTREO CONFIGURADO”) print(“=”*60) async def configurado_crawl(): “””Rastreo con configuraciones personalizadas de navegador y rastreador.””” print(“\n🔧 Ejecución de rastreo configurado con configuraciones personalizadas…”) browser_config = BrowserConfig( headless=True, detallado=True, viewport_width=1920, viewport_height=1080, user_agent=”Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36″ ) run_config = CrawlerRunConfig( cache_mode=CacheMode.BYPASS, word_count_threshold=10, page_timeout=30000, wait_until=”networkidle”, verbose=True ) async con AsyncWebCrawler(config=browser_config) como rastreador: resultado = await crawler.arun( url=”https://httpbin.org/html”, config=run_config ) print(f”\n✅ Éxito: {result.success}”) print(f”📊 Código de estado: {result.status_code}”) print(f”\n— Vista previa de contenido —“) print(result.markdown.raw_markdown[:400]) devolver resultado resultado = asyncio.run(configured_crawl()) print(“\n” + “=”*60) print(“📝 PARTE 4: GENERACIÓN DE MARKDOWN”) print(“=”*60) from crawl4ai.content_filter_strategy import PruningContentFilter, BM25ContentFilter from crawl4ai.markdown_ generate_strategy import DefaultMarkdownGenerator async def markdown_generación_demo(): “””Demuestra rebajas sin formato versus ajustadas con filtrado de contenido.””” print(“\n🎯 Demostrando estrategias de generación de rebajas…”) browser_config = BrowserConfig(headless=True, detallado=False) run_config = CrawlerRunConfig( cache_mode=CacheMode.BYPASS, markdown_generator=DefaultMarkdownGenerator( content_filter=PruningContentFilter( umbral=0.4, umbral_type=”fixed”, min_word_threshold=20 ) ) ) async con AsyncWebCrawler(config=browser_config) como rastreador: resultado = espera rastreador.arun( url=”https://en.wikipedia.org/wiki/Web_scraping”, config=run_config ) raw_len = len(result.markdown.raw_markdown) fit_len = len(result.markdown.fit_markdown) if resultado.markdown.fit_markdown else 0 print(f”\n📊 Comparación de Markdown:”) print(f” Raw Markdown: {raw_len:,} caracteres”) print(f” Fit Markdown: {fit_len:,} caracteres”) print(f” Reducción: {((raw_len – fit_len) / raw_len * 100):.1f}%”) print(f”\n— Ajustar vista previa de Markdown (primeros 600 caracteres) —“) print(result.markdown.fit_markdown[:600] si result.markdown.fit_markdown else “N/A”) devuelve el resultado resultado = asyncio.run(markdown_generación_demo())
‘libnss3’, ‘libnspr4’, ‘libatk1.0-0’, ‘libatk-bridge2.0-0’,
‘libcups2’, ‘libdrm2’, ‘libxkbcommon0’, ‘libxcomposite1’,
‘libxdamage1’, ‘libxfixes3’, ‘libxrandr2’, ‘libgbm1’,
‘libasound2’, ‘libpango-1.0-0’, ‘libcairo2’]capture_output=True) print(“✅ Dependencias del sistema instaladas!”) print(“\n📦 Instalando paquetes de Python…”) subprocess.run([sys.executable, ‘-m’, ‘pip’, ‘install’, ‘-U’, ‘crawl4ai’, ‘nest_asyncio’, ‘pydantic’, ‘-q’]) print(“✅ ¡Paquetes de Python instalados!”) print(“\n📦 Instalando los navegadores Playwright (esto puede tardar un minuto)…”) subprocess.run([sys.executable, ‘-m’, ‘playwright’, ‘install’, ‘chromium’]capture_output=Verdadero) subproceso.run([sys.executable, ‘-m’, ‘playwright’, ‘install-deps’, ‘chromium’]capture_output=True) print(“✅ Navegadores Playwright instalados!”) import nest_asyncio nest_asyncio.apply() import asyncio import json desde escribir lista de importación, opcional desde pydantic import BaseModel, campo print(“\n” + “=”*60) print(“¡INSTALACIÓN COMPLETA! ¡Listo para rastrear!”) print(“=”*60) print(“\n” + “=”*60) print(“📖 PARTE 2: RASTREO BÁSICO”) print(“=”*60) from crawl4ai import AsyncWebCrawler, BrowserConfig, CrawlerRunConfig, CacheMode async def basic_crawl(): “””El rastreo más simple posible: buscar una página web y obtener rebajas.””” print(“\n🔍 Ejecutando rastreo básico en example.com…”) async with AsyncWebCrawler() as rastreador: resultado = await rastreador.arun(url=”https://example.com”) print(f”\n✅ Rastreo exitoso: {result.success}”) print(f”📄 Título: {result.metadata.get(‘title’, ‘N/A’)}”) print(f”📝 Longitud de la reducción: {len(result.markdown.raw_markdown)} caracteres”) print(f”\n— Primeros 500 caracteres de rebajas —“) print(resultado.markdown.raw_markdown[:500]) return result resultado = asyncio.run(basic_crawl()) print(“\n” + “=”*60) print(“⚙️ PARTE 3: RASTREO CONFIGURADO”) print(“=”*60) async def configurado_crawl(): “””Rastreo con configuraciones personalizadas de navegador y rastreador.””” print(“\n🔧 Ejecución de rastreo configurado con configuraciones personalizadas…”) browser_config = BrowserConfig( headless=True, detallado=True, viewport_width=1920, viewport_height=1080, user_agent=”Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36″ ) run_config = CrawlerRunConfig( cache_mode=CacheMode.BYPASS, word_count_threshold=10, page_timeout=30000, wait_until=”networkidle”, verbose=True ) async con AsyncWebCrawler(config=browser_config) como rastreador: resultado = await crawler.arun( url=”https://httpbin.org/html”, config=run_config ) print(f”\n✅ Éxito: {result.success}”) print(f”📊 Código de estado: {result.status_code}”) print(f”\n— Vista previa de contenido —“) print(result.markdown.raw_markdown[:400]) devolver resultado resultado = asyncio.run(configured_crawl()) print(“\n” + “=”*60) print(“📝 PARTE 4: GENERACIÓN DE MARKDOWN”) print(“=”*60) from crawl4ai.content_filter_strategy import PruningContentFilter, BM25ContentFilter from crawl4ai.markdown_ generate_strategy import DefaultMarkdownGenerator async def markdown_generación_demo(): “””Demuestra rebajas sin formato versus ajustadas con filtrado de contenido.””” print(“\n🎯 Demostrando estrategias de generación de rebajas…”) browser_config = BrowserConfig(headless=True, detallado=False) run_config = CrawlerRunConfig( cache_mode=CacheMode.BYPASS, markdown_generator=DefaultMarkdownGenerator( content_filter=PruningContentFilter( umbral=0.4, umbral_type=”fixed”, min_word_threshold=20 ) ) ) async con AsyncWebCrawler(config=browser_config) como rastreador: resultado = espera rastreador.arun( url=”https://en.wikipedia.org/wiki/Web_scraping”, config=run_config ) raw_len = len(result.markdown.raw_markdown) fit_len = len(result.markdown.fit_markdown) if resultado.markdown.fit_markdown else 0 print(f”\n📊 Comparación de Markdown:”) print(f” Raw Markdown: {raw_len:,} caracteres”) print(f” Fit Markdown: {fit_len:,} caracteres”) print(f” Reducción: {((raw_len – fit_len) / raw_len * 100):.1f}%”) print(f”\n— Ajustar vista previa de Markdown (primeros 600 caracteres) —“) print(result.markdown.fit_markdown[:600] si result.markdown.fit_markdown else “N/A”) devuelve el resultado resultado = asyncio.run(markdown_generación_demo())