Volver al blog

Raspado web con LLaMA 3: Convierte cualquier sitio web en JSON estructurado (Guía 2025)

Emily Chen
Emily Chen

Advanced Data Extraction Specialist

11-Sep-2025

Introducción: La evolución del web scraping con IA

El web scraping, la extracción automatizada de datos de sitios web, ha sido durante mucho tiempo una piedra angular para empresas e investigadores que buscan reunir información, monitorear mercados y construir conjuntos de datos. Sin embargo, el panorama del web scraping está en constante evolución, principalmente debido a las medidas anti-bot cada vez más sofisticadas que implementan los sitios web. Los métodos de scraping tradicionales, que dependen de selectores estáticos como XPath o CSS, son notoriamente frágiles. Cambios menores en el diseño del sitio web o actualizaciones en las defensas anti-bot pueden hacer que toda la infraestructura de scraping quede obsoleta, lo que conlleva un significativo costo de mantenimiento y pérdida de datos.

La llegada de modelos de lenguaje grande (LLMs) como LLaMA 3 de Meta marca un cambio pivotal en este paradigma. LLaMA 3, con su notable capacidad para entender y procesar el lenguaje natural, ofrece un enfoque más resiliente e inteligente para la extracción de datos. A diferencia de los scrapers convencionales que operan con reglas rígidas, LLaMA 3 puede interpretar el significado contextual del contenido web, al igual que lo haría un humano. Esta capacidad le permite adaptarse a las variaciones en la estructura del sitio web y extraer información relevante incluso cuando los diseños cambian, lo que lo convierte en una herramienta invaluable para los desafíos modernos del web scraping.

Esta guía integral de 2025 se adentra en el aprovechamiento de LLaMA 3 para un web scraping avanzado, transformando HTML crudo en JSON limpio y estructurado. Exploraremos los principios fundamentales, los pasos de implementación práctica y, crucialmente, cómo superar los desafíos anti-bot más formidables integrando soluciones de vanguardia como Scrapeless Scraping Browser. Al final de esta guía, tendrás el conocimiento para construir scrapers web robustos, impulsados por IA, que sean tanto eficientes como resilientes ante las defensas web contemporáneas.

Por qué LLaMA 3 es un cambio de juego para el web scraping

LLaMA 3, lanzado en abril de 2024, es el poderoso modelo de lenguaje grande de peso abierto de Meta, disponible en varios tamaños desde 8B hasta 405B parámetros. Sus iteraciones posteriores (LLaMA 3.1, 3.2 y 3.3) han traído mejoras significativas en desempeño, comprensión contextual y capacidades de razonamiento. Estos avances hacen que LLaMA 3 sea particularmente adecuado para el web scraping por varias razones convincentes:

1. Comprensión contextual y extracción semántica

Los scrapers web tradicionales son inherentemente frágiles porque dependen de los elementos estructurales precisos de una página web. Si un nombre de clase div cambia o la posición de un elemento se mueve, el scraper se rompe. Sin embargo, LLaMA 3 opera en un nivel de abstracción más alto. Puede entender el significado del contenido, independientemente de su estructura HTML subyacente. Por ejemplo, puede identificar un título de producto, precio o descripción basándose en pistas semánticas, incluso si las etiquetas HTML que los rodean varían entre diferentes páginas o después de un rediseño del sitio web. Esta comprensión contextual reduce drásticamente la fragilidad de los scrapers y la necesidad de un mantenimiento constante.

2. Mayor resiliencia a los cambios del sitio web

Los sitios web son entidades dinámicas, con actualizaciones frecuentes en su diseño, contenido y código subyacente. Para los scrapers tradicionales, cada actualización puede resultar en un cambio que rompa el funcionamiento. La capacidad de LLaMA 3 para interpretar el contenido de manera semántica significa que es mucho más resiliente a estos cambios. Puede seguir extrayendo datos con precisión incluso si los elementos se reordenan, se añaden nuevas secciones o se realizan ajustes estilísticos menores. Esta resiliencia se traduce directamente en menores costos operativos y flujos de datos más consistentes.

3. Manejo de contenido dinámico y páginas renderizadas por JavaScript

Los sitios web modernos dependen en gran medida de JavaScript para renderizar contenido de manera dinámica. Esto plantea un desafío significativo para los scrapers basados en solicitudes HTTP simples. Si bien los navegadores sin cabeza como Selenium pueden ejecutar JavaScript, extraer datos específicos del DOM renderizado todavía requiere selectores precisos. LLaMA 3, cuando se combina con un navegador sin cabeza, puede procesar el contenido HTML totalmente renderizado y extraer inteligentemente la información deseada, eludiendo las complejidades del renderizado de contenido dinámico y las interacciones complejas de JavaScript.

4. Eficiencia a través de la conversión a Markdown

El HTML crudo puede ser extremadamente verboso y contener una gran cantidad de información irrelevante (por ejemplo, scripts, estilos, elementos ocultos). Procesar tales grandes entradas con un LLM puede ser computacionalmente costoso y llevar a un uso más alto de tokens, aumentando los costos y los tiempos de procesamiento. Una técnica clave de optimización consiste en convertir el HTML a un formato más limpio y conciso como Markdown. Markdown reduce significativamente la cantidad de tokens mientras preserva el contenido y la estructura esenciales, haciendo que el procesamiento con LLM sea más eficiente, rápido y rentable. Esta reducción en el tamaño de la entrada también mejora la precisión del LLM al proporcionar una entrada más limpia y menos ruidosa.

5. Procesamiento de datos en el entorno y seguridad

Una de las ventajas críticas de utilizar un LLM local como LLaMA 3 (a través de Ollama) es que el procesamiento de datos ocurre dentro de tu propio entorno. Esto es particularmente crucial para manejar información sensible, ya que minimiza el riesgo de exposición de datos que podría ocurrir al enviar datos a API externas o servicios en la nube para su procesamiento. Mantener los datos raspados y el LLM dentro de tu infraestructura proporciona un mayor control y mejora la seguridad y privacidad de los datos.

Requisitos Previos para la Raspado Potenciado por LLaMA 3

Antes de embarcarte en tu viaje de raspado web con LLaMA 3, asegúrate de tener los siguientes componentes y conocimientos básicos en su lugar:

  • Python 3: El lenguaje de programación principal para esta guía. Si bien un conocimiento básico de Python es suficiente, la familiaridad con los conceptos de raspado web será beneficiosa.
  • Sistema Operativo Compatible: LLaMA 3 a través de Ollama es compatible con macOS (macOS 11 Big Sur o posterior), Linux y Windows (Windows 10 o posterior).
  • Recursos de Hardware Adecuados: Los requisitos de recursos dependen del tamaño del modelo LLaMA 3 que elijas. Los modelos más pequeños (por ejemplo, llama3.1:8b) son ligeros y pueden ejecutarse en la mayoría de las laptops modernas (aproximadamente 4.9 GB de espacio en disco y 6-8 GB de RAM). Los modelos más grandes (por ejemplo, 70B o 405B) requieren significativamente más memoria y poder de computación, adecuados para máquinas más robustas o servidores dedicados.

Configurando tu Entorno LLaMA 3 con Ollama

Ollama es una herramienta indispensable que simplifica el proceso de descarga, configuración y ejecución de grandes modelos de lenguaje localmente. Abstrae gran parte de la complejidad asociada con el despliegue de LLM, permitiéndote concentrarte en la extracción de datos.

1. Instalando Ollama

Para comenzar a utilizar Ollama:

  1. Visita el sitio web oficial de Ollama.
  2. Descarga e instala la aplicación diseñada para tu sistema operativo.
  3. Paso Crucial: Durante el proceso de instalación, Ollama puede pedirte que ejecutes un comando en la terminal. No ejecutes este comando aún. Primero seleccionaremos la versión del modelo LLaMA que se alinee con las capacidades de tu hardware y tu caso de uso específico.

2. Eligiendo tu Modelo LLaMA

Seleccionar el modelo LLaMA adecuado es vital para equilibrar rendimiento y eficiencia. Navega por la biblioteca de modelos de Ollama para identificar la versión que mejor se ajuste a las especificaciones de tu sistema y las necesidades de tu proyecto.

Para la mayoría de los usuarios, llama3.1:8b ofrece un equilibrio óptimo. Es ligero, altamente capaz y requiere aproximadamente 4.9 GB de espacio en disco y 6-8 GB de RAM, lo que lo hace adecuado para su ejecución en la mayoría de las laptops contemporáneas. Si tu máquina cuenta con más potencia de procesamiento y necesitas capacidades de razonamiento mejoradas o una ventana de contexto más grande, considera escalar a modelos más extensos como 70B o incluso 405B. Ten en cuenta que estos modelos más grandes requieren significativamente más memoria y recursos computacionales.

3. Descargando y Ejecutando el Modelo

Una vez que hayas elegido tu modelo, puedes descargarlo e inicializarlo. Por ejemplo, para descargar y ejecutar el modelo llama3.1:8b, ejecuta el siguiente comando en tu terminal:

bash Copy
ollama run llama3.1:8b

Ollama descargará el modelo. Una vez que la descarga sea exitosa, se te presentará un aviso interactivo simple:

Copy
>>> Envía un mensaje (/? para ayuda)

Para verificar que el modelo está correctamente instalado y es receptivo, puedes enviar una consulta rápida:

Copy
>>> ¿quién eres?
Soy LLaMA, *un asistente de IA desarrollado por Meta AI...*

Una respuesta similar a la anterior confirma que tu modelo LLaMA está correctamente configurado. Para salir del aviso interactivo, escribe /bye.

4. Iniciando el Servidor Ollama

Para que tu script de raspado web interactúe con LLaMA 3, el servidor Ollama debe estar ejecutándose en segundo plano. Abre una nueva ventana de terminal y ejecuta:

bash Copy
ollama serve

Este comando inicia una instancia local de Ollama, típicamente accesible en http://127.0.0.1:11434/. Es imperativo mantener abierta esta ventana de terminal, ya que el servidor debe permanecer activo para tus operaciones de raspado. Puedes confirmar el estado del servidor navegando a la URL en tu navegador web; deberías ver el mensaje "Ollama está en funcionamiento."

Construyendo un Raspador Web Potenciado por LLM: Un Flujo de Trabajo Multiescalonado

Construir un raspador web robusto, especialmente para sitios web complejos con contenido dinámico y estrictas protecciones anti-bots, requiere un enfoque sofisticado. Nuestro raspador potenciado por LLaMA emplea un inteligente flujo de trabajo multiescalonado diseñado para superar las limitaciones de los métodos tradicionales y maximizar la eficiencia de extracción de datos. Este flujo de trabajo es particularmente efectivo para objetivos desafiantes como sitios de comercio electrónico, que a menudo implementan defensas avanzadas.

Aquí hay un desglose del flujo de trabajo multiescalonado potenciado por IA:

  1. Automatización del Navegador: Utiliza un navegador sin cabeza (por ejemplo, Selenium) para cargar la página web objetivo, renderizar todo el contenido dinámico (JavaScript, llamadas AJAX) y simular interacciones similares a las humanas.
  2. Extracción de HTML: Una vez que la página se ha renderizado completamente, identifica y extrae el contenedor HTML específico que alberga los detalles del producto deseado o la información relevante. Este paso se centra en aislar la sección más pertinente de la página.
  3. Conversión a Markdown: Convierte el HTML extraído a un formato Markdown limpio y conciso. Esta optimización crucial reduce significativamente el número de tokens, haciendo que la entrada sea más eficiente para el LLM y mejorando la velocidad y precisión del procesamiento.
  4. Procesamiento del LLM: Emplea un prompt estructurado y cuidadosamente elaborado con LLaMA 3 para extraer datos JSON limpios y estructurados del contenido en Markdown. La comprensión contextual del LLM es fundamental aquí.
  5. Manejo de Salida: Almacena los datos JSON extraídos en un formato persistente (por ejemplo, un archivo JSON o una base de datos) para su uso posterior, análisis o integración en otros sistemas.

Este enfoque modular asegura que cada etapa esté optimizada para su tarea específica, contribuyendo a una solución de scraping altamente efectiva y resiliente. Aunque estos ejemplos utilizan principalmente Python por su simplicidad y su amplia adopción en ciencia de datos, se pueden lograr resultados similares con otros lenguajes de programación como JavaScript.

Paso 1 – Instalar Bibliotecas Requeridas

Comienza instalando las bibliotecas de Python necesarias. Abre tu terminal o símbolo del sistema y ejecuta el siguiente comando:

bash Copy
pip install requests selenium webdriver-manager markdownify

Vamos a entender brevemente el papel de cada biblioteca:

  • requests: Una biblioteca fundamental de Python para hacer solicitudes HTTP. Se utilizará para enviar llamadas API a tu instancia local de Ollama para el procesamiento del LLM.
  • selenium: Una herramienta poderosa para automatizar navegadores web. Es esencial para interactuar con sitios web que utilizan mucho JavaScript, renderizando contenido dinámico y simulando el comportamiento del usuario.
  • webdriver-manager: Simplifica la configuración de Selenium descargando y gestionando automáticamente la versión correcta de ChromeDriver (u otro controlador de navegador), eliminando la configuración manual.
  • markdownify: Una utilidad para convertir contenido HTML en Markdown, un paso crítico para optimizar la entrada del LLM.

Configurar un navegador sin cabeza con Selenium es el primer paso programático. Un navegador sin cabeza opera sin una interfaz gráfica de usuario, lo que lo hace eficiente para tareas automatizadas. El siguiente código en Python inicializa un navegador Chrome en modo sin cabeza:

python Copy
from selenium import webdriver  
from selenium.webdriver.chrome.service import Service  
from selenium.webdriver.chrome.options import Options  
from webdriver_manager.chrome import ChromeDriverManager  

options = Options()  
options.add_argument("--headless=new")  
options.add_argument("--no-sandbox")  # Requerido para algunos entornos  
options.add_argument("--disable-dev-shm-usage")  # Supera problemas de recursos limitados  
options.add_argument("--disable-gpu") # Aplicable solo a sistemas operativos Windows  
options.add_argument("--window-size=1920,1080") # Establece un tamaño de ventana consistente  
options.add_argument("--ignore-certificate-errors") # Ignora errores de certificado  
options.add_argument("--disable-extensions") # Desactiva extensiones  
options.add_argument("--disable-infobars") # Desactiva infobars  
options.add_argument("--disable-browser-side-navigation") # Desactiva la navegación lateral del navegador  
options.add_argument("--disable-features=VizDisplayCompositor") # Desactiva VizDisplayCompositor  
options.add_argument("--blink-settings=imagesEnabled=false") # Desactiva imágenes para una carga más rápida  

driver = webdriver.Chrome(  
    service=Service(ChromeDriverManager().install()),  
    options=options  
)  

Estas líneas options.add_argument son cruciales para configurar el navegador sin cabeza para un rendimiento de scraping óptimo y minimizar riesgos de detección. Desactivan varias características que a menudo son innecesarias para el scraping y pueden consumir recursos o revelar la automatización.

Paso 3 – Extraer el HTML del Producto

Una vez que el navegador sin cabeza está inicializado, el siguiente paso es navegar a la URL objetivo y extraer el contenido HTML relevante. Para sitios complejos como Amazon, los detalles del producto suelen ser renderizados dinámicamente y contenidos dentro de elementos HTML específicos. Usaremos WebDriverWait de Selenium para asegurarnos de que el elemento objetivo esté completamente cargado antes de intentar extraer su contenido.

python Copy
from selenium.webdriver.common.by import By  
from selenium.webdriver.support.ui import WebDriverWait  
from selenium.webdriver.support import expected_conditions as EC  

wait = WebDriverWait(driver, 15)  
product_container = wait.until(  
    EC.presence_of_element_located((By.ID, "ppd"))  
)  

# Extraer el HTML completo del contenedor del producto  
page_html = product_container.get_attribute("outerHTML")  

Este enfoque ofrece dos ventajas significativas:

  • Manejo de Contenido Dinámico: Espera explícitamente a que el contenido renderizado por JavaScript (como precios, calificaciones y disponibilidad) aparezca en la página, asegurando que captures la información completa y actualizada.
  • Extracción Dirigida: Al centrarse en un contenedor específico (por ejemplo, <div id="ppd"> para páginas de productos de Amazon), se extrae solo la sección relevante del HTML, ignorando efectivamente elementos adicionales como encabezados, pies de página, barras laterales y anuncios. Esto reduce la cantidad de datos procesados por el LLM, lo que lleva a una mejor eficiencia y precisión.

Paso 4 – Convertir HTML a Markdown

Como se discutió anteriormente, convertir el HTML extraído a Markdown es un paso crítico de optimización. El HTML sin procesar, especialmente de páginas web complejas y profundamente anidadas, es altamente ineficiente para que los LLMs lo procesen debido a su verbosidad y alto conteo de tokens. Markdown, siendo un formato de texto mucho más limpio y plano, reduce drásticamente el número de tokens mientras retiene el contenido y la estructura esenciales.

Para ilustrar el impacto, considere que el HTML típico de una página de producto de Amazon podría contener alrededor de 270,000 tokens. Sin embargo, la versión equivalente en Markdown puede ser tan concisa como ~11,000 tokens. Esta notable reducción del 96% ofrece beneficios substanciales:

  • Eficiencia de Costos: Menos tokens se traducen directamente en menores costos de API o computacionales, especialmente al usar servicios LLM de pago o al ejecutar modelos en hardware con recursos limitados.
  • Procesamiento Más Rápido: Un tamaño de entrada más pequeño significa que el LLM puede procesar los datos mucho más rápido, lo que lleva a tiempos de respuesta más rápidos para sus operaciones de scraping.
  • Mejora en la Precisión: Una entrada más limpia y menos ruidosa ayuda al LLM a centrarse en la información relevante, lo que lleva a una extracción de datos más precisa y exacta. Es menos probable que el modelo se distraiga con etiquetas o atributos HTML irrelevantes.

Así es como se puede realizar la conversión de HTML a Markdown en Python usando la biblioteca markdownify:

python Copy
from markdownify import markdownify as md

clean_text = md(page_html, heading_style="ATX")

El argumento heading_style="ATX" asegura que los encabezados de Markdown se generen utilizando el estilo ATX (por ejemplo, # Encabezado 1), que es generalmente bien entendido por los LLMs.

Paso 5 – Crear el Prompt de Extracción de Datos

El prompt que le proporciones al LLM es primordial para obtener una salida JSON estructurada y consistente. Un prompt bien diseñado guía al LLM para que entienda su papel, la tarea en cuestión y el formato exacto requerido para la salida. El siguiente prompt instruye a LLaMA 3 para actuar como un extractor de datos de productos de Amazon experto y devolver solo JSON válido con un esquema predefinido:

python Copy
PRODUCT_DATA_EXTRACTION_PROMPT: Final[str] = (
    "Eres un extractor de datos de productos de Amazon experto. Tu "
    "tarea es extraer datos de productos del contenido proporcionado. "
    "\n\nDevuelve SOLO JSON válido con EXACTAMENTE los siguientes "
    "campos y formatos:\n\n"\
    "{\n"
    "    'title': "string" - el título del producto,\n"
    "    'price': number - el precio actual (valor numérico "
    "solo),\n"
    "    'original_price': number o null - el precio original "
    "si está disponible,\n"
    "    'discount': number o null - el porcentaje de descuento "
    "si está disponible,\n"
    "    'rating': number o null - la calificación promedio (escala de 0-5),\n"
    "    'review_count': number o null - número total de "
    "reseñas,\n"
    "    'description': "string" - descripción principal del "
    "producto,\n"
    "    'features': ["string"] - lista de características en puntos,\n"
    "    'availability': "string" - estado de stock,\n"
    "    'asin': "string" - ID de Amazon de 10 caracteres\n"
    "}\n\nDevuelve SOLO el JSON sin ningún texto adicional."
)

Este prompt es altamente específico, dejando poco margen para la ambigüedad. Define:

  • Rol: "extractor de datos de productos de Amazon experto."
  • Tarea: "extraer datos de productos del contenido proporcionado."
  • Formato de Salida: Indica explícitamente que se debe devolver "SOLO JSON válido" y proporciona la estructura y los tipos de datos exactos para cada campo (por ejemplo, title como string, price como number, features como una lista de strings).
  • Restricción: "Devuelve SOLO el JSON sin ningún texto adicional." Esto es crucial para prevenir que el LLM genere relleno conversacional o explicaciones, asegurando una salida JSON limpia que pueda ser analizada directamente.

Paso 6 – Llamar a la API del LLM

Con tu servidor Ollama ejecutándose localmente, ahora puedes enviar el texto Markdown preparado y el prompt de extracción a tu instancia de LLaMA 3 a través de su API HTTP. La biblioteca requests en Python es ideal para este propósito.

python Copy
import requests
import json

response = requests.post(
    "http://localhost:11434/api/generate",
    json={
        "model": "llama3.1:8b",
        "prompt": f"{PRODUCT_DATA_EXTRACTION_PROMPT}\n{clean_text}",
        "stream": False,
        "format": "json",
        "options": {
            "temperature": 0.1,
            "num_ctx": 12000,
        },
        "timeout":250,
    }
)

raw_output = response.json()["response"].strip()
product_data = json.loads(raw_output)

Desglosemos los parámetros clave en la llamada a la API:

  • modelo: Especifica la versión del modelo LLaMA a utilizar (por ejemplo, llama3.1:8b).
  • prompt: Este es el prompt combinado, concatenando tu PRODUCT_DATA_EXTRACTION_PROMPT con el clean_text (contenido en Markdown) que el LLM necesita procesar.
  • stream: Configurado en False para recibir la respuesta completa después del procesamiento, en lugar de un flujo continuo de tokens. Esto es adecuado para el procesamiento por lotes de la extracción de datos.
  • formato: Crucialmente establecido en "json". Esto instruye a Ollama a formatear su salida como un objeto JSON, alineándose con nuestra salida de datos estructurada deseada.
  • opciones:
    • temperatura: Establecido en 0.1. Una temperatura más baja (más cerca de 0) hace que la salida del LLM sea más determinista y menos creativa, lo cual es ideal para la extracción de datos estructurados donde la consistencia es primordial.
    • num_ctx: Define la longitud máxima del contexto en tokens. El artículo original sugiere que 12,000 tokens son suficientes para la mayoría de las páginas de productos de Amazon. Es importante establecer este valor apropiadamente según la longitud esperada de tu contenido en Markdown. Si bien aumentar este valor permite manejar entradas más largas, también incrementa el uso de RAM y ralentiza el procesamiento. Solo aumenta el límite de contexto si tus páginas de productos son excepcionalmente largas o si tienes los recursos computacionales para soportarlo.
  • tiempo_de_espera: Establece el tiempo máximo en segundos para esperar la respuesta del LLM.

Después de recibir la respuesta, response.json()["response"].strip() extrae la cadena JSON cruda de la salida del LLM, y json.loads(raw_output) analiza esta cadena en un diccionario de Python, haciendo que los datos extraídos sean fácilmente accesibles.

Paso 7 – Guardar los Resultados

El paso final en el proceso de extracción de datos es guardar los datos estructurados del producto en un archivo persistente. El formato JSON es muy adecuado para esto, ya que es legible por humanos y fácilmente analizables por otras aplicaciones.

python Copy
with open("product_data.json", "w", encoding="utf-8") as f:
    json.dump(product_data, f, indent=4, ensure_ascii=False)

Este fragmento de código abre un archivo llamado product_data.json en modo de escritura ("w") con codificación UTF-8 para manejar varios caracteres. json.dump() escribe el diccionario product_data en este archivo. El argumento indent=4 asegura que la salida JSON esté bien formateada con una sangría de 4 espacios, haciéndola más legible, y ensure_ascii=False asegura que los caracteres no ASCII (como símbolos especiales o caracteres internacionales) se escriban directamente en lugar de ser escapados.

Paso 8: Ejecutar el Script

Para ejecutar tu scraper web completo potenciado por LLaMA, generalmente tendrás un bloque de ejecución principal que define la URL objetivo y llama a tu función de scraping. Aquí hay un ejemplo simplificado:

python Copy
if __name__ == "__main__":
    url = "<https://www.amazon.com/Black-Office-Chair-Computer-Adjustable/dp/B00FS3VJO>"
    # Llama a tu función para raspar y extraer datos del producto
    scrape_amazon_product(url)

En un escenario del mundo real, encapsularías los pasos desde la obtención de HTML hasta el guardado en JSON dentro de una función (por ejemplo, scrape_amazon_product) y luego llamarías a esta función con la URL del producto deseado.

Paso 9 – Ejemplo de Código Completo

Para una implementación completa y de extremo a extremo, aquí está el script de Python completo que combina todos los pasos discutidos:

python Copy
import json
import logging
import time
from typing import Final, Optional, Dict, Any

import requests
from markdownify import markdownify as html_to_md
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from webdriver_manager.chrome import ChromeDriverManager

# Configurar registro
logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s - %(levelname)s - %(message)s",
    handlers=[logging.StreamHandler()]
)

def initialize_web_driver(headless: bool = True) -> webdriver.Chrome:
    """Inicializa y devuelve una instancia de Chrome WebDriver configurada."""
    options = Options()
    options.add_argument("--headless=new")
    options.add_argument("--no-sandbox")  # Requerido para algunos entornos
    options.add_argument("--disable-dev-shm-usage")  # Supera problemas de recursos limitados
    options.add_argument("--disable-gpu") # Aplicable solo a Windows OS
    options.add_argument("--window-size=1920,1080") # Establece un tamaño de ventana consistente
    options.add_argument("--ignore-certificate-errors") # Ignorar errores de certificado
    options.add_argument("--disable-extensions") # Deshabilitar extensiones
    options.add_argument("--disable-infobars") # Deshabilitar infobars
    options.add_argument("--disable-browser-side-navigation") # Deshabilitar navegación lateral del navegador
    options.add_argument("--disable-features=VizDisplayCompositor") # Deshabilitar VizDisplayCompositor

options.add_argument("--blink-settings=imagesEnabled=false") # Desactivar imágenes para una carga más rápida

Copy
service = Service(ChromeDriverManager().install())
return webdriver.Chrome(service=service, options=options)

def fetch_product_container_html(product_url: str) -> Optional[str]:
"""Recuperar el contenido HTML del contenedor de detalles del producto de Amazon."""
driver = initialize_web_driver()
try:
logging.info(f"Accediendo a la página del producto: {product_url}")
driver.set_page_load_timeout(15)
driver.get(product_url)

Copy
    # Esperar a que aparezca el contenedor del producto
    wait = WebDriverWait(driver, 5)
    product_container = wait.until(
        EC.presence_of_element_located((By.ID, "ppd"))
    )
    return product_container.get_attribute("outerHTML")
except Exception as e:
    logging.error(f"Error al recuperar los detalles del producto: {str(e)}")
    return None
finally:
    driver.quit()

def extract_product_data_via_llm(markdown_content: str) -> Optional[Dict[str, Any]]:
"""Extraer datos estructurados del producto del texto markdown utilizando la API LLM."""
try:
response = requests.post(
LLM_API_CONFIG["endpoint"],
json={
"model": LLM_API_CONFIG["model"],
"prompt": f"{PRODUCT_DATA_EXTRACTION_PROMPT}\n{markdown_content}",
"stream": LLM_API_CONFIG["stream"],
"format": LLM_API_CONFIG["format"],
"options": LLM_API_CONFIG["options"],
"timeout": LLM_API_CONFIG["timeout_seconds"],
}
)
response.raise_for_status() # Lanza HTTPError para respuestas malas (4xx o 5xx)
raw_output = response.json()["response"].strip()
return json.loads(raw_output)
except requests.exceptions.RequestException as e:
logging.error(f"La solicitud a la API LLM falló: {e}")
return None
except json.JSONDecodeError as e:
logging.error(f"Falló al decodificar JSON de la respuesta de LLM: {e}")
return None

def scrape_amazon_product(url: str) -> None:
"""Orquesta el proceso de scraping y extracción de datos para una página de producto de Amazon."""
logging.info(f"Iniciando el proceso de scraping para: {url}")

Copy
# Paso 1: Obtener contenido HTML
html_content = fetch_product_container_html(url)
if not html_content:
    logging.error("No se pudo obtener el contenido HTML. Saliendo.")
    return

# Paso 2: Convertir HTML a Markdown
markdown_content = html_to_md(html_content, heading_style="ATX")
logging.info("HTML convertido a Markdown.")

# Paso 3: Extraer datos a través de LLM
product_data = extract_product_data_via_llm(markdown_content)
if not product_data:
    logging.error("No se pudo extraer datos del producto a través de LLM. Saliendo.")
    return

# Paso 4: Guardar resultados
output_filename = "product_data.json"
try:
    with open(output_filename, "w", encoding="utf-8") as f:
        json.dump(product_data, f, indent=4, ensure_ascii=False)
    logging.info(f"Datos del producto guardados exitosamente en {output_filename}")
except IOError as e:
    logging.error(f"No se pudo guardar los datos del producto en el archivo: {e}")

Constantes de configuración

LLM_API_CONFIG: Final[Dict[str, Any]] = {
"endpoint": "http://localhost:11434/api/generate",
"model": "llama3.1:8b",
"temperature": 0.1,
"num_ctx": 12000,
"stream": False,
"format": "json",
"timeout_seconds": 220,
}

DEFAULT_PRODUCT_DATA: Final[Dict[str, Any]] = {
"title": "",
"price": 0.0,
"original_price": None,
"discount": None,
"rating": None,
"review_count": None,
"description": "",
"features": [],
"availability": "",
"asin": "",
}

PRODUCT_DATA_EXTRACTION_PROMPT: Final[str] = (
"Eres un extractor de datos de productos de Amazon experto. Tu "
"tarea es extraer datos de productos del contenido proporcionado. "
"\n\nDevuelve SOLO JSON válido con EXACTAMENTE los siguientes "
"campos y formatos:\n\n"
"{\n"
" 'title': "cadena" - el título del producto,\n"
" 'price': número - el precio actual (valor numérico "
"solo),\n"
" 'original_price': número o null - el precio original "
"si está disponible,\n"
" 'discount': número o null - el porcentaje de descuento "
"si está disponible,\n"
" 'rating': número o null - la calificación promedio (escala de 0-5),\n"
" 'review_count': número o null - total de "
"reseñas,\n"
" 'description': "cadena" - descripción principal del "
"producto,\n"
" 'features': ["cadena"] - lista de características en viñetas,\n"
" 'availability': "cadena" - estado de stock,\n"
" 'asin': "cadena" - ID de Amazon de 10 caracteres"\n"
"}\n\nDevuelve SOLO el JSON sin ningún texto adicional."
)

if name == "main":
url = "https://www.amazon.com/Black-Office-Chair-Computer-Adjustable/dp/B00FS3VJO"
scrape_amazon_product(url)

Copy
## Superando Medidas Antibots con Navegador de Scraping sin Restricciones
La recopilación de datos web, especialmente a gran escala, es una batalla constante contra sofisticados sistemas anti-bots. Los sitios web emplean diversas técnicas para detectar y bloquear solicitudes automatizadas, con el objetivo de proteger sus datos e infraestructura. Estas medidas incluyen:

*   **Bloqueo de IP:** Identificación y lista negra de direcciones IP que exhiben comportamientos sospechosos (por ejemplo, demasiadas solicitudes de una sola IP en un corto período).
*   **CAPTCHAs:** Presentar desafíos (por ejemplo, reCAPTCHA, hCaptcha) que son fáciles de resolver para los humanos pero difíciles para los bots automatizados.
*   **Análisis de User-Agent:** Detección de User-Agents que no son de navegador o que están desactualizados, lo que puede indicar un cliente automatizado.
*   **Huella del Navegador:** Análisis de características únicas de un navegador (por ejemplo, complementos instalados, resolución de pantalla, fuentes) para identificar y bloquear herramientas automatizadas como la configuración predeterminada de Selenium.
*   **Limitación de Tasa:** Restricción en el número de solicitudes de una sola fuente durante un período específico.
*   **Trampas:** Enlaces o elementos ocultos diseñados para atrapar bots que siguen ciegamente todos los enlaces en una página.
*   **Análisis Conductual:** Monitoreo de movimientos del ratón, patrones de desplazamiento y velocidades de escritura para diferenciar entre interacciones humanas y automatizadas.

Si bien el enfoque de LLaMA 3 mejora la resiliencia al comprender el contenido de manera contextual, no elude inherentemente estas defensas anti-bots a bajo nivel. Aquí es donde una herramienta especializada como **Scrapeless Scraping Browser** se vuelve indispensable. A diferencia de los navegadores sin cabeza de uso general, Scrapeless Scraping Browser está diseñado específicamente para imitar el comportamiento de navegación humano y eludir una amplia gama de protecciones anti-bots, lo que lo convierte en una opción superior para la recopilación de datos web robusta.

### ¿Por qué elegir Scrapeless Scraping Browser en lugar de la oferta de Bright Data?

Mientras que Bright Data ofrece un 

Scraping Browser, Scrapeless proporciona una solución más centrada en los desarrolladores y flexible que es particularmente adecuada para flujos de trabajo de scraping impulsados por IA. Aquí te explicamos por qué Scrapeless Scraping Browser es la elección recomendada:

*   **Personalización Avanzada de Huellas:** Scrapeless ofrece una profunda personalización de las huellas del navegador, incluyendo User-Agent, características del dispositivo y otros parámetros. Esto te permite crear perfiles de navegador altamente realistas que son virtualmente indistinguibles de los de usuarios reales, reduciendo significativamente el riesgo de detección.
*   **Red de Proxy Distribuida Globalmente:** Cuenta con una red de proxy distribuida globalmente que te permite enrutar tus solicitudes a través de una vasta cantidad de IPs residenciales y móviles. Esto elude efectivamente el bloqueo basado en IP y la limitación de tasa, permitiéndote recopilar datos a gran escala sin ser detectado.
*   **Sigilo y Evasión Impulsados por IA:** Scrapeless Scraping Browser está construido pensando en los desarrolladores de IA. Incorpora soporte para modo de sigilo dinámico y otras técnicas de evasión basadas en IA que se adaptan a las medidas anti-bots del sitio web objetivo en tiempo real. Este enfoque proactivo asegura una tasa de éxito más alta para tus operaciones de scraping.
*   **Integración Sin Problemas con Flujos de Trabajo de IA:** Scrapeless está diseñado para una fácil integración con flujos de trabajo basados en IA y LLM. Su API es intuitiva y está bien documentada, lo que facilita su incorporación en tus scripts de Python y otras herramientas de automatización. Esta integración fluida es crucial para construir soluciones de scraping impulsadas por IA eficientes y escalables.
*   **Rentabilidad y Flexibilidad:** Scrapeless ofrece un modelo de precios más flexible y a menudo más rentable en comparación con soluciones centradas en empresas como Bright Data. Esto lo convierte en una opción accesible pero poderosa para desarrolladores individuales, investigadores y pequeñas y medianas empresas.

Al combinar la comprensión contextual de LLaMA 3 con las avanzadas capacidades de evasión de bots del Scrapeless Scraping Browser, puedes construir una solución de recopilación de datos web verdaderamente formidable que sea tanto inteligente como resistente.

## Pasos Siguientes y Soluciones Avanzadas

Una vez que hayas dominado los fundamentos del scraping web impulsado por LLaMA 3, puedes ampliar las capacidades de tu scraper y explorar implementaciones más avanzadas. Aquí hay algunas mejoras y soluciones alternativas a considerar:

*   **Haz que el Script Sea Reutilizable:** Mejora tu script para aceptar la URL objetivo y la solicitud de extracción de datos como argumentos de línea de comandos. Esto hará que tu scraper sea más flexible y reutilizable para diferentes sitios web y tareas de extracción de datos.
*   **Protege Tus Credenciales:** Si estás utilizando un servicio comercial como Scrapeless Scraping Browser, es crucial manejar tus claves API y credenciales de manera segura. Almacénalas en un archivo `.env` y utiliza una biblioteca como `python-dotenv` para cargarlas en tu script, evitando la codificación de información sensible en tu código fuente.
*   **Implementar soporte para múltiples páginas:** Para sitios web con contenido paginado (por ejemplo, resultados de búsqueda de comercio electrónico, archivos de noticias), implemente lógica para rastrear a través de múltiples páginas. Esto generalmente implica identificar el botón "siguiente página" o el patrón de URL y iterar a través de las páginas hasta que se recopile toda la información deseada.
*   **Raspar una gama más amplia de sitios web:** Aproveche las potentes características de anti-detección de Scrapeless Scraping Browser para raspar otras plataformas complejas de comercio electrónico, sitios de redes sociales y aplicaciones web ricas en datos.
*   **Extraer datos de los servicios de Google:** Construya rasparadores dedicados para servicios de Google como Google Flights, Google Search y Google Trends. Alternativamente, para resultados de motores de búsqueda, considere utilizar una API SERP especializada, que puede proporcionar datos estructurados listos para usar de todos los principales motores de búsqueda, ahorrándole el esfuerzo de construir y mantener su propio raspador.

Si prefiere soluciones administradas o desea explorar otros métodos impulsados por LLM, las siguientes opciones también pueden ser adecuadas:

*   **Raspado con Gemini:** Explore los modelos Gemini de Google para capacidades similares de extracción de datos impulsadas por IA.
*   **Raspado con Perplexity:** Perplexity AI también ofrece potentes modelos de lenguaje que pueden adaptarse para tareas de raspado web.
*   **Construir un raspador de IA con Crawl4AI y DeepSeek:** Investigue otras herramientas y modelos de raspado de IA especializadas como Crawl4AI y DeepSeek, que están diseñadas para la extracción inteligente de datos.

## Conclusión: El futuro del raspado web es inteligente

Esta guía ha proporcionado una hoja de ruta completa para construir raspadores web resilientes e inteligentes usando LLaMA 3. Al combinar las capacidades de razonamiento contextual de los grandes modelos de lenguaje con herramientas y técnicas de raspado avanzadas, puede superar las limitaciones de los métodos tradicionales y extraer datos estructurados incluso de los sitios web más complejos y bien defendidos con un esfuerzo mínimo.

La conclusión clave es que el futuro del raspado web no se trata solo de automatización, sino de *automatización inteligente*. La capacidad de LLaMA 3 para entender el contenido semánticamente, combinada con la sofisticada evasión de bots de herramientas como Scrapeless Scraping Browser, representa un cambio de paradigma en cómo abordamos la extracción de datos. Esta poderosa combinación capacita a desarrolladores e investigadores para construir raspadores que no solo son más efectivos, sino también más adaptables y resilientes ante un panorama web en constante evolución.

A medida que emprenda su viaje de raspado web impulsado por IA, recuerde que las consideraciones éticas son primordiales. Siempre respete los términos de servicio de los sitios web que raspa, evite sobrecargar sus servidores con solicitudes excesivas y sea consciente de las regulaciones de privacidad de datos. Al adoptar un enfoque responsable e inteligente, puede desbloquear el vasto potencial de los datos web para impulsar la innovación, informar decisiones y crear valor en un mundo impulsado por datos.

En Scrapeless, solo accedemos a datos disponibles públicamente y cumplimos estrictamente con las leyes, regulaciones y políticas de privacidad del sitio web aplicables. El contenido de este blog es sólo para fines de demostración y no implica ninguna actividad ilegal o infractora. No ofrecemos garantías y renunciamos a toda responsabilidad por el uso de la información de este blog o enlaces de terceros. Antes de realizar cualquier actividad de scraping, consulte a su asesor legal y revise los términos de servicio del sitio web de destino u obtenga los permisos necesarios.

Artículos más populares

Catalogar