Los métodos tradicionales de web scraping a menudo se rompen cuando los diseños de los sitios web cambian o las protecciones anti-bot se vuelven más estrictas. En esta guía, aprenderás un enfoque más resistente y potenciado por IA que utiliza LLaMA 3 -elpotente modelo de lenguaje de peso abierto de Meta- para extraer datos estructurados de casi cualquier sitio web y convertirlos en JSON limpio y utilizable.
Empecemos.
¿Por qué utilizar LLaMA 3 para Web Scraping?
LLaMA 3 (publicado en abril de 2024) es el modelo de lenguaje grande de peso abierto de Meta, disponible en tamaños que van de 8B a 405B parámetros. Admite una amplia gama de casos de uso y capacidades de hardware. Las iteraciones posteriores -LLaMA 3.1, 3.2 y 3.3- han mejorado significativamente el rendimiento y la comprensión contextual.
Los métodos tradicionales de web scraping se basan en selectores estáticos como XPath o CSS, que pueden romperse fácilmente cuando cambian las estructuras de los sitios web. En cambio, LLaMA 3 permite la extracción inteligente de datos al comprender el contenido contextualmente, como lo haría un ser humano.
Esto lo hace ideal para:
- sitios de comercio electrónico como Amazon
- análisis de datos
- Crear raspadores más resistentes que no se rompan con cada actualización del sitio web.
- Mantener los datos raspados dentro de su entorno: crucial para la información sensible
Obtenga más información sobre el uso de la IA para el web scraping.
Requisitos previos
Antes de sumergirse en el raspado web LLM, asegúrese de que tiene lo siguiente en su lugar:
- Python 3 instalado
- Conocimientos básicos de Python (no es necesario ser un experto)
- Un sistema operativo compatible: – macOS (requiere macOS 11 Big Sur o posterior) – Linux – Windows (requiere Windows 10 o posterior)
- Recursos de hardware adecuados (véanse los detalles de selección de modelos más abajo)
Instalación de Ollama
Ollama es una herramienta ligera que simplifica la descarga, configuración y ejecución local de grandes modelos lingüísticos.
Para empezar:
- Visite el sitio web oficial de Ollama
- Descargue e instale la aplicación para su sistema operativo
- Importante: Durante la instalación, Ollama le pedirá que ejecute un comando de terminal-nolo ejecute todavía. Primero elegiremos la versión correcta del modelo.
Elegir el modelo LLaMA
Empieza por explorar la biblioteca de modelos de Ollama para elegir la versión de LLaMA que mejor se adapte a tu hardware y a tu caso de uso.
Para la mayoría de los usuarios, llama3.1:8b
ofrece el mejor equilibrio entre rendimiento y eficacia. Es ligero, capaz y requiere aproximadamente 4,9 GB de espacio en disco y 6-8 GB de RAM. Funciona sin problemas en la mayoría de los portátiles modernos.
Si trabaja con una máquina más potente y necesita una mayor capacidad de razonamiento o una mayor longitud de contexto, considere la posibilidad de escalar a modelos más grandes, como el 70B
o el 405B
. Estos modelos requieren mucha más memoria y potencia de cálculo.
Extracción y ejecución del modelo
Para descargar e inicializar el modelo LLaMA 3.1 (8B), ejecute el siguiente comando:
ollama run llama3.1:8b
Una vez descargado el modelo, verás un sencillo mensaje interactivo:
>>> Send a message (/? for help)
Puedes probar el modelo con una consulta rápida:
>>> who are you?
I am LLaMA, *an AI assistant developed by Meta AI...*
Una respuesta satisfactoria como la anterior confirma que el modelo está correctamente instalado. Escriba /bye
para salir de la pantalla.
A continuación, inicie el servidor Ollama ejecutando:
ollama serve
Este comando lanza una instancia local de Ollama en http://127.0.0.1:11434/
. Deje esta ventana de terminal abierta, ya que el servidor debe permanecer funcionando en segundo plano.
Para comprobar que funciona, abra su navegador y vaya a esa URL; debería ver el mensaje “Ollama se está ejecutando”.
Creación de un raspador de Amazon basado en LLM
En esta sección, crearemos un scraper que extraiga detalles de productos de Amazon, uno de los objetivos más difíciles debido a su contenido dinámico y a las fuertes protecciones anti-bot.
Extraeremos detalles clave como:
- Título del producto
- Precio actual/original
- Descuento
- Valoraciones y reseñas
- Descripción y características
- Disponibilidad y ASIN
Flujo de trabajo multietapa basado en IA
Para superar las limitaciones del scraping tradicional, especialmente en sitios de comercio electrónico complejos como Amazon, nuestro scraper basado en LLaMA sigue un flujo de trabajo inteligente de varias fases:
- Automatización del Navegador – Utilice Selenium para cargar la página y renderizar el contenido dinámico
- Extracción HTML – Identifique y extraiga el contenedor que incluye los detalles del producto.
- Conversión a Markdown – Convierte el HTML a Markdown para reducir el número de tokens y mejorar la eficiencia de LLM.
- Procesamiento LLM – Utilice un prompt estructurado con LLaMA para extraer JSON limpio y estructurado
- Manejo de la salida – Almacenar el JSON extraído para su uso o análisis posterior.
Aquí tienes un desglose visual del flujo de trabajo:
Veamos ahora el proceso paso a paso. Ten en cuenta que estos ejemplos utilizan Python por su sencillez y popularidad, pero puedes conseguir resultados similares utilizando JavaScript u otro lenguaje de tu elección.
Paso 1 – Instale las bibliotecas necesarias
En primer lugar, instale las bibliotecas Python necesarias:
pip install requests selenium webdriver-manager markdownify
requests
– El mejor cliente Python HTTP para enviar llamadas API al servicio LLMselenium
– Automatiza el navegador, ideal para sitios web con mucho JavaScript.webdriver-manager
– Descarga y gestiona automáticamente la versión correcta de ChromeDrivermarkdownify
– Convierte HTML en Markdown
Paso 2 – Inicializar el Headless Browser
Configure un navegador sin cabeza utilizando Selenium:
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")
driver = webdriver.Chrome(
service=Service(ChromeDriverManager().install()),
options=options
)
Paso 3 – Extraer el HTML del producto
Los detalles de los productos de Amazon se muestran dinámicamente y se envuelven dentro de un
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"))
)
# Extract the full HTML of the product container
page_html = product_container.get_attribute("outerHTML")
Este enfoque:
- Espera el contenido renderizado en JavaScript (como precios y valoraciones)
- Se dirige sólo a la sección del producto pertinente, ignorando cabeceras, pies de página y barras laterales.
Consulta nuestra guía completa sobre cómo scrapear datos de productos de Amazon en Python.
Paso 4 – Convertir HTML a Markdown
Las páginas de Amazon contienen HTML profundamente anidado que resulta ineficiente de procesar para los LLM. Una optimización clave es convertir este HTML a Markdown limpio, lo que reduce drásticamente el número de tokens y mejora la comprensión.
Cuando ejecute el script completo, se generarán dos archivos: amazon_page.html
y amazon_page.md
. Prueba a pegar ambos en la herramienta de cálculo de to kens para comparar sus recuentos.
Como se muestra a continuación, el HTML contiene alrededor de 270.000 tokens:
¿La versión Markdown? Sólo ~11.000 fichas:
Esta reducción del 96% conduce a:
- Rentabilidad: menos tokens implican menos costes de API o de computación.
- Procesamiento más rápido – Menos datos de entrada = respuestas LLM más rápidas
- Mayor precisión: un texto más limpio y plano ayuda al modelo a extraer datos estructurados con mayor precisión.
Más información sobre por qué los agentes de IA prefieren Markdown a HTML.
He aquí cómo hacer la conversión en Python:
from markdownify import markdownify as md
clean_text = md(page_html, heading_style="ATX")
Paso 5 – Crear la solicitud de extracción de datos
Un prompt bien estructurado es crítico para obtener una salida JSON consistente y limpia del LLM. A continuación se muestra un mensaje que indica al modelo que devuelva únicamente JSON válido en un formato predefinido:
PROMPT = (
"You are an expert Amazon product data extractor. Your task is to extract product data from the provided content. "
"Return ONLY valid JSON with EXACTLY the following fields and formats:\n\n"
"{\n"
' "title": "string – the product title",\n'
' "price": number – the current price (numerical value only)",\n'
' "original_price": number or null – the original price if available,\n'
' "discount": number or null – the discount percentage if available,\n'
' "rating": number or null – the average rating (0–5 scale),\n'
' "review_count": number or null – total number of reviews,\n'
' "description": "string – main product description",\n'
' "features": ["string"] – list of bullet point features,\n'
' "availability": "string – stock status",\n'
' "asin": "string – 10-character Amazon ID"\n'
"}\n\n"
"Return ONLY the JSON without any additional text."
)
Paso 6 – Llamar a la API LLM
Con Ollama ejecutándose localmente, puedes enviar el texto Markdown a tu instancia LLaMA a través de su API HTTP:
import requests
import json
response = requests.post(
"<http://localhost:11434/api/generate>",
json={
"model": "llama3.1:8b",
"prompt": f"{PROMPT}\n\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)
Qué hace cada opción:
temperatura
– Establecer en 0,1 para una salida determinista (ideal para el formato JSON)num_ctx
– Define la longitud máxima del contexto. 12.000 tokens son suficientes para la mayoría de las páginas de productos de Amazon.stream
– Cuandoes False
, la API devuelve la respuesta completa tras el procesamientoformat
– Especifica el formato de salida (JSON)model
– Indica la versión de LLaMA que debe utilizarse
Dado que el Markdown convertido suele contener alrededor de 11.000 tokens, es importante ajustar la ventana contextual(num_ctx
) en consecuencia. Aunque aumentar este valor le permite manejar entradas más largas, también aumenta el uso de RAM y ralentiza el procesamiento. Aumente el límite de contexto sólo si sus páginas de producto son especialmente largas o si dispone de los recursos informáticos para soportarlo.
Paso 7 – Guardar los resultados
Por último, guarde los datos estructurados del producto en un archivo JSON:
with open("product_data.json", "w", encoding="utf-8") as f:
json.dump(product_data, f, indent=2, ensure_ascii=False)
Paso 8: Ejecutar el script
Para ejecutar su raspador, proporcione una URL de producto de Amazon y llame a su función de raspado:
if __name__ == "__main__":
url = "<https://www.amazon.com/Black-Office-Chair-Computer-Adjustable/dp/B00FS3VJAO>"
# Call your function to scrape and extract product data
scrape_amazon_product(url)
Paso 9 – Ejemplo de código completo
A continuación se muestra el script completo en Python que combina todos los pasos en un flujo de trabajo cohesivo e integral:
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
# Configuration constants
LLM_API_CONFIG: Final[Dict[str, Any]] = {
"endpoint": "<http://localhost:11434/api/generate>",
"model": "llama3.1:8b",
"temperature": 0.1,
"context_window": 12000,
"stream": False,
"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] = (
"You are an expert Amazon product data extractor. Your task is to extract product data from the provided content. "
"Return ONLY valid JSON with EXACTLY the following fields and formats:\n\n"
"{\n"
' "title": "string - the product title",\n'
' "price": number - the current price (numerical value only),\n'
' "original_price": number or null - the original price if available,\n'
' "discount": number or null - the discount percentage if available,\n'
' "rating": number or null - the average rating (0-5 scale),\n'
' "review_count": number or null - total number of reviews,\n'
' "description": "string - main product description",\n'
' "features": ["string"] - list of bullet point features,\n'
' "availability": "string - stock status",\n'
' "asin": "string - 10-character Amazon ID"\n'
"}\n\n"
"Return ONLY the JSON without any additional text."
)
# Configure logging
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s - %(levelname)s - %(message)s",
handlers=[logging.StreamHandler()],
)
def initialize_web_driver(headless: bool = True) -> webdriver.Chrome:
"""Initialize and return a configured Chrome WebDriver instance."""
options = Options()
if headless:
options.add_argument("--headless=new")
service = Service(ChromeDriverManager().install())
return webdriver.Chrome(service=service, options=options)
def fetch_product_container_html(product_url: str) -> Optional[str]:
"""Retrieve the HTML content of the Amazon product details container."""
driver = initialize_web_driver()
try:
logging.info(f"Accessing product page: {product_url}")
driver.set_page_load_timeout(15)
driver.get(product_url)
# Wait for the product container to appear
container = WebDriverWait(driver, 5).until(
EC.presence_of_element_located((By.ID, "ppd"))
)
return container.get_attribute("outerHTML")
except Exception as e:
logging.error(f"Error retrieving product details: {str(e)}")
return None
finally:
driver.quit()
def extract_product_data_via_llm(markdown_content: str) -> Optional[Dict[str, Any]]:
"""Extract structured product data from markdown text using LLM API."""
try:
logging.info("Extracting product data via LLM API...")
response = requests.post(
LLM_API_CONFIG["endpoint"],
json={
"model": LLM_API_CONFIG["model"],
"prompt": f"{PRODUCT_DATA_EXTRACTION_PROMPT}\n\n{markdown_content}",
"format": "json",
"stream": LLM_API_CONFIG["stream"],
"options": {
"temperature": LLM_API_CONFIG["temperature"],
"num_ctx": LLM_API_CONFIG["context_window"],
},
},
timeout=LLM_API_CONFIG["timeout_seconds"],
)
response.raise_for_status()
raw_output = response.json()["response"].strip()
# Clean JSON output if it's wrapped in markdown code blocks
if raw_output.startswith(("```json", "```")):
raw_output = raw_output.split("```")[1].strip()
if raw_output.startswith("json"):
raw_output = raw_output[4:].strip()
return json.loads(raw_output)
except requests.exceptions.RequestException as e:
logging.error(f"LLM API request failed: {str(e)}")
return None
except json.JSONDecodeError as e:
logging.error(f"Failed to parse LLM response: {str(e)}")
return None
except Exception as e:
logging.error(f"Unexpected error during data extraction: {str(e)}")
return None
def scrape_amazon_product(
product_url: str, output_file: str = "product_data.json"
) -> None:
"""Scrape an Amazon product page and save extracted data along with HTML and Markdown to files."""
start_time = time.time()
logging.info(f"Starting scrape for: {product_url}")
# Step 1: Fetch product page HTML
product_html = fetch_product_container_html(product_url)
if not product_html:
logging.error("Failed to retrieve product page content")
return
# Optional: save HTML for debugging
with open("amazon_product.html", "w", encoding="utf-8") as f:
f.write(product_html)
# Step 2: Convert HTML to Markdown
product_markdown = html_to_md(product_html)
# Optional: save Markdown for debugging
with open("amazon_product.md", "w", encoding="utf-8") as f:
f.write(product_markdown)
# Step 3: Extract structured data via LLM
product_data = (
extract_product_data_via_llm(product_markdown) or DEFAULT_PRODUCT_DATA.copy()
)
# Step 4: Save JSON results
try:
with open(output_file, "w", encoding="utf-8") as json_file:
json.dump(product_data, json_file, indent=2, ensure_ascii=False)
logging.info(f"Successfully saved product data to {output_file}")
except IOError as e:
logging.error(f"Failed to save JSON results: {str(e)}")
elapsed_time = time.time() - start_time
logging.info(f"Completed in {elapsed_time:.2f} seconds")
if __name__ == "__main__":
# Example usage
test_url = (
"<https://www.amazon.com/Black-Office-Chair-Computer-Adjustable/dp/B00FS3VJAO>"
)
scrape_amazon_product(test_url)
Cuando el script se ejecuta correctamente, guarda los datos extraídos del producto en un archivo llamado product_data.json
. El resultado será algo parecido a esto:
{
"title": "Home Office Chair Ergonomic Desk Chair Mesh Computer Chair with Lumbar Support Armrest Executive Rolling Swivel Adjustable Mid Back Task Chair for Women Adults, Black",
"price": 36.98,
"original_price": 41.46,
"discount": 11,
"rating": 4.3,
"review_count": 58112,
"description": 'Office chair comes with all hardware and tools, and is easy to assemble in about 10–15 minutes. The high-density sponge cushion offers flexibility and comfort, while the mid-back design and rectangular lumbar support enhance ergonomics. All components are BIFMA certified, supporting up to 250 lbs. The chair includes armrests and an adjustable seat height (17.1"–20.3"). Its ergonomic design ensures a perfect fit for long-term use.',
"features": [
"100% mesh material",
"Quick and easy assembly",
"High-density comfort seat",
"BIFMA certified quality",
"Includes armrests",
"Ergonomic patented design",
],
"availability": "In Stock",
"asin": "B00FS3VJAO",
}
¡Voilà! El HTML desordenado se convierte en JSON limpio: esa es la magia de los LLM en el raspado web.
Superar las medidas antibot
Al ejecutar el bot de raspado web anterior, es probable que te encuentres con las medidas anti-bot de Amazon, como los desafíos CAPTCHA:
Esto pone de manifiesto una limitación clave: Aunque nuestro flujo de trabajo basado en LLaMA destaca en el análisis sintáctico de HTML, acceder a ese contenido sigue siendo un reto en sitios con protecciones anti-bot avanzadas.
Para superar esto, tendrá que eludir los CAPTCHA de Amazon y hacer frente a otros retos de raspado web.
Aquí es donde Bright Data Scraping Browser entra en juego: una solución diseñada específicamente para manejar las complejidades de los entornos web modernos, incluido el desbloqueo fiable incluso de los sitios web más protegidos en los que las herramientas tradicionales fallan.
Más información: Navegador Scraping vs. Navegadores Headless
Por qué utilizar Bright Data Scraping Browser
Bright Data Scraping Browser es un navegador sin cabeza basado en la nube con infraestructura de proxy integrada y funciones de desbloqueo avanzadas, diseñado específicamente para escalar proyectos modernos de raspado web. Forma parte de la suite de scraping Bright Data Unlocker.
He aquí por qué lo eligen los desarrolladores y los equipos de datos:
- Huellas digitales TLS fiables y técnicas de evasión sigilosa
- Rotación IP integrada impulsada por una red proxy IP de más de 150M
- Resolución automática de CAPTCHA
- Reduzca la infraestructura: elimine las costosas configuraciones en la nube y el mantenimiento continuo.
- Compatibilidad nativa con Playwright, Puppeteer y Selenium
- Escalabilidad ilimitada para la extracción de grandes volúmenes de datos
¿Y lo mejor? Puede integrarlo en su flujo de trabajo actual con sólo unas líneas de código.
Lea por qué cada vez más empresas se pasan al raspado web basado en la nube.
Configuración del navegador de scraping
Para empezar con Scraping Browser:
Cree una cuenta de Bright Data (los nuevos usuarios reciben un crédito de 5 dólares tras añadir un método de pago) y, en su panel de control, vaya a Proxies & Scraping y haga clic en Empezar.
Cree una nueva zona (por ejemplo, test_browser) y active funciones como Dominios Premium y Solucionador CAPTCHA.
A continuación, copie la URL de Selenium de su panel de control.
Modificación del código para el navegador de scraping
Actualice su función initialize_web_driver
para conectarse a través del Scraping Browser:
from selenium.webdriver import Remote
from selenium.webdriver.chrome.options import Options as ChromeOptions
from selenium.webdriver.chromium.remote_connection import ChromiumRemoteConnection
SBR_WEBDRIVER = "<https://username:password@host>:port"
def initialize_web_driver():
options = ChromeOptions()
sbr_connection = ChromiumRemoteConnection(SBR_WEBDRIVER, "goog", "chrome")
driver = Remote(sbr_connection, options=options)
return driver
Eso es todo – su scraper ahora se dirige a través de la infraestructura de Bright Data y maneja Amazon y otros sistemas anti-bot con facilidad.
Explore más funciones avanzadas en la documentación del Navegador de raspado.
Próximos pasos y soluciones alternativas
Para ampliar las capacidades de su rascador impulsado por LLaMA o explorar otras implementaciones, considere las siguientes mejoras y alternativas.
- Hacer que el script sea reutilizable: Permitir que la URL y el prompt se pasen como argumentos de línea de comandos para un uso flexible.
- Asegure sus credenciales: Almacena tus credenciales de Scraping Browser en un archivo
.env
y cárgalas de forma segura usandopython-dotenv
- Añadir soporte multipágina: Implementar la lógica para el rastreo a través de múltiples páginas y el manejo de la paginación.
- Raspemás sitios web: utilice las funciones antidetección de Scraping Browser para raspar otras plataformas de comercio electrónico.
- Extraiga datos de los servicios de Google: cree raspadores específicos para Google Flights, Google Search y Google Trends, o utilice la API SERP de Bright Data para obtener datos de búsqueda listos para usar.
Si prefiere soluciones gestionadas o desea explorar otros métodos basados en LLM, las siguientes opciones pueden ser adecuadas:
- Raspado con Géminis
- Raspando con perplejidad
- Cree un raspador de inteligencia artificial con Crawl4AI y DeepSeek
Conclusión
Esta guía proporciona una base sólida para construir raspadores web resistentes utilizando LLaMA 3. Combinando las capacidades de razonamiento de grandes modelos lingüísticos con herramientas avanzadas de raspado, podrá extraer datos estructurados de sitios web complejos con el mínimo esfuerzo.
Evitar la detección y el bloqueo es uno de los mayores retos del web scraping. Bright Data Scraping Browser resuelve este problema gestionando automáticamente la representación dinámica, la toma de huellas dactilares y la protección anti-bot. Forma parte de un conjunto más amplio de herramientas diseñadas para facilitar la extracción escalable de datos:
- Servicios proxy – Acceda a más de 150 millones de IP residenciales para saltarse las restricciones geográficas
- API de raspado web: extraiga datos estructurados de más de 100 sitios web populares a través de puntos finales específicos.
- Web Unlocking API – Obtenga el HTML completo de cualquier URL, evitando los sistemas anti-scraping.
- SERP API – Recopile resultados de búsqueda en tiempo real de los principales motores de búsqueda
Regístrese hoy mismo para probar de forma gratuita el conjunto completo de herramientas de scraping y proxy de Bright Data.
No se requiere tarjeta de crédito