Volver al blog

Cómo raspar los resultados de búsqueda de Google con Scrapeless Scraping Browser: Resultados orgánicos, PAA, Paneles de conocimiento y visión general de IA.

Alex Johnson
Alex Johnson

Senior Web Scraping Engineer

27-Apr-2026

Principales conclusiones:

  • Una CLI, todas las superficies de Google. El flujo de trabajo scrapeless-scraping-browser raspa resultados orgánicos de Google, Fragmentos Destacados, Preguntas relacionadas, Paneles de Conocimiento, Búsquedas Relacionadas y Visión General de IA, todo desde el mismo patrón de sesión. Verificado de extremo a extremo en Ubuntu, 24-04-2026 (138 contenedores orgánicos por página en la consulta scrapeless).
  • La estrategia de espera de Google. wait --load networkidle devuelve en ~14 s porque los rastreadores de Google nunca se estabilizan; usa un wait 5000 fijo en su lugar y verifica la preparación contando contenedores div[data-ved][data-hveid] (≥ 8 significa que el SERP se renderizó).
  • Descubrir → extraer con selectores de unión. Google rota el contenedor de fragmentos entre variantes A/B (div.VwiC3b, div[data-content-feature="1"], .lEBKkf, span.st). Consulta cada campo de manera independiente y agrúpalo por tarjeta; una estricta regla de "debe tener h3 Y ancla Y fragmento" pierde 4 de cada 10 resultados por anuncios y tarjetas de video.
  • Fragmento Destacado movido fuera de .kno-rdesc. En consultas de altura/medición, Google ahora presenta la respuesta como un fragmento del Panel de Conocimiento por atributo (span.T286Pc). El patrón resistente es una cascada de selectores seguida de un regex de cuerpo de texto como respaldo, mostrado en el Paso 4.

Google Search es la superficie que soporta el seguimiento de clasificación SEO, inteligencia competitiva, participación de marca, tuberías de sostenido de IA y conjuntos de datos de evaluación de LLM. Raspándolo de manera confiable en 2026 significa manejar cuatro partes móviles: enrutamiento de IP residenciales más allá del límite de tasa /sorry/index, una estrategia de espera fija porque los rastreadores nunca se van completamente inactivos, selectores de unión contra nombres de clase A/B en rotación, y un patrón de extracción por características (orgánico, Fragmento Destacado, Preguntas También Preguntan, Panel de Conocimiento, Búsquedas Relacionadas, Visión General de IA).

El muro CAPTCHA de /sorry/index de Google se activa a tasas variables, desde aproximadamente 1 de cada 10 en un día tranquilo hasta casi cada solicitud de salida de EE. UU. durante una carga pesada, dependiendo del grupo de proxies, la hora del día y la geografía objetivo. Los proxies DE/GB/JP/FR/CA generalmente tienen una tasa de aprobación más alta que los de EE. UU. para Google específicamente (ver Paso 1). El Scrapeless Scraping Browser maneja proxies residenciales, huellas anti-detección y renderización de JavaScript como preocupaciones a nivel de sesión, por lo que el código del pipeline se centra en selectores y esperas.

Este post es un recorrido guiado con enfoque CLI y fundamentado en la verificación a través del navegador en la nube scrapeless-scraping-browser. Cada selector, umbral de espera y patrón de falla a continuación está respaldado por una ejecución de verificación en Ubuntu el 24-04-2026: reclamos específicos de Google para extracción orgánica, paginación, localización, supresión de SERP clásica, sondeo de Visión General de IA, Panel de Conocimiento, PAA y Búsquedas Relacionadas.


Lo Que Puedes Hacer Con Esto

  • Seguimiento de clasificación SERP en Google. Rastrear posiciones para un conjunto de palabras clave, construir un puntaje de visibilidad por dominio y fijar los mejores N resultados por consulta por marca de tiempo.
  • Inteligencia competitiva de palabras clave. Extraer los 10 mejores para las consultas objetivo de un competidor, diferenciar listas de hosts e identificar victorias SERP que tu propio SEO no captura.
  • Fundamentación de respuestas de IA. Recoger citas de la Visión General de IA de Google, atribuciones de Fragmento Destacado y pares de Preguntas También Preguntan para construir el conjunto exacto de evidencia que las herramientas de búsqueda impulsadas por LLM presentan a los usuarios finales.
  • Extracción de Panel de Conocimiento. Extraer hojas de datos de entidades a través del mapa de atributos data-attrid de Google: más de 20 campos estructurados por entidad para la consulta de verificación de Albert Einstein, adecuado para alimentar un pipeline de grafo de conocimiento o enriquecimiento de entidades.
  • Monitoreo multi-local. Consultar la misma palabra clave desde hl=de&gl=de, hl=en&gl=us y hl=ja&gl=jp a través de proxies residenciales coincidentes en geografía para capturar las diferencias SERP mercado por mercado.
  • Conjuntos de datos de evaluación de LLM. Construir conjuntos de datos de verdad determinada para evaluar sistemas de generación aumentada por recuperación al fijar el mejor N por consulta por marca de tiempo.

Por Qué Usar Scrapeless Scraping Browser

Scrapeless Scraping Browser es un navegador en la nube personalizable y anti-detección diseñado para rastreadores web y Agentes de IA. Para Google Search específicamente, ofrece:

  • Proxies residenciales en más de 195 países (--proxy-country, --proxy-state, --proxy-city) — los rangos de IP de centros de datos son filtrados agresivamente por el borde de Google; la salida residencial es el primitivo que soporta la carga para un raspado sostenible.
  • Resolver CAPTCHA integrado.
  • Huella anti-detección en cada sesión — las verificaciones del lado del cliente de SearchGuard de Google tratan al navegador como si fuera un Chrome real.
  • Renderización de JavaScript en la nube — el SERP de Google está hidratado; HTML estático no es suficiente.
  • Alineación de locales por sesión a través de --timezone y --languages — automática con la geografía del proxy.
    Obtén tu clave de API en el plan gratuito en scrapeless.com. Productos relacionados de Scrapeless: API Universal de Scraping, Soluciones de Proxy, y el Servidor MCP de Scrapeless para integraciones del Protocolo de Contexto de Modelo.

Si una API JSON estructurada se ajusta mejor a tu flujo de trabajo que un navegador, consulta la guía del API de Scraper de Búsqueda de Google.


Requisitos previos

  • Node.js 18 o superior.
  • Una cuenta de Scrapeless y una clave de API: regístrate en scrapeless.com.
  • jq para el análisis de JSON (recomendado).
  • Familiaridad básica con el terminal.

Instalación

Las recetas a continuación funcionan en el CLI scrapeless-scraping-browser. La configuración consta de tres pasos: tanto los usuarios de CLI como los usuarios de agentes de IA necesitan los pasos #1 y #2; los usuarios de agentes de IA también realizan el paso #3.

1. Instalar el paquete CLI

bash Copy
npm install -g scrapeless-scraping-browser

Esto proporciona el binario scrapeless-scraping-browser que se llama en cada paso de esta publicación. La habilidad no trae su propio entorno de ejecución; carga patrones de comando en tu agente de IA, pero el CLI en sí debe estar instalado primero.

2. Configurar tu clave de API

Obtén tu token en scrapeless.com, luego guárdalo donde el CLI pueda leerlo:

bash Copy
scrapeless-scraping-browser config set apiKey your_api_token_here
scrapeless-scraping-browser config get apiKey   # verificar

¿Usas un agente de IA? Las instrucciones de la habilidad le indican a tu agente que se requiere autenticación antes de cualquier llamada a la sesión. Si la clave de API no está configurada cuando el agente intenta usar el CLI por primera vez, el agente te lo solicitará y ejecutará el comando config set apiKey … por ti; puedes configurarla manualmente ahora (comandos anteriores) o pegar tu token cuando el agente lo pida.

El archivo de configuración se encuentra en ~/.scrapeless/config.json con acceso restringido al usuario actual, tiene prioridad sobre la variable de entorno y es portátil entre agentes y ejecutores de CI. Para pipelines de CI, prefieres:

bash Copy
export SCRAPELESS_API_KEY=your_api_token_here

3. Instalar la habilidad de Scrapeless en tu agente de IA

Este es un paso separado del paso 1 anterior. El paso 1 instaló el binario CLI — el entorno de ejecución que invoca tu agente. La habilidad es lo que enseña a tu agente cómo invocarlo correctamente (selectores, esperas, patrones de reintento, el flujo de trabajo descubrir→extraer). Son dos cosas diferentes y necesitas ambas.

La habilidad es una carpeta que contiene SKILL.md + skill.json + references/. La fuente canónica es el scrapeless-ai/scrapeless-agent-browser → skills/scraping-browser-skill repositorio en GitHub.

Para instalarlo en Claude Code, Cursor, VS Code + GitHub Copilot, OpenAI Codex CLI, o Gemini CLI, sigue la guía de instalación del Agente AI de Scrapeless — tiene los comandos de copiar-pegar por agente (bash y Windows PowerShell). Recarga tu agente después de la instalación para que la habilidad se active.

Sin la habilidad instalada, tu agente no sabe el patrón descubrir→extraer, las esperas por motor, o los selectores que realmente funcionan en 2026, y tendrías que alimentar cada detalle en cada solicitud.

Lo que la habilidad carga en el contexto operativo de tu agente desde el principio:

  • Autenticación — verifica ~/.scrapeless/config.json o SCRAPELESS_API_KEY y te solicita que lo configures si falta (ver paso 2).
  • Flujo de trabajo Descubrir → Extraerel patrón de antifragilidad. El agente lee el DOM en vivo con get html "<region>" primero, identifica anclas estables (data-ved, data-attrid, aria-label, role, identificadores semánticos), luego escribe selectores de eval basados en lo que realmente se renderiza, en lugar de adivinar nombres de clases de utilidad que Google rota entre variantes A/B cada pocas semanas.
  • Sintaxis del selector — CSS (div[data-ved][data-hveid]) frente a referencias de accesibilidad (@e1 de snapshot -i).
  • Estrategia de espera de Googlewait 5000 más un chequeo de conteo de div[data-ved][data-hveid] como señal de preparación. El agente elige esta opción por defecto en lugar de confiar en wait --load networkidle, que nunca se estabiliza en Google.
  • Trabajadores de CLI en paralelo — encadenamiento de una sola terminal &&, nombres de sesión únicos, ≤3 trabajadores concurrentes por host. --session-id por sí solo no es suficiente bajo la contención del daemon.
  • Trampas comuneseval devuelve valores citados en JSON, open sale con un código distinto de cero tras una navegación exitosa, wait --load networkidle tiene una carrera en sesiones frías, las sesiones terminan cuando se cierra la conexión.
  • Referencia completa de comandos — cada bandera para new-session, open, wait, eval, get, click, fill, snapshot, auth, profile, recording, stop, etc.

4. Verifica que la habilidad esté conectada

Antes de tu primer raspado real de Google, realiza una prueba básica de la instalación con un pedido seguro:

"Usando la habilidad de Scrapeless, abre https://example.com y dime el título de la página."

Tu agente debería crear una sesión, abrir la página y responder con "Example Domain". Si eso funciona, estás listo para raspar Google.

Si falla:

Síntoma Causa probable Solución
"No tengo una herramienta/habilidad para hacer eso" La habilidad no está cargada en esta sesión de agente Reinstala siguiendo la guía de instalación de habilidades y recarga el agente
Autenticación fallida / 401 Clave API no establecida Vuelve a ejecutar scrapeless-scraping-browser config set apiKey <token> (Paso de instalación 2)
comando no encontrado Binario CLI faltante en el PATH Vuelve a ejecutar el Paso de instalación 1 (npm install -g scrapeless-scraping-browser)
Aterriza en /sorry/index (muro de CAPTCHA de Google) Proxy de EE. UU. bajo carga Pide al agente que intente de nuevo en un proxy DE/GB/JP/FR/CA — la habilidad sabe rotar
Se queda colgado / aterriza en chrome://new-tab-page/ Carrera de espera en sesión fría El agente debería volver a intentar — wait 1500 entre open y wait --load networkidle está en el manual de la habilidad

Cómo usar esto: solicita a tu agente

Después de la instalación, raspas Google hablando con tu agente — no copiando y pegando bash. La habilidad carga selectores de unión, la estrategia de espera adaptada a Google y el patrón de descubrir→extraer en el contexto del agente, por lo que un pedido de una sola línea es suficiente para obtener un JSON limpio de SERP.

Pedidos que puedes pegar

Dices a tu agente Lo que recibes
"Raspa los 10 mejores resultados de Google para 'las mejores zapatillas para correr'" Lista JSON, solo orgánica, campos {posición, título, url, url mostrada, fragmento}
"Raspa Google por 'airpods' en las páginas 1–3, deduplicado, guarda como airpods-serp.json" Archivo JSON único, 3 páginas SERP fusionadas + deduplicadas por URL
"¿Cuál es el fragmento destacado de Google para '¿cuánto mide la torre Eiffel?'?" El texto de la respuesta, con cascada de selectores + respaldo del cuerpo regex
"Extrae el Panel de Conocimiento de Albert Einstein" Mapa JSON de data-attrid → valor (nacido, fallecido, cónyuge, etc.)
"Obtén todas las preguntas de la sección 'La gente también pregunta' sobre 'las mejores zapatillas para correr' y sus respuestas" Array de {pregunta, respuesta}
"Rastrea la presencia de AI Overview sobre '¿qué es el aprendizaje automático?' para 5 encuestas a 30 s de distancia" Bucle con guardia de longitud de contenido, devuelve presencia + cuerpo para cada encuesta
"¿Qué está mostrando Google por 'wetter' en una IP alemana?" Sesión creada con --proxy-country DE, resultados en lengua nativa
"Fragmento destacado para '¿es legal bitcoin en Japón?': devuelve solo el texto de la respuesta" Cadena de respuesta sin formato, sin contenido adicional
"Obtén la barra de búsquedas relacionadas para 'aprendizaje automático'" Array de 8–10 sugerencias de consulta de la barra inferior de la página
"Raspa la vertical de noticias de Google para 'vehículos eléctricos' de la semana pasada" URL con &tbm=nws&tbs=qdr:w aplicado automáticamente
"Forzar el diseño clásico de SERP para '¿qué es python?' — sin AI Overview" URL con &udm=14 aplicado; diseño limpio de 10 orgánicos

Ejemplo práctico: raspa Google por "airpods" en 3 páginas

Escribes:

"Raspa Google por 'airpods' en las páginas 1–3, deduplicado por URL, guarda como airpods-serp.json. Solo resultados orgánicos: título, url, fragmento."

El plan del agente (en inglés simple):

  1. Crea tres sesiones de salida de EE. UU., una por página (estado limpio por página es mejor que reutilizar una sesión que varía).
  2. Abre https://www.google.com/search?q=airpods&hl=en&gl=us&start={0,10,20}, luego wait 5000 (los rastreadores de Google nunca están completamente inactivos, por lo que una espera fija es mejor que networkidle).
  3. Confirma que el conteo de div[data-ved][data-hveid] sea ≥ 8 — la señal cargada de que la SERP se ha renderizado realmente.
  4. eval el extractor de selector de unión (div.VwiC3b, div[data-content-feature="1"], .lEBKkf, span.st, .MUxGbd) — Google rota estos en variantes A/B, consultar todos ellos sobrevive a la rotación.
  5. Filtra a título && url && fragmento, deduplica por URL, escribe el archivo.

Lo que recibes (airpods-serp.json, abreviado):

json Copy
[
  { "página": 1, "título": "AirPods", "url": "https://www.apple.com/airpods/",
    "fragmento": "Los AirPods ofrecen una experiencia de auriculares inalámbricos inigualable..." },
  { "página": 1, "título": "Apple AirPods Auriculares Inalámbricos, Auriculares Bluetooth ...",
    "url": "https://www.amazon.com/Apple-AirPods-Charging-Latest-Model/dp/B07PXGQC1Q",
    "fragmento": "Los nuevos AirPods combinan un diseño inteligente con tecnología innovadora..." },
  { "página": 1, "título": "AirPods", "url": "https://en.wikipedia.org/wiki/AirPods",
json Copy
"fragmento": "Los AirPods son auriculares inalámbricos Bluetooth diseñados por Apple..." },
  { "página": 2, "título": "Mejores AirPods para 2026: Probados y Revisados por Expertos",
    "url": "https://www.cnet.com/tech/mobile/best-apple-airpods/",
    "fragmento": "Pros - Diseño más ligero, más compacto y ajuste cómodo..." },
  { "página": 3, "título": "Qué Esperar de los Próximos AirPods Pro, Lanzamiento en ...",
    "url": "https://www.macrumors.com/2026/04/22/airpods-pro-cameras-2026/",
    "fragmento": "Las cámaras infrarrojas podrían reconocer gestos manuales..." }

Google devuelve 10 resultados orgánicos por SERP. El selector ingenuo — "el contenedor debe tener h3 Y ancla Y fragmento" — produce solo 6 porque 4 de los 10 son tarjetas que no son fragmentos (previews de video, anuncios de compras, bloques de Twitter). El patrón resiliente es consultar cada campo de manera independiente y agrupar por contenedor.

bash Copy
scrapeless-scraping-browser --session-id $SESSION eval '
(function(){
  const out = [];
  document.querySelectorAll("div[data-ved][data-hveid]").forEach((r, i) => {
    const h3 = r.querySelector("h3");
    const a  = r.querySelector("a[href^=\"http\"]");
    const sn = r.querySelector(
      "div.VwiC3b, div[data-content-feature=\"1\"], .lEBKkf, span.st, .MUxGbd"
    );
    const cite = r.querySelector("cite");

    // Omitir contenedores que NO tienen título y NO tienen ancla (cajas decorativas)
    if (!h3 && !a) return;

    out.push({
      position:     i + 1,
      title:        h3?.textContent?.trim() || null,
      url:          a?.href || null,
      displayedUrl: cite?.textContent?.trim() || null,
      snippet:      sn?.textContent?.trim()?.slice(0, 300) || null,
    });
  });
  return JSON.stringify(out);
})()
' > google-organic.json

jq '. | length' google-organic.json                              # paso crudo — esperar muchos
jq 'map(select(.title and .url)) | length' google-organic.json   # orgánico + subconjunto de características
jq 'map(select(.title and .url and .snippet))' google-organic.json  # solo orgánico canónico

Observaciones honestas de la ejecución de verificación (consulta scrapeless, 2026-04-24 Ubuntu):

  • El paso crudo arrojó 80 contenedores bajo la combinación data-ved][data-hveid después del filtro de "tiene título o URL". Google devuelve muchas tarjetas/controles de características que comparten este par de atributos.
  • Aplicar title != null && url != null se reduce a 16 elementos — el conjunto de trabajo útil que incluye resultados orgánicos + entradas de PAA + enlaces al panel de conocimiento.
  • Aplicar title && url && snippet se reduce aún más a ~10 — el subconjunto orgánico canónico. Esta es la estricta lista de 10 por SERP.
  • Elige el filtro apropiado para tu caso de uso: los rastreadores de posiciones generalmente quieren los 10 canónicos; los pipelines de minería de contexto generalmente quieren el conjunto de trabajo de 16 elementos.
  • El conteo de cite fue 14 en la misma página — espera que cite coincida o supere el conteo orgánico canónico ya que algunas características (entradas de PAA, anuncios) también muestran un cite.

Paso 4 — Extraer características de SERP (Fragmento Destacado, PAA, Panel de Conocimiento, Relacionado)

Google superpone varios tipos de características sobre la lista orgánica. Cada uno tiene su propio patrón de extracción.

4a — Fragmento Destacado (con fallback de regex de texto)

Google ha estado moviendo progresivamente el texto de respuesta del contenedor clásico .kno-rdesc a fragmentos de Panel de Conocimiento por atributo (span.T286Pc para medidas, por ejemplo). El patrón resiliente es una cascada de selectores más un fallback de regex de texto del cuerpo.

bash Copy
scrapeless-scraping-browser --session-id $SESSION open \
  "https://www.google.com/search?q=how+tall+is+the+eiffel+tower&hl=en&gl=us"
scrapeless-scraping-browser --session-id $SESSION wait 5000

scrapeless-scraping-browser --session-id $SESSION eval '
(function(){
  // Paso 1 — cascada de selectores (clásico → moderno)
  const selectors = [
    ".kno-rdesc",
    "[data-attrid=\"wa:/description\"]",
    ".IZ6rdc",
    ".hgKElc",
    "span.T286Pc",               // 2026 — fragmentos por atributo
    "[data-attrid] .LrzXr",      // datos del Panel de Conocimiento
  ];
  for (const sel of selectors) {
    const el = document.querySelector(sel);
    if (el && el.textContent.trim().length > 10) {
      return JSON.stringify({ source: "selector", selector: sel, text: el.textContent.trim() });
    }
  }

  // Paso 2 — fallback de regex de texto del cuerpo para respuestas numéricas
  const body = document.body.innerText;
  const m = body.match(/([0-9][0-9,\. ]*(meters|feet|metres|m|ft|km|miles|°F|°C|%)[^\.]{0,40})/i);
  if (m) return JSON.stringify({ source: "regex", text: m[0].trim() });

  return JSON.stringify({ source: null, text: null });
})()
'

4b — La Gente También Pregunta

bash Copy
scrapeless-scraping-browser --session-id $SESSION open \
  "https://www.google.com/search?q=best+running+shoes&hl=en&gl=us"
scrapeless-scraping-browser --session-id $SESSION wait 5000

scrapeless-scraping-browser --session-id $SESSION eval '
(function(){
  const out = [];
  document.querySelectorAll(".related-question-pair, div[jsname=\"N760b\"]").forEach(q => {
    const text = q.textContent.trim();
    if (text.length > 5) out.push({ question: text.slice(0, 200) });
  });
  return JSON.stringify(out);
})()
'

El conteo fue de 5 preguntas en la consulta "mejores zapatos para correr" durante la ejecución de verificación. Para cada pregunta, haz clic para expandir y volver a capturar para extraer el cuerpo de la respuesta.

4c — Panel de Conocimiento a través del mapa de data-attrid

Las consultas de entidades (personas, lugares, empresas, monumentos) generan un Panel de Conocimiento — un mapa de atributos estructurados que es una de las superficies más estables en Google en 2026.

bash Copy
scrapeless-scraping-browser --session-id $SESSION open \

"https://www.google.com/search?q=Albert+Einstein&hl=es&gl=es"
scrapeless-scraping-browser --session-id $SESSION wait 5000

scrapeless-scraping-browser --session-id $SESSION eval '
(function(){
  const attrs = {};
  document.querySelectorAll("div[data-attrid]").forEach(el => {
    const key = el.getAttribute("data-attrid");
    const val = el.textContent.trim().replace(/\s+/g, " ").slice(0, 200);
    if (key && val && !attrs[key]) attrs[key] = val;
  });
  return JSON.stringify({
    title:       document.querySelector("[data-attrid=\"title\"]")?.textContent?.trim() || null,
    attrCount:   Object.keys(attrs).length,
    attrs:       attrs,
  });
})()
'

20 atributos sobre "Albert Einstein" en la ejecución de verificación de Ubuntu; ejecuciones posteriores contra proxies de GB/US informaron 15–18 — la localización del lado del proxy afecta qué datos aparecen, no si el selector funciona. Las claves siguen un esquema como kc:/people/person:born, kc:/people/person:died, kc:/people/person:spouse.

4d — Búsquedas Relacionadas

bash Copy
scrapeless-scraping-browser --session-id $SESSION eval '
(function(){
  const out = [];
  document.querySelectorAll("#bres a, .brs_col a, .AJLUJb, [data-reltq]").forEach(a => {
    const t = a.textContent.trim();
    if (t.length > 1 && t.length < 80) out.push(t);
  });
  return JSON.stringify(out.slice(0, 10));
})()
'

10 consultas relacionadas devueltas sobre "Albert Einstein" — la franja en la parte inferior de la página es una fuente confiable para la expansión de consultas en minería de temas.


Paso 5 — Paginación, localización y el SERP clásico

5a — Paginación a través de start=N

Google pagina con &start=0, &start=10, &start=20 …hasta &start=90 (profundidad práctica de 10 páginas; el parámetro &num= fue deshabilitado en septiembre de 2025 y cada página ahora devuelve exactamente 10 resultados orgánicos).

Generar una nueva sesión por página — La maquinaria de historial de desplazamiento de Google degrada la calidad de los resultados dentro de una sola sesión a lo largo de múltiples saltos de paginación.

bash Copy
for START in 0 10 20 30 40 50; do
  SID=$(scrapeless-scraping-browser new-session \
    --name "gs-page-$START" --ttl 300 --proxy-country DE --json \
    | jq -r '.data.taskId')

  scrapeless-scraping-browser --session-id $SID open \
    "https://www.google.com/search?q=scrapeless&hl=es&gl=es&start=$START"
  scrapeless-scraping-browser --session-id $SID wait 5000

  scrapeless-scraping-browser --session-id $SID eval '
    JSON.stringify(Array.from(
      document.querySelectorAll("div[data-ved][data-hveid] a[href^=\"http\"]")
    ).slice(0, 10).map(a => a.href))
  ' > "google-page-$START.json"

  scrapeless-scraping-browser stop $SID >/dev/null 2>&1
  sleep 2
done

En la ejecución de verificación, la página 2 (start=10) devolvió 10 URL con cero superposición con la página 1 — paginación limpia.

5b — Localización (hl, gl)

bash Copy
# Usuario alemán en Alemania
DE_SID=$(scrapeless-scraping-browser new-session \
  --name "gs-de" --ttl 600 --proxy-country DE --json | jq -r '.data.taskId')

scrapeless-scraping-browser --session-id $DE_SID open \
  "https://www.google.com/search?q=wetter&hl=de&gl=de"
scrapeless-scraping-browser --session-id $DE_SID wait 5000

El país del proxy (DE) y los parámetros de URL (hl=de&gl=de) deben coincidir. Las combinaciones desajustadas pueden activar la pared de consentimiento en el tráfico de .eu (consent.google.com/*) — haz clic en el botón Rechazar/Aceptar a través de eval para descartar antes de la extracción.

5c — Diseño Clásico a través de udm=14 (supresión de Resumen de IA)

Agregar &udm=14 obliga al SERP "clásico" de Google — sin Resumen de IA, solo orgánico. Útil para la reproducibilidad y para pipelines que necesitan un diseño estable de 10 resultados orgánicos.

bash Copy
scrapeless-scraping-browser --session-id $SESSION open \
  "https://www.google.com/search?q=qué+es+machine+learning&hl=es&gl=es&udm=14"
scrapeless-scraping-browser --session-id $SESSION wait 5000

Verificado: udm=14 devolvió 40 contenedores orgánicos y cero Resumen de IA en la consulta de prueba — un diseño clásico limpio.

Otros parámetros útiles:

Parámetro Efecto
&tbm=nws Vertical de Noticias
&tbm=shop Vertical de Compras
&udm=2 Vertical de Imágenes (reemplazó tbm=isch en 2026)
&tbs=qdr:w Solo la última semana
&tbs=qdr:d Solo las últimas 24 horas
&udm=14 SERP Clásico (sin Resumen de IA)

Paso 6 — Extracción de Resumen de IA (SGE) — no determinístico

El Resumen de IA se renderiza para algunas consultas pero no para otras, y la misma consulta puede o no retornar uno en repetición — la tasa de renderización varía según el tema, la localidad, el estado de la cuenta y la sesión. Diseña el pipeline para aceptar ambos resultados (presente: true y presente: false) como normales.

bash Copy
AI_SID=$(scrapeless-scraping-browser new-session \
  --name "gs-ai" --ttl 600 --proxy-country DE --json | jq -r '.data.taskId')
scrapeless-scraping-browser --session-id $AI_SID open \
  "https://www.google.com/search?q=qué+es+el+aprendizaje+automático&hl=es&gl=us"
scrapeless-scraping-browser --session-id $AI_SID wait 5000

# Sondeos de hasta 10 s — AI Overview se renderiza de manera asincrónica.
# IMPORTANTE: los selectores de contenedor coinciden con un elemento de marcador de posición en consultas
# donde NO se sirvió AI Overview. Siempre protege la longitud de textContent > 100
# antes de declarar "present=true" — de lo contrario, obtienes falsos positivos con
# text_len=0, cites=0.
for i in 1 2 3 4 5; do
  PRESENT=$(scrapeless-scraping-browser --session-id $AI_SID eval '
    (function(){
      const ai = document.querySelector(
        "[data-subtree=\"gw\"], .yp, .LT6XE, [aria-label*=\"AI Overview\"], [jsname=\"uIYcDb\"]"
      );
      if (!ai || ai.textContent.trim().length < 100) return "no";
      return "yes";
    })()
  ' | tail -1 | tr -d '"')
  [ "$PRESENT" = "yes" ] && break
  sleep 2
done

scrapeless-scraping-browser --session-id $AI_SID eval '
(function(){
  const ai = document.querySelector(
    "[data-subtree=\"gw\"], .yp, .LT6XE, [aria-label*=\"AI Overview\"], [jsname=\"uIYcDb\"]"
  );
  // Guardia de longitud de contenido: los selectores de contenedor dan falsos positivos en un
  // elemento de marcador de posición cuando AI Overview no se renderiza realmente.
  if (!ai || ai.textContent.trim().length < 100) {
    // Heurística de texto corporal secundaria antes de declarar ausencia
    const bodyHit = /AI Overview|Generated with AI/i.test(document.body.innerText);
    return JSON.stringify({ present: false, body_heuristic: bodyHit });
  }
  const citations = Array.from(ai.querySelectorAll("a[href^=\"http\"]"))
    .slice(0, 8)
    .map(a => ({ url: a.href, text: a.textContent.trim().slice(0, 80) }));
  return JSON.stringify({
    present: true,
    text:    ai.textContent.trim().slice(0, 800),
    citations,
  });
})()
'

En las ejecuciones de verificación, el enfoque ingenuo de querySelector dio falsos positivos en qué es el aprendizaje automático — el elemento de marcador de posición existe independientemente de si AI Overview se renderiza realmente, devolviendo present: true, text_len: 0, cites: 0. La guardia de longitud de contenido anterior (textContent.length < 100 ⇒ tratar como ausente) es obligatoria, no opcional.

Los pipelines de producción deberían:

  1. Aceptar present: false como normal — no un fallo.
  2. Opcionalmente volver a consultar en una nueva sesión después de 60 segundos — la presencia de AI Overview varía a través de breves ventanas de tiempo.
  3. Usar &udm=14 para forzar SERP clásico cuando AI Overview se desea activamente evitar (Paso 5c).
  4. Registrar casos body_heuristic: true — estas son señales útiles cuando los selectores de contenedor fallan pero el texto del cuerpo confirma que AI Overview se renderizó. Eso justifica un paso de descubrimiento de selectores al estilo del Paso 2 para capturar el nuevo contenedor.

Paso 7 — Escalado: aislar el estado de CLI por trabajador

Una trampa importante detectada durante la verificación: la CLI de Scrapeless no aísla el estado del daemon entre múltiples terminales en el mismo host. Ejecutar tres terminales que cada una genera su propia sesión a través de new-session y luego navegan concurrentemente colapsa a un solo ganador — las otras dos terminales terminan consultando el mismo contexto de navegador subyacente, y dos de las tres llamadas eval devuelven 0 nodos orgánicos.

Este es un problema de estado local a nivel de CLI, no un problema de ID de sesión. Pasar --session-id correctamente en cada llamada no es suficiente; el daemon compartido de la CLI, los archivos PID/puerto y la caché de pool de sesiones en el host local sobrescriben --session-id bajo carga paralela.

Los primitivos que realmente funcionan (verificados en más de 10 agentes CLI paralelos el 26-04-2026):

  1. Encadenamiento && en un solo shell — encadena cada llamada CLI para un trabajo en una única invocación atómica de shell; otros trabajadores no pueden intercalarse entre tus pasos. Este es el primitivo que sostiene la carga.
  2. Nombres de sesión únicos por trabajador — el puerto del daemon se genera a partir del nombre; nombres únicos evitan colisiones de puerto.
  3. Limitar a ~3 trabajadores concurrentes por host — empíricamente más allá de eso, aparecen errores transitorios como chrome://new-tab-page/, ERR_TUNNEL_CONNECTION_FAILED, y "sesión terminada".
  4. Las variables de entorno USERPROFILE/HOME están documentadas en la habilidad upstream pero NO aíslan el binario Rust v0.1.1 en Windows durante la verificación. No dependas de ellas. Para más distribución, divide entre hosts.

Patrones de reserva:

  • Dividir entre hosts. Una vez que superes ~3 trabajadores en vuelo por host, mueve trabajadores adicionales a máquinas separadas (cada host obtiene su propio daemon). Esto todavía funciona porque el estado del daemon es por host, no por cuenta.
  • Secuencial por host. Corre una búsqueda de SERP a la vez por host; pon el resto en cola. Sencillo, más lento, y suficiente para pipelines pequeños.

La concurrencia sin encadenamiento en un solo shell está bien para ≤ 1 petición en vuelo a la vez. No presiones más allá de eso a menos que toda la secuencia de llamadas de cada trabajador (new-session && open && wait && eval) viva en un único comando de shell atómico.


Lo que obtienes de vuelta

El esquema canónico para una encuesta de SERP de Google se ve así. Los valores de organic[0] a continuación son la respuesta en vivo capturada para la consulta scrapeless en una sesión de egreso de DE (verificación del 27-04-2026):

json Copy
{
  "query": "scrapeless",
  "timestamp": "2026-04-27T15:42:00Z",
  "locale": { "hl": "en", "gl": "us" },
  "organic": [
    {
      "position": 1,
      "title": "Scrapeless: Herramienta de Raspado Web sin Esfuerzo",
      "url": "https://www.scrapeless.com/",
      "displayedUrl": "https://www.scrapeless.com",
      "snippet": "Scrapeless ofrece servicios de raspado web y automatización robustos, escalables y potenciados por IA, en los que confían las principales empresas. Nuestras soluciones de nivel empresarial son..."
    }
  ],
  "organicCount":   10,
  "citeCount":      14,
  "featuredSnippet": null,
  "peopleAlsoAsk":   [],
  "knowledgePanel":  null,
  "relatedSearches": [],
  "aiOverview":     { "present": false },
  "errors":         []
}

Observaciones honestas:

  • organicCount frecuentemente será 10, pero el conteo total de "tarjetas" en la página puede ser de 100+ — filtrar estrictamente basada en la presencia de h3 + anchor.
  • featuredSnippet.source en tuberías de producción debería ser uno de "selector-classic", "selector-attrid", "selector-T286Pc" o "regex-body-text", para que los consumidores de downstream sepan cuánto pueden confiar en cada campo.
  • aiOverview.present: false es un estado válido, no un error — la visión general de IA es no determinista por consulta.

¿Necesitas JSON estructurado sin trabajo de DOM? Usa la API de Scraper

El enfoque del Navegador de Raspado anterior te da total flexibilidad — tú controlas los selectores, la estrategia de espera y la forma exacta del JSON. Si prefieres omitir completamente el DOM y recibir JSON estructurado de SERP de Google directamente, Scrapeless ofrece una dedicada API de Scraper de Búsqueda de Google:

Superficie Navegador de Raspado (esta publicación) API de Scraper de Búsqueda de Google
Control sobre selectores Completo — tú escribes cada querySelector Ninguno — la API retorna un esquema JSON fijo
Costo de exploración del DOM Tú lees HTML en vivo primero Ninguno — envías {q, hl, gl} y recibes JSON
Latencia por solicitud 2 s mínimo + 5–10 s de renderizado Un solo viaje de ida en HTTP
Mejor para Campos personalizados, características de SERP, visión general de IA, diseños no estándar Seguimiento de rangos estructurado, tuberías de alto QPS
Modelo de costo Facturado por minuto de sesión Facturado por llamada a la API
Concurrencia Encadenamiento de && en una sola terminal + nombres de sesión únicos; límite de ~3 trabajadores/anfitrión (Paso 7) Lado de la API — sin estado del navegador que gestionar

Para tuberías que monitorizan un pequeño conjunto de palabras clave en un horario constante, la API suele ser más barata y simple. Para trabajo personalizado de selectores, recolección de vista general de IA y diseños no estándar, el Navegador de Raspado es el camino flexible.

Conclusión

Raspar Google Search en 2026 ya no se trata de recopilar HTML estático. Requiere un flujo de trabajo que pueda manejar diseños de SERP en rotación, lógica de espera fija, sesiones conscientes del locale, y extracción a nivel de características a través de resultados orgánicos, Preguntas Frecuentes, Paneles de Conocimiento, Fragmentos Destacados, Búsquedas Relacionadas y Visión General de IA.

Scrapeless Scraping Browser le brinda a los equipos una forma práctica de hacerlo en producción. Con proxies residenciales, huellas dactilares anti-detección, renderizado de JavaScript y control geo a nivel de sesión, reduce la carga de mantenimiento de raspar Google mientras mantiene el flujo de trabajo lo suficientemente flexible para selectores personalizados y diseños no estándar. Para equipos que desean un camino más simple de datos estructurados, la API de Scraper de Búsqueda de Google de Scrapeless es la opción más rápida.

¿Listo para raspar ahora?

Únete a nuestra vibrante comunidad para reclamar un plan gratuito de $5-10 y conectarte con otros innovadores:

Comunidad Oficial de Discord de Scrapeless
Comunidad Oficial de Telegram de Scrapeless


FAQ

P: ¿Puedo evitar proxies?
R: No de manera confiable. Los rangos de IP de centros de datos son filtrados agresivamente por el borde de Google, y los patrones de solicitud desde una sola IP atraen rápidamente la limitación. Los proxies residenciales (--proxy-country DE para Google, ver Paso 1) son el primitivo que soporta la carga para el raspado sostenido.

P: ¿Por qué wait --load networkidle toma ~14 segundos en Google?
R: Google emite XHRs de anuncios/seguimiento continuos — networkidle requiere una ventana de silencio de 500 ms antes de dispararse, y las ventanas de silencio de Google son raras. Usa el wait 5000 fijo del Paso 2 más un chequeo de conteo de div[data-ved][data-hveid] en lugar de confiar en networkidle.

P: ¿Por qué usar Scrapeless Scraping Browser para el raspado de Google en lugar de una configuración local de navegador?
Porque Google Search es altamente dinámico y está lleno de medidas anti-bots. Scrapeless maneja el enrutamiento de proxies, la huella dactilar y el renderizado en la nube, lo que hace que el flujo de trabajo de raspado sea mucho más estable que mantener trabajos locales de Playwright o Puppeteer.

P: ¿Puede Scrapeless extraer Resumen de AI, Fragmentos Destacados y Preguntas Relacionadas?
Sí. El flujo de trabajo del navegador está diseñado para la extracción a nivel de funciones, por lo que puedes obtener resultados orgánicos, Fragmentos Destacados, PAA, Paneles de Conocimiento, Búsquedas Relacionadas y Resumen de AI a partir del mismo patrón de sesión.

P: ¿Cuándo debo usar la API de Google Search Scraper en su lugar?
Usa la API cuando desees un JSON estructurado con menos trabajo de selección y menor sobrecarga operativa. Usa Scraping Browser cuando necesites extracción personalizada, resistencia al diseño o control directo sobre cómo se lee cada función SERP.

P: ¿Scrapeless admite raspado de Google en múltiples ubicaciones?
Sí. Puedes alinear la geografía del proxy, el idioma y la zona horaria por sesión, lo que ayuda a mantener los resultados consistentes en diferentes mercados y variaciones locales de SERP.

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