Volver al blog

Construye un rastreador de posiciones con Scrapeless Deep SerpApi

Emily Chen
Emily Chen

Advanced Data Extraction Specialist

29-Jun-2026

Resumen:

  • Un rastreador de posiciones es un bucle, no una hoja de cálculo. Consulta a Google por cada palabra clave, lee las posiciones orgánicas, encuentra dónde se ubica tu dominio y anota el número en un horario; esa es toda la máquina.
  • La parte difícil es obtener un SERP limpio y procesable. Google personaliza y limita los resultados por tasa, así que un rastreador de posiciones necesita una fuente de búsqueda que devuelva organic_results estructurados con una position y link estables en cada llamada.
  • Scrapeless Deep SerpApi devuelve los resultados de Google como JSON sin scraping. Una POST con {"q": "<keyword>"} contra el actor scraper.google.search devuelve un array de organic_results — cada entrada lleva una position y un link, que es todo lo que necesita un rastreador de posiciones para igualar tu dominio.
  • La comparación de dominios es una comparación de host, no una búsqueda de cadena. Analiza el link de cada resultado hasta su host, quita www. y compara con tu dominio objetivo; así blog.yourdomain.com y yourdomain.com/path cuentan como un acierto.
  • Las instantáneas a lo largo del tiempo convierten posiciones en deltas. Almacena cada ejecución claveada por fecha, luego compara hoy con la última ejecución almacenada para ver qué palabras clave subieron, bajaron o cayeron completamente de los resultados.
  • Gratis para empezar. Las nuevas cuentas de Scrapeless incluyen créditos gratuitos de Deep SerpApi; regístrate en app.scrapeless.com y ejecuta el rastreador en esta guía con tu propio conjunto de palabras clave.

Introducción: construye el rastreador de posiciones, no lo alquiles

El rango de búsqueda es una posición en una lista. Para una palabra clave dada, tu dominio se encuentra en la posición orgánica 3, 11, o en ningún lugar de la primera página; y ese número cambia a medida que Google reordena y los competidores publican. Hacer seguimiento es la diferencia entre saber que una página bajó de 4 a 9 la semana pasada y enterarte cuando el tráfico ya se ha ido.

La mayoría de las guías de "construir un rastreador de posiciones" terminan en un Google Sheet que actualizas manualmente, o en una fórmula que raspa una celda a la vez y se rompe en el momento en que Google cambia su marcado. Eso funciona para cinco palabras clave revisadas una vez al mes. No se escala a un conjunto de palabras clave que realmente te importa, y no te da ningún historial con el que diferenciar.

Esta guía construye un rastreador de posiciones programático real en Python sobre Scrapeless Deep SerpApi. La API devuelve los resultados orgánicos de Google como JSON estructurado, así que el rastreador se mantiene pequeño: consulta una palabra clave, analiza las posiciones, iguala tu dominio, almacena la instantánea y diferencia las ejecuciones para calcular el movimiento. Al final tendrás un script que puedes apuntar a cualquier conjunto de palabras clave y ejecutar en un horario.


Lo Que Puedes Hacer Con un Rastreador de Posiciones Programático

  • Rastrear un conjunto de palabras clave en un horario. Ejecuta el mismo script a diario o semanalmente contra docenas de palabras clave y construye un historial de posiciones sin tocar un navegador.
  • Observa la difusión de palabras clave de una sola página. Apunta el rastreador a las palabras clave objetivo de una URL y ve qué términos clasifica y dónde.
  • Detecta caídas antes de que lo haga el tráfico. Una posición que se mueve de 5 a 14 es una señal sobre la que puedes actuar el mismo día en que sucede, no al final del mes.
  • Compara rankings regionales. La misma palabra clave tiene un rango diferente por país, así que un rastreador que varía el parámetro gl muestra tu posición en cada mercado.
  • Alimenta rankings en tus propios tableros. Dado que cada resultado es JSON, los datos de posición se envían directamente a una base de datos, un cuaderno o un trabajo de informes sin necesidad de scraping.
  • Audita una migración o rediseño. Toma instantáneas de rankings antes de un cambio en el sitio y diferencia después, para que una regresión aparezca como una lista de palabras clave caídas.

Por Qué Scrapeless Deep SerpApi

Scrapeless Deep SerpApi es un punto final de búsqueda de Google gestionado que devuelve el SERP como JSON estructurado en lugar de HTML en bruto. Para un rastreador de posiciones específicamente, trae:

  • organic_results estructurados — cada resultado es un objeto con position, title y link, por lo que no hay necesidad de analizar HTML ni de un selector CSS que se rompa con el próximo cambio de diseño de Google.
  • Un campo position estable — la API informa el rango de cada resultado orgánico, que es el valor exacto que un rastreador de posiciones registra.
  • Control de país e idioma — los parámetros gl y hl te permiten medir rankings por mercado desde un solo punto final.
  • Egreso residencial bajo el capó — las búsquedas se realizan a través de proxies residenciales en más de 195 países, por lo que los resultados reflejan un SERP real de un usuario en lugar de uno marcado por un centro de datos.
  • Una respuesta en línea — el actor scraper.google.search devuelve resultados en la misma solicitud, por lo que el rastreador lee el JSON directamente sin un paso de sondeo.

Obtén tu clave API en el plan gratuito en app.scrapeless.com.


Requisitos Previos

  • Python 3.10 o más reciente
  • La biblioteca requests (pip install requests)
  • Una cuenta de Scrapeless y una clave API; regístrate en app.scrapeless.com
  • Un conjunto de palabras clave y el dominio objetivo que deseas rastrear
  • Familiaridad básica con la terminal

Lee tu clave API desde el entorno para que nunca termine en el script:

bash Copy
```bash
export SCRAPELESS_API_KEY="tu_token_api_aqui"

Paso 1 — Consulta a Google por una palabra clave

La unidad más pequeña del rastreador es una consulta por palabra clave. Envía un POST al punto final de Deep SerpApi con el actor scraper.google.search y un objeto input que contenga la consulta. El campo q es la palabra clave; gl y hl establecen el país y el idioma de la interfaz, de modo que cada ejecución mida el mismo mercado.

python Copy
import os
import requests

ENDPOINT = "https://api.scrapeless.com/api/v1/scraper/request"


def search(query, gl="us", hl="en"):
    payload = {
        "actor": "scraper.google.search",
        "input": {"q": query, "gl": gl, "hl": hl},
    }
    response = requests.post(
        ENDPOINT,
        json=payload,
        headers={"x-api-token": os.environ["SCRAPELESS_API_KEY"]},
    )
    response.raise_for_status()
    return response.json()


data = search("scrapeless scraping browser")
results = data.get("organic_results", [])
print(f"{len(results)} resultados orgánicos")
for result in results[:5]:
    print(result["position"], result["link"])

La respuesta es un objeto JSON devuelto en una sola ronda de semántica HTTP; organic_results es el arreglo que lee el rastreador. Cada elemento lleva una position (el rango en la página) y un link (la URL del resultado). title, snippet y source también están presentes, pero un rastreador de rango solo necesita position y link.


Paso 2 — Analiza las posiciones orgánicas

La consulta en el Paso 1 devuelve el objeto SERP completo: resultados orgánicos, además de anuncios, búsquedas relacionadas y videos en línea cuando Google los muestra. El rastreador trabaja solo con organic_results, y solo con dos campos por entrada. Reduce cada resultado a un par (position, link) para que el paso de coincidencia tenga una lista limpia para escanear.

python Copy
def organic_positions(data):
    pairs = []
    for result in data.get("organic_results", []):
        pairs.append((result["position"], result["link"]))
    return pairs


positions = organic_positions(search("scrapeless scraping browser"))
for position, link in positions:
    print(position, link)

position es el rango que Google asignó al resultado en la página devuelta. Léelo directamente desde el campo en lugar de contar el índice de la lista, para que el valor se mantenga correcto incluso cuando la API omita un tipo de resultado o la composición de la página cambie entre ejecuciones.


Paso 3 — Coincide tu dominio con un rango

Un rango es la position de tu dominio en esa lista. La coincidencia tiene que ser en el host, no en una subcadena de la URL, por lo que una búsqueda de "tudominio" en el enlace en bruto no coincide erróneamente con el camino de un competidor o una cadena de consulta. Analiza cada link a su host, elimina un www. inicial y trata un subdominio como un acierto también.

python Copy
from urllib.parse import urlparse


def host_of(url):
    host = urlparse(url).netloc.lower()
    return host[4:] if host.startswith("www.") else host


def rank_of(domain, data):
    domain = domain.lower()
    for result in data.get("organic_results", []):
        host = host_of(result["link"])
        if host == domain or host.endswith("." + domain):
            return result["position"]
    return None


data = search("scrapeless scraping browser")
rank = rank_of("scrapeless.com", data)
print("scrapeless.com:", rank if rank is not None else "no en los resultados devueltos")

rank_of devuelve la primera posición que tu dominio tiene, o None cuando no aparece en los resultados devueltos. Un None es un dato real: significa que el dominio no está en la página que la API devolvió para esa palabra clave, y el rastreador debe registrar eso, no omitirlo.

Obtén tu clave API en el plan gratuito: app.scrapeless.com


Paso 4 — Rastrea un conjunto de palabras clave y almacena instantáneas

Una sola palabra clave no es un rastreador. Ejecuta la coincidencia a través de un conjunto de palabras clave, marca el resultado con una fecha y añádelo a un archivo de historial. Cada instantánea es una ejecución: una fecha más un mapa de palabras clave a posiciones. Almacenar como lista mantiene la línea de tiempo completa en un solo lugar para el paso de diferencia.

python Copy
import json
from datetime import date, timezone, datetime
from pathlib import Path

HISTORY = Path("rank_history.json")


def snapshot(domain, keywords):
    ranks = {}
    for keyword in keywords:
        ranks[keyword] = rank_of(domain, search(keyword))
    return {"date": date.today().isoformat(), "domain": domain, "ranks": ranks}


def append_snapshot(snap):
    history = json.loads(HISTORY.read_text()) if HISTORY.exists() else []
    history.append(snap)
    HISTORY.write_text(json.dumps(history, indent=2))
    return history


keywords = [
    "scrapeless scraping browser",
    "scrapeless deep serp api",
    "navegador en la nube anti detección",
]
snap = snapshot("scrapeless.com", keywords)
append_snapshot(snap)
for keyword, position in snap["ranks"].items():
    print(f"{position if position is not None else '—':>3}  {keyword}")

Cada ejecución agrega una instantánea. El conjunto de palabras clave es tuyo para definir; intercambia los términos para los que se supone que una página debe clasificar. Las posiciones que regresan None se escriben como null en el historial, por lo que una palabra clave que ha caído de la página es un evento registrado en lugar de un hueco.


Paso 5 — Calcular deltas de rangos entre ejecuciones

El historial solo es útil cuando lo comparas. Compara la última instantánea con la anterior para el mismo dominio y clasifica cada palabra clave: mejorada, caída, sin cambios, nueva clasificada o caída. El delta es la posición anterior menos la actual, por lo que un número positivo significa que el dominio se movió hacia arriba en la página.

python Copy
def deltas(history, domain):
    runs = [s for s in history if s["domain"] == domain]
    if len(runs) < 2:
        return {}
    previous, current = runs[-2]["ranks"], runs[-1]["ranks"]
    report = {}
    for keyword, now in current.items():
        before = previous.get(keyword)
        if now is None and before is not None:
            report[keyword] = "caído de los resultados"
        elif now is not None and before is None:
            report[keyword] = f"nuevo en {now}"
        elif now is not None and before is not None:
            move = before - now
            report[keyword] = "sin cambio" si move == 0 else f"{move:+d} (era {before}, ahora {now})"
    return report


history = json.loads(HISTORY.read_text())
for keyword, change in deltas(history, "scrapeless.com").items():
    print(f"{keyword}: {change}")

En la primera ejecución no hay nada que diferenciar, por lo que deltas devuelve vacío; el rastreador solo almacena la línea de base. Desde la segunda ejecución en adelante, cada palabra clave lleva una etiqueta de movimiento que puedes redirigir a una alerta, un panel de control o un informe semanal. Programa la pareja Paso 4 + Paso 5 con cron o un trabajo de CI y el rastreador de rangos se ejecuta solo.


Lo que obtienes de vuelta

El archivo de historial es la salida del rastreador: una instantánea por ejecución, cada una con una fecha más un mapa de palabra clave a posición. La estructura que sigue es exactamente lo que append_snapshot escribe.

json Copy
// muestra ilustrativa — el esquema es exactamente lo que `append_snapshot` escribe; los valores de los campos son ilustrativos.
[
  {
    "date": "2026-06-16",
    "domain": "tu_dominio.com",
    "ranks": {
      "tu palabra clave principal": 4,
      "tu palabra clave secundaria": 11,
      "una palabra clave por la que aún no clasificas": null
    }
  },
  {
    "date": "2026-06-23",
    "domain": "tu_dominio.com",
    "ranks": {
      "tu palabra clave principal": 2,
      "tu palabra clave secundaria": 9,
      "una palabra clave por la que aún no clasificas": 18
    }
  }
]

Algunas observaciones honestas de ejecuciones de palabras clave en vivo:

  • Los recuentos de posición provienen del campo position de la API. Léelos directamente; no infieras el rango a partir del índice del array, porque la mezcla de resultados devueltos varía entre ejecuciones.
  • Los recuentos de resultados orgánicos varían por consulta. Una palabra clave puede devolver seis resultados orgánicos en una ejecución y ocho en otra, por lo que un None para un dominio de clasificación profunda simplemente puede significar que estaba por debajo del conjunto devuelto ese día.
  • snippet_highlighted_words es condicional. Algunos resultados lo tienen y otros no; un rastreador de rangos lo ignora, pero cualquier cosa que lea otros campos debería tratarlos como anulables.
  • El país importa. La misma palabra clave se clasifica de manera diferente según el valor de gl, así que fija un país por palabra clave rastreada y mantenlo constante en las ejecuciones para comparar manzanas con manzanas.

Conclusión: escala tu canal de seguimiento de rangos

Un rastreador de rangos se reduce a cinco movimientos: consulta una palabra clave, analiza las posiciones orgánicas, coincide tu dominio en el host, almacena una instantánea datada y diferencia con la última ejecución. Basado en Deep SerpApi, cada uno de esos movimientos lee un array estructurado de organic_results en lugar de pelear con el HTML de Google, por lo que todo el rastreador se mantiene por debajo de cien líneas.

A partir de aquí, escálalo a lo largo de los ejes que importan: amplía el conjunto de palabras clave, varía el gl por mercado y empuja instantáneas a una base de datos para que el historial sobreviva a un solo archivo. El mismo enfoque orientado a JSON se extiende a otras superficies cubiertas en la guía de la API de Scrapeless Scraper. Consulta los planes de precios y la documentación de Deep SerpApi para el conjunto completo de parámetros, fija un país por palabra clave, lee posiciones del campo position y trata un dominio ausente como un verdadero null.


¿Listo para construir tu canal de búsqueda potenciado por IA?

Únete a nuestra comunidad para reclamar un plan gratuito y conectarte con desarrolladores que construyen canales de seguimiento de rangos y búsqueda: Discord · Telegram.
Regístrate en app.scrapeless.com para obtener créditos gratuitos de Deep SerpApi y adapta el rastreador anterior al conjunto de palabras clave y mercados que necesita tu proyecto.


FAQ

P: ¿Es legal rastrear las clasificaciones de Google con una API?
Consultar resultados de búsqueda públicamente visibles es generalmente cómo funciona el rastreo de clasificaciones, y Deep SerpApi devuelve el mismo SERP público que lo haría un navegador: las páginas clasificadas que Google ha rastreado e indexado, el mismo conjunto de URLs que los propietarios de sitios exponen a través de el protocolo de Sitemaps. Las reglas varían según la jurisdicción y el caso de uso, así que revisa los términos de Google junto con las directrices de rastreo en el Protocolo de Exclusión de Robots y consulta asesoría legal para tu aplicación específica.

P: ¿En qué se diferencia esto de un rastreador de clasificaciones en Google Sheets?
Un rastreador en hoja de cálculo verifica una celda a la vez y no almacena un historial real para diferenciar. El script aquí consulta un conjunto completo de palabras clave de forma programática, registra instantáneas fechadas y calcula el movimiento entre ejecuciones, por lo que escala a conjuntos de palabras clave grandes y se ejecuta según un cronograma.

P: ¿Necesito un proxy para ejecutar el rastreador?
No se requiere configuración de proxy separada. Deep SerpApi enruta las búsquedas a través de egress residencial en más de 195 países internamente, por lo que los resultados reflejan el SERP de un usuario real sin que tú gestiones IPs.

P: ¿Cómo rastreo clasificaciones para un país específico?
Configura el parámetro gl al código del país y hl al idioma al llamar a search. Mantén el mismo gl para una palabra clave dada en todas las ejecuciones para que el historial de posiciones se compare entre sí.

P: ¿Qué significa una posición null?
Significa que el dominio no estaba presente en los resultados orgánicos que la API devolvió para esa palabra clave en esa ejecución: puede que esté clasificado por debajo del conjunto devuelto o que haya desaparecido de la página. El rastreador lo registra como un evento real para que una caída aparezca en las diferencias.

P: ¿Con qué frecuencia debe ejecutarse el rastreador?
Diariamente o semanalmente cubre la mayoría de las necesidades. Programa el paso de instantánea y diferencia con cron o un trabajo de CI; las posiciones se mueven en el cronograma de Google, por lo que la consulta subdiaria rara vez añade señal.

P: ¿Puedo igualar subdominios y rutas a mi dominio?
Sí. El comparador rank_of compara en el host y trata un subdominio como un acierto, por lo que blog.tudominio.com y tudominio.com/pagina cuentan como tu dominio clasificando.

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