Grok Web Scraping: Una Guía Práctica de Python
Lead Scraping Automation Engineer
Resumen:
- La API de Grok habla un OpenAI fluido, lo que la convierte en un motor de extracción fácil de integrar. Apunta el SDK oficial de OpenAI Python a
https://api.x.ai/v1y el modelo convierte el texto de la página en registros JSON contemperature=0yresponse_format={"type": "json_object"}. - Lo que Grok no hace es recuperar. El modelo no tiene navegador ni sesión; la herramienta de búsqueda web del lado del servidor de xAI fundamenta las respuestas con resultados en vivo, y la extracción de páginas a granel sigue siendo tu responsabilidad.
- La diferencia es visible en un script. Un GET simple en una página de demostración renderizada con JavaScript contiene 0 elementos de cita; la misma URL a través de la API de Extracción Universal Scrapeless con
js_rendercontiene los 10 — y ese HTML renderizado es de donde Grok extrae. - La extracción es real en esta guía, no hipotética. Una ejecución en vivo contra la página renderizada devolvió las 10 citas con los autores y los arreglos de etiquetas intactos — 3,211 tokens para toda la llamada.
- ¿No tienes clave de xAI aún? La solicitud idéntica se ejecuta a través de OpenRouter. Mismo SDK de OpenAI, diferente
base_urly cadena de modelo; esta guía muestra ambos caminos. - Gratis para empezar en el lado de la recuperación. Crea tu clave API de Scrapeless en app.scrapeless.com.
¿Puede Grok raspar sitios web?
Grok puede leer una página que le entregues y devolver exactamente los campos que pidas; no puede ir a recuperar esa página a un volumen de raspado. Esas son las dos mitades de cada configuración de "raspado web de Grok", y confundirlas es como los proyectos se estancan. La API de xAI expone un modelo de lenguaje — uno que resulta ser inusualmente fácil de conectar, porque el endpoint acepta la misma forma de solicitud que la de OpenAI — pero la recuperación HTTP, el rendering de JavaScript, el estado de sesión y los desafíos de acceso viven fuera de ella.
xAI ofrece una herramienta de búsqueda web del lado del servidor, y merece una frase honesta: permite a Grok buscar y leer la web en vivo para fundamentar una respuesta. Eso es recuperación para preguntas y respuestas. No te da control sobre qué páginas se recuperan, cómo se renderizan, o cuántas puedes procesar — las tres cosas sobre las que se construye un pipeline de raspado.
Así que la arquitectura de trabajo es de dos capas: una capa de recuperación que devuelve HTML renderizado fiel, y Grok como la capa de extracción que lo convierte en registros. Una aclaración más antes del código: esta guía apunta a Grok hacia la web. Apuntar un raspador a Grok — capturando sus respuestas como datos — es el trabajo opuesto, cubierto por la guía de la API de Raspador de Grok y el explicador de raspadores LLM.
Instalar
Todo el conjunto de herramientas es el SDK de OpenAI más requests — las versiones contra las que se escribió esta guía son openai 2.34.0 y el requests actual:
bash
pip install "openai==2.34.0" requests
Configurar
Las claves se mantienen en el entorno, nunca en el código fuente:
bash
export XAI_API_KEY="xai-tu_clave"
export SCRAPELESS_API_KEY="sk_tu_clave_scrapeless"
Obtén una página que Grok realmente pueda leer
La calidad de la extracción está limitada por la fidelidad de la recuperación, así que comienza donde la mayoría de los tutoriales de Grok terminan. En páginas renderizadas con JavaScript, el documento que un cliente HTTP simple recibe no es el documento que un lector ve — el contenido llega solo después de que los scripts construyen el DOM, un ciclo de vida definido por la especificación de scripting de HTML. Un script muestra la diferencia y guarda la versión que vale la pena extraer:
python
# fetch_rendered.py — GET simple vs renderizado del lado del servidor, misma URL
import os
import requests
URL = "https://quotes.toscrape.com/js/"
MARKER = '<span class="text"'
plain = requests.get(URL, timeout=60).text
print(f"GET simple: {len(plain):,} caracteres | elementos de cita: {plain.count(MARKER)}")
resp = requests.post(
"https://api.scrapeless.com/api/v1/unlocker/request",
headers={
"Content-Type": "application/json",
"x-api-token": os.environ["SCRAPELESS_API_KEY"],
},
json={
"actor": "unlocker.webunlocker",
"input": {"url": URL, "method": "GET", "js_render": True},
},
timeout=120,
)
resp.raise_for_status()
rendered = resp.json().get("data", "")
print(f"renderizado: {len(rendered):,} caracteres | elementos de cita: {rendered.count(MARKER)}")
with open("pagina.html", "w", encoding="utf-8") as f:
f.write(rendered)
La ejecución imprime elementos de cotización: 0 para la obtención simple y elementos de cotización: 10 para la renderizada. La renderización, el desbloqueo y el enrutamiento proxy ocurren del lado del servidor en esa única solicitud POST — la API de Raspado Universal es la capa de obtención, y page.html es ahora algo de lo que un modelo puede extraer.
Implementación básica: Grok como el extractor
El punto final de xAI toma la solicitud estándar de chat-completions de OpenAI. Dos parámetros garantizan la fiabilidad: temperature=0 mantiene la salida estable durante las ejecuciones, y el modo JSON lo mantiene analizable. Nombra las claves exactas que deseas en el mensaje del sistema y dile al modelo qué hacer con los valores faltantes.
Nota: Este bloque necesita una
XAI_API_KEYcon crédito — el único requisito que esta guía no asume. La siguiente sección ejecuta la extracción idéntica en vivo a través de OpenRouter, con salida capturada.
python
# extract_grok.py — Extracción Grok a través de la API de xAI (requiere XAI_API_KEY)
import json
import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.x.ai/v1",
api_key=os.environ["XAI_API_KEY"],
)
page_html = open("page.html", encoding="utf-8").read()
completion = client.chat.completions.create(
model="grok-4.5",
temperature=0,
response_format={"type": "json_object"},
messages=[
{
"role": "system",
"content": 'Extraer cada cita. Responde SOLAMENTE con JSON: '
'{"quotes":[{"text":str,"author":str,"tags":[str]}]}. Usa null para los valores faltantes.',
},
{"role": "user", "content": page_html},
],
)
data = json.loads(completion.choices[0].message.content)
print(f"extraídas {len(data['quotes'])} citas")
grok-4.5 es el modelo en el que se centra la documentación actual de xAI; intercambia el nivel que tu cuenta utilice. La forma de la solicitud no cambia.
¿No tienes clave xAI? Ejecuta la misma solicitud a través de OpenRouter
Debido a que la solicitud está configurada como OpenAI de principio a fin, una clave de agregador funciona con dos ediciones: la base_url y la cadena del modelo. Esta es la variante que esta guía ejecutó en realidad — obtención y extracción en un solo script autónomo:
python
# extract_openrouter.py — la misma extracción, ejecutada a través de OpenRouter
import json
import os
import requests
from openai import OpenAI
resp = requests.post(
"https://api.scrapeless.com/api/v1/unlocker/request",
headers={
"Content-Type": "application/json",
"x-api-token": os.environ["SCRAPELESS_API_KEY"],
},
json={
"actor": "unlocker.webunlocker",
"input": {"url": "https://quotes.toscrape.com/js/", "method": "GET", "js_render": True},
},
timeout=120,
)
resp.raise_for_status()
page_html = resp.json().get("data", "")
client = OpenAI(
base_url="https://openrouter.ai/api/v1",
api_key=os.environ["OPENROUTER_API_KEY"],
)
completion = client.chat.completions.create(
model="x-ai/grok-4.20",
temperature=0,
response_format={"type": "json_object"},
messages=[
{
"role": "system",
"content": 'Extraer cada cita. Responde SOLAMENTE con JSON: '
'{"quotes":[{"text":str,"author":str,"tags":[str]}]}. Usa null para los valores faltantes.',
},
{"role": "user", "content": page_html},
],
)
data = json.loads(completion.choices[0].message.content)
print(f"extraídas {len(data['quotes'])} citas de la página renderizada")
print(json.dumps(data["quotes"][0], ensure_ascii=False))
La ejecución en vivo extrajo todas las 10 citas y mostró la primera:
text
extraídas 10 citas de la página renderizada
{"text": "“El mundo tal como lo hemos creado es un proceso de nuestro pensamiento. No se puede cambiar sin cambiar nuestro pensamiento.”", "author": "Albert Einstein", "tags": ["cambio", "pensamientos profundos", "pensar", "mundo"]}
Los autores y los arreglos de etiquetas llegaron intactos, y toda la llamada costó 3,211 tokens. Ese es el extractor completo: una solicitud POST para obtener, una finalización para extraer, sin selectores en ninguna parte.
Obtén tu clave API en el plan gratuito: app.scrapeless.com
Patrones avanzados
- Fija el esquema en el mensaje del sistema, no en el aviso del usuario. El HTML de la página va en el turno del usuario; el contrato se mantiene en el turno del sistema donde sobrevive los bucles de página a página.
- Bucle en Python, no en el aviso. Una página por finalización evita que los registros se filtren a través de los límites y hace que los fallos sean atribuibles a una URL específica.
- Envía menos página cuando puedas. Grok lee todo el documento que envías, chrome y todo. Aislar el contenedor de contenido — o obtener markdown en lugar de HTML — reduce el gasto de tokens aproximadamente en proporción.
- Tratar etiquetas y listas explícitamente. Nombar
tags:[str]en el esquema es lo que produjo arreglos limpios en la ejecución anterior; dejar los campos de lista sin describir hace que los modelos los aplasten en cadenas.
Solución de Problemas
- Prosa en lugar de JSON. Dejaste
response_format={"type": "json_object"}— con eso, el punto final restringe la salida; sin él, estás analizando buena voluntad. - Se esperaban diez registros, se devolvieron tres. Verifica lo que has recuperado antes de culpar al modelo: cuenta un elemento conocido en el HTML de la manera en que lo hace el script de recuperación. Una recuperación casi vacía significa un problema de renderizado, que se corrige en la capa de recuperación con
js_render. - Salida diferente con entradas idénticas. Establece
temperature=0; la extracción no es una tarea de creatividad. - Los costos aumentan. El gasto de tokens sigue el tamaño de entrada. Recorta la página, no agrupe nada, y mantén un ojo en los conteos de tokens por página de la manera en que la ejecución anterior los informa.
Conclusión
Grok gana su lugar en un scraper como la capa que nunca ve la red: peticiones modeladas por OpenAI, configuraciones deterministas, una página dentro, un objeto JSON fuera. La capa que decide si cualquiera de eso es posible es la recuperación — la impresión 0 frente a 10 del primer script establece esa cuestión — y una POST renderizada en el servidor cierra la brecha. Conecta las dos y las diez citas de la página de demostración llegan como registros validados, etiquetas y todo.
¿Listo para alimentar a Grok con páginas reales?
La capa de recuperación en esta guía es un POST por página en la API Universal de Extracción — los planes y volúmenes están en la página de precios, y la documentación del desarrollador cubre los parámetros unlocker.webunlocker. Crea una clave en el plan gratuito en app.scrapeless.com y vuelve a ejecutar ambos scripts tal como están escritos.
Preguntas Frecuentes
P: ¿Puede Grok raspar sitios web por sí mismo?
No. La API de Grok extrae de texto que tú proporcionas; no puede emitir solicitudes, renderizar JavaScript o mantener sesiones. Su herramienta de búsqueda web lee la web en vivo para fundamentar respuestas, pero la selección de páginas, la fidelidad de renderizado y el volumen permanecen fuera de tu control — un pipeline de extracción necesita su propia capa de recuperación.
P: ¿Es la búsqueda web integrada de Grok lo mismo que el raspado web?
Trabajos diferentes. La herramienta de búsqueda recupera contexto para que el modelo pueda responder una pregunta; el raspado recupera páginas específicas para que puedas extraer campos específicos en un volumen que elijas. Usa la herramienta cuando desees respuestas, y el pipeline de dos capas en esta guía cuando desees datos.
P: ¿En qué se diferencia esto de un scraper de Grok?
Dirección. Aquí, Grok es el analizador y la web es el objetivo. Un scraper de Grok lo invierte: captura las propias respuestas de Grok como datos estructurados, que Scrapeless envía como un actor; la guía de la API de Scraper de Grok vinculada en la introducción cubre ese trabajo.
P: ¿Qué modelo de Grok debo usar para extracción?
El más barato que sostenga tu esquema. La extracción con un contrato JSON estricto y temperature=0 no es una tarea que genere razonamientos pesados, así que comienza pequeño — la ejecución en vivo en esta guía utilizó un nivel de Grok de menor precio a través de OpenRouter y devolvió todos los 10 registros correctamente — y sube solo si los campos comienzan a regresar incorrectos.
P: ¿Es legal raspar con Grok?
El modelo no cambia las reglas de colección. Recupera solo páginas públicas, respeta los términos del sitio y las directivas de robots estandarizadas por el Protocolo de Exclusión de Robots, mantén los volúmenes limitados y maneja los datos personales según las leyes que se apliquen a ti — además de los términos de uso de xAI en el lado del modelo.
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.



