Raspado Web con IA: Extracción LLM, Prompt-a-JSON y Costo

La extracción LLM convierte cualquier página en JSON limpio a partir de un prompt en inglés simple, sin selectores que mantener. Pero el modelo no puede obtener la página y el HTML en bruto consume tokens rápidamente. Aquí te mostramos cómo hacerlo correctamente.

El raspado web con IA significa apuntar un modelo de lenguaje a una página y pedir, en inglés simple, los campos que deseas de vuelta como JSON, sin escribir selectores CSS ni mantener un analizador cuando cambia el diseño. Es verdaderamente transformador para extracciones desordenadas, variadas o únicas. También es ampliamente malentendido, por lo que la gente termina pagando para raspar unas pocas cientos de páginas y obteniendo datos alucinados. Dos hechos solucionan la mayor parte de esa confusión: un modelo de lenguaje no puede obtener una página web, solo razona sobre el texto que le proporcionas, y alimentarlo con HTML en bruto es la forma más rápida de agotar tu presupuesto de tokens. Esta guía cubre el patrón de extracción que funciona, cuándo supera a los selectores y cómo mantener bajo control tanto el costo como las alucinaciones.

Lo que nadie dice: el modelo no puede obtener

La parte difícil del raspado con IA no es la IA. Un chatbot no puede cargar de manera confiable una página en vivo: necesita un motor dedicado para obtener primero el HTML, luego razona sobre cualquier texto que le proporciones. Así que una canalización de extracción LLM es realmente una canalización de raspado con un analizador inteligente al final, y la mitad de raspado es donde las cosas fallan: gestión de bots, renderizado de JavaScript, bloqueos de IP. Resuelve la obtención con proxies y una capa de renderizado, y la extracción se convierte en la parte fácil. La forma limpia de obtener páginas es una API de raspador que maneja la rotación y el renderizado y devuelve markdown, que —como muestra la siguiente sección— también es la entrada más barata posible para un modelo:

import requests

def fetch_markdown(url, api_key):
    r = requests.get(
        "https://api.quantumproxies.io/scrape",
        params={"url": url, "render": "auto", "output": "markdown"},
        headers={"Authorization": f"Bearer {api_key}"},
        timeout=(5, 40),
    )
    r.raise_for_status()
    return r.json()["markdown"]  # nav/ads stripped, ready for the model

Por qué markdown, no HTML, es la verdadera palanca de costo

El mayor impulsor del costo de raspado con IA es cuántos tokens pasas a través del modelo, y el HTML en bruto son en su mayoría tokens que no deseas: estilos en línea, etiquetas de script, atributos de seguimiento, navegación, pies de página. Convierte la página a markdown limpio —o extrae solo el contenido principal— antes de la extracción y rutinariamente reduces el tamaño de la entrada en un orden de magnitud, lo que reduce el costo por el mismo factor y, como beneficio adicional, reduce las alucinaciones porque el modelo ve el contenido en lugar del cromo. Esta es la razón por la que markdown primero es el estándar para alimentar modelos, el mismo principio detrás de alimentar a los LLMs con datos web frescos. Si solo tomas una cosa de este artículo: nunca envíes a un modelo la fuente de la página en bruto.

Diagrama de la canalización de extracción LLM: obtén la página con proxies o una API de raspador, límpiala a markdown, haz un prompt con un esquema, luego valida la salida JSON
El modelo nunca toca la web en vivo. La obtención y limpieza ocurren primero, markdown reduce la factura de tokens, y un esquema mantiene el JSON honesto.

Prompt-a-JSON con un esquema

Una vez que tienes texto limpio, la extracción es una sola llamada: describe los campos que deseas, pasa un esquema para que la salida esté estructurada e instruye al modelo para que devuelva null en lugar de inventar cuando falta un campo. Una API de extracción colapsa obtención, limpieza y extracción en una sola solicitud para que te saltes toda la fontanería:

curl -X POST "https://api.quantumproxies.io/extract" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com/product/xyz",
    "schema": {
      "title":  "string",
      "price":  "number",
      "in_stock": "boolean",
      "rating": "number|null"
    },
    "prompt": "Extract the product. Use null for anything not present."
  }'

El esquema tiene una doble función: fuerza una forma predecible para el código posterior y restringe al modelo, que es la primera línea de defensa contra campos alucinados. Valida la respuesta contra el mismo esquema y rechaza cualquier cosa que no encaje: un precio inventado es peor que uno faltante.

def validate(record, schema):
    for field, kind in schema.items():
        v = record.get(field)
        if v is None and "null" not in kind:
            raise ValueError(f"missing required field: {field}")
    return record  # only trust records that satisfy the schema

Cuándo la extracción LLM supera a los selectores CSS —y cuándo no

La extracción con IA no es una mejora universal; es una herramienta diferente con una curva de costo diferente. Úsala cuando el trabajo sea variado o inestable —raspando mil sitios con mil diseños, un sitio que se rediseña constantemente, contenido no estructurado como reseñas o listados donde no existe un selector limpio, o un trabajo único donde escribir selectores no vale la pena. Quédate con selectores CSS o XPath cuando estés martillando un sitio estable a alto volumen: los selectores son deterministas, efectivamente gratuitos por página, y nunca alucinan. El patrón maduro es híbrido: selectores para tus objetivos principales de alto volumen, extracción LLM para la cola larga y los sitios que siguen cambiando.

La disciplina de costos convierte esto de un experimento en producción. Más allá de markdown primero, almacena en caché agresivamente para que nunca vuelvas a extraer una página sin cambios, ajusta el tamaño del modelo a la dificultad de la tarea —un modelo pequeño maneja bien la extracción de campos simples— y agrupa donde la API lo permita. El renderizado es su propio rubro; solo renderiza páginas que realmente necesiten JavaScript, una decisión que cuantificamos en renderiza solo cuando debes. Obtén una página en blanco en lugar de contenido y la solución suele ser el renderizado, cubierto en página vacía, datos faltantes.

Una palabra sobre la ruta gratuita y de código abierto, ya que es lo que la mayoría de la gente busca primero. Las bibliotecas de extracción de código abierto son excelentes para aprender el patrón y para trabajos pequeños, pero te devuelven los dos problemas difíciles con los que comenzó este artículo: todavía tienes que obtener páginas más allá de la gestión de bots, y todavía pagas por el modelo que hace la extracción. 'Gratis' generalmente significa código gratis más tus propias facturas de proxy y tokens. Ese es un buen intercambio para un proyecto de hobby o una prueba de concepto; a volumen de producción, el mantenimiento de la capa de obtención es exactamente lo que los equipos terminan subcontratando, una decisión de construir versus comprar que detallamos en pila de raspador DIY vs una API de raspador.

Comparación de extracción LLM versus selectores CSS, mostrando el enfoque flexible por token frente al enfoque determinista barato para sitios estables de alto volumen
La extracción LLM gana en sitios variados y cambiantes; los selectores ganan en un objetivo estable a alto volumen. La mayoría de las canalizaciones reales ejecutan ambos.

Preguntas frecuentes

¿Puede ChatGPT raspar un sitio web?

No por sí solo. Un modelo de lenguaje no puede obtener y renderizar de manera confiable una página en vivo: razona sobre el texto que le proporcionas. Para usar IA para raspado, emparejas un motor de raspado dedicado, que obtiene y limpia la página, con el modelo, que extrae datos estructurados del resultado. El motor de raspado maneja proxies, renderizado y bloqueos; el modelo maneja convertir contenido en JSON.

¿Cómo reduzco el costo del raspado web con IA?

Convierte las páginas a markdown o extrae el contenido principal antes de enviar cualquier cosa a un modelo: el HTML en bruto puede ser diez veces los tokens para la misma información. Luego almacena en caché las páginas sin cambios, usa un modelo más pequeño para la extracción de campos simples, solo renderiza JavaScript cuando una página lo requiere y agrupa solicitudes. El volumen de tokens es el costo dominante, por lo que reducir el tamaño de la entrada es la optimización de mayor apalancamiento.

¿El raspado web con IA alucina datos incorrectos?

Puede, especialmente cuando se le alimenta con HTML en bruto ruidoso o se le pide campos que no están en la página. Protégete limpiando la entrada, pasando un esquema explícito, instruyendo al modelo para que devuelva null cuando un valor esté ausente, y validando cada respuesta contra ese esquema antes de confiar en ella. Un campo faltante puedes reintentar; uno inventado confiadamente corrompe silenciosamente tu conjunto de datos.

¿Es mejor la extracción LLM que los selectores CSS?

Depende del trabajo. La extracción LLM gana cuando los diseños varían o cambian a menudo y cuando escribir selectores no vale la pena, porque no necesita selectores y sobrevive a los rediseños. Los selectores CSS ganan en un solo sitio estable a alto volumen: son deterministas y mucho más baratos por página. La mayoría de las canalizaciones de producción usan selectores para objetivos principales y extracción LLM para la cola larga.

El raspado web con IA es poderoso una vez que dejas de tratar al modelo como un raspador. Obtén limpiamente con proxies, alimenta markdown no HTML, restringe la salida con un esquema y reserva la extracción LLM para los trabajos donde su flexibilidad justifica su costo de tokens. Esa es la diferencia entre una demostración elegante y una canalización que puedes ejecutar todos los días.

Convierte cualquier página en JSON con la API de Extracción