Construya un Conjunto de Datos de Instantáneas SERP de Google para Investigación SEO
Expert Network Defense Engineer
TL;DR:
- El seguimiento de SERP de Google necesita un registro de la búsqueda, no solo una columna de clasificación. Guarda la solicitud exacta, las marcas de tiempo del cliente, el estado del procesamiento y la respuesta en bruto juntas.
- Construye historia a partir de tus propias observaciones. Una solicitud de búsqueda actual no cubre los días antes de que comenzara la recolección.
- Compara resultados orgánicos dentro de un contexto fijo. Los cambios en la consulta, país, idioma o profundidad de recolección crean un grupo de comparación diferente.
Un valor de clasificación pierde su significado cuando la hoja de cálculo ya no registra qué búsqueda lo produjo. La misma página puede aparecer bajo diferentes consultas, en diferentes mercados y junto a diferentes módulos de resultados. Un conjunto de datos útil mantiene esas condiciones adjuntas a cada observación.
El seguimiento de SERP de Google comienza con una recolección repetible y una definición clara de lo que cuenta como un resultado comparable. Scrapeless Google Search API proporciona datos de búsqueda estructurados; la aplicación suministra la política de almacenamiento y la historia. Este artículo establece ese límite explícitamente, desde un archivo de captura hasta un conjunto de datos que otro analista puede inspeccionar.
Define la Observación Antes del Programa
Una instantánea es el resultado guardado de una solicitud de búsqueda configurada. Incluye la entrada enviada y la respuesta recibida por el cliente. No establece todo lo que cada usuario vio para esa consulta.
Escribe el alcance del conjunto de datos antes de programar la recolección. Elige una lista de consultas, contexto de mercado, idioma, tipo de resultado y política de paginación. Asigna cada consulta a un tema de investigación para que un informe posterior pueda explicar por qué se incluyó la consulta. Una pequeña muestra revisada es más fácil de interpretar que una gran colección cuyo propósito cambia cada semana.
Separa el programa de recolección del contexto de búsqueda. El contexto identifica qué observaciones pueden ser comparadas; las marcas de tiempo identifican cuándo la aplicación las solicitó y las recibió. Una marca de tiempo de recibo del cliente no es una afirmación sobre el momento exacto en que Google generó la página.
Mantén Registros En Bruto y Filas Derivadas
El registro en bruto debe retener la solicitud, la respuesta y el estado de recolección. Una fila de resultado derivada debe apuntar de nuevo a ese registro a través de un identificador de ejecución estable.
Mantén campos como position, title, link, y snippet en la proyección de resultados orgánicos cuando estén disponibles. También mantiene el ordinal del arreglo como un campo separado si necesitas preservar el orden de origen. Una posición devuelta faltante debe permanecer faltante; un índice de arreglo no debe reemplazarlo silenciosamente.
El modelo de datos JSON da diferentes significados a arreglos, objetos y nulos. Preserva esas distinciones en el archivo incluso si la capa de informes utiliza más tarde una tabla más simple. La respuesta en bruto hace posible cambiar un mapeo sin recollectar una observación que ya no puede ser reproducida.
Guarda la versión del analizador con los datos derivados. Cuando se corrige un analizador, regenera la proyección afectada y marca la nueva versión. Tratar una actualización de analizador como un cambio de mercado crearía una tendencia falsa.
Requisitos para un Archivo de Captura
Utiliza Python con el paquete requests instalado y una clave API de Scrapeless suministrada a través de SCRAPELESS_API_KEY. Instala el cliente con python3 -m pip install requests. Las importaciones restantes utilizan la biblioteca estándar.
Guarda el script a continuación como capture_snapshot.py y ejecuta python3 capture_snapshot.py. Escribe un archivo JSON único bajo snapshots. Asegúrate de que ese directorio sea escribible y esté incluido en tu política de almacenamiento. El ejemplo es un programa de captura local; no proporciona un programador, base de datos o servicio de recuperación de resultados de tareas.
Una ejecución autenticada requiere tu propia clave de cuenta. No se reclama aquí ningún resultado de cuenta en vivo. La interfaz de solicitud se ha comprobado contra el flujo de trabajo de solicitud de Google Search; el manejo de archivos y estados circundantes se puede probar localmente.
Captura la Solicitud y Su Estado de Procesamiento
El programa de captura envía actor: scraper.google.search con los ajustes de búsqueda dentro de input. La autenticación usa el encabezado x-api-token.
Nota: Este bloque requiere
SCRAPELESS_API_KEYy acceso al servicio. No se ha ejecutado contra una cuenta en vivo para este artículo. Las respuestas de tareas pendientes se guardan para inspección; la recuperación de resultados de tareas está fuera de este ejemplo.
python
import json
import os
import uuid
from datetime import datetime, timezone
from pathlib import Path
import requests
def capture(input_parameters, directory="snapshots"):
key = os.environ["SCRAPELESS_API_KEY"]
request = {"actor": "scraper.google.search", "input": input_parameters}
record = {
"schema_version": 1,
"run_id": str(uuid.uuid4()),
"requested_at": datetime.now(timezone.utc).isoformat(),
"request": request,
}
try:
response = requests.post(
"https://api.scrapeless.com/api/v1/scraper/request",
headers={"x-api-token": key}, json=request, timeout=120,
)
record["http_status"] = response.status_code
record["received_at"] = datetime.now(timezone.utc).isoformat()
try:
payload = response.json()
except ValueError:
payload = None
record["response_text"] = response.text
record["response"] = payload
organic = payload.get("organic_results") if isinstance(payload, dict) else None
if response.status_code == 201:
record["state"] = "pending"
elif response.status_code != 200:
record["state"] = "http_error"
elif not isinstance(organic, list) or any(not isinstance(x, dict) for x in organic):
record["state"] = "unmapped"
else:
record["state"] = "observed" if organic else "empty"
except requests.RequestException as exc:
record["state"] = "transport_error"
record["error_type"] = type(exc).__name__
root = Path(directory)
root.mkdir(parents=True, exist_ok=True)
path = root / (record["run_id"] + ".json")
with path.open("x", encoding="utf-8") as handle:
json.dump(record, handle, ensure_ascii=False, indent=2)
print(path, record["state"])
return path
if __name__ == "__main__":
capture({"q": "coffee", "gl": "us", "hl": "en", "start": 0,
"google_domain": "google.com", "device": "desktop"})
El script escribe el registro después de la operación HTTP, incluyendo resultados de error que son útiles para la cobertura de la colección. Su registro de excepciones contiene el tipo de excepción en lugar de una cadena de diagnóstico completa que podría exponer detalles innecesarios de la solicitud. Almacene las claves por separado de los datos de búsqueda archivados.
El 120 timeout es una elección de la aplicación. No es una garantía de tiempo de respuesta del servicio. Las fechas y horas conscientes de la zona horaria de Python hacen que los tiempos del cliente sean explícitos; utilice la misma convención cuando otro recolector escriba en el conjunto de datos.
Comienza a Raspar con Scrapeless
¡Potencia tu raspado web y flujo de trabajo de automatización con Scrapeless!
Regístrate hoy y obtén $5 en crédito gratis — sin necesidad de tarjeta de crédito.Reclama tu crédito gratis ahora en el Tablero de Scrapeless.
Considera la Colección Perdida como Su Propio Resultado
Una observación fallida no significa que un dominio rastreado haya desaparecido. El campo de estado protege el informe de ese error.
observed significa que una respuesta de datos exitosa contenía un array orgánico no vacío de objetos. empty significa que el array estaba presente y vacío. unmapped significa que la respuesta exitosa no coincidió con esa forma mínima. Estas son etiquetas de aplicación, no códigos de estado API adicionales.
pending registra el estado de la tarea HTTP 201 documentado. Mantenga el identificador de tarea devuelto con la respuesta sin procesar y utilice un flujo de trabajo de recuperación de resultados verificado por separado antes de contar esa ejecución como observada. Los errores HTTP y los errores de transporte pertenecen al informe de colección, no a un gráfico de movimiento de clasificación.
Al preparar una vista semanal, muestre cuántas observaciones planificadas fueron utilizables. Mantenga una lista de ejecuciones faltantes o no resueltas junto a la comparación de resultados. Un gráfico que excluye silenciosamente la colección fallida puede parecer estable mientras su evidencia se vuelve más delgada.
Compara Resultados Orgánicos de Forma Similar
Una clave de comparación debe incluir cada configuración de búsqueda presentada que pueda afectar la observación. La implementación conservadora más simple serializa todo el objeto de solicitud con claves ordenadas, excluyendo solo las marcas de tiempo de la aplicación y los identificadores de ejecución.
Las opciones de serialización JSON determinísticas de Python admiten claves de diccionarios ordenados. Esto proporciona a su aplicación una representación repetible de las configuraciones presentadas. No prueba que diferentes configuraciones sean semánticamente equivalentes, y no congela el comportamiento de búsqueda ascendente.
Mantenga start en la clave al comparar segmentos de página. Si el informe combina múltiples páginas en una ventana de colección, defina esa ventana de nivel superior por separado y marque las páginas faltantes. No mezcle una observación de la primera página con una colección más profunda y llame a la diferencia una ganancia de clasificación.
Utilice las posiciones orgánicas devueltas solo dentro de la interpretación respaldada por su respuesta recolectada. Mantenga los módulos de imagen, local y otros por separado. Las reglas de medición de posición de Search Console describen un sistema de informes diferente; una posición de API muestreada no debe ser etiquetada como posición promedio de Search Console.
Construya un Registro de Cambios Revisable
Un registro de cambios útil identifica la ejecución anterior, la nueva ejecución, el contexto, la URL afectada y la regla que detectó el cambio. Debe describir una observación antes de sugerir una causa.
Para un dominio, distinga “presente en ambos segmentos capturados”, “nueva observada en este segmento” y “no observada en el segmento posterior.” La última etiqueta es más restringida que “eliminada de Google.” El dominio puede estar fuera de la profundidad recolectada, y un reemplazo de URL puede dejar la presencia del dominio sin cambios.
Para una URL, retenga tanto comparaciones de enlace exacto como de host normalizado. La normalización puede ayudar a agrupar páginas, pero eliminar rutas, parámetros o subdominios también puede fusionar cosas que la investigación considera importantes. Documente cada regla de normalización y mantenga el enlace original junto al valor derivado.
Dirija los cambios a revisión humana con la evidencia guardada. Las actualizaciones de página, el contexto de consulta y los cambios de búsqueda más amplios pueden merecer una investigación. Un par de instantáneas por sí solo no puede establecer cuál causó el movimiento.
Conclusión
Empiece el conjunto de datos con un alcance explícito y un registro de captura en bruto. Agregue filas orgánicas derivadas solo después de que se comprenda el estado de ejecución, luego compare registros cuyas configuraciones de solicitud coincidan. El resultado es una historia que su equipo puede auditar, con brechas de colección visibles en lugar de convertidas en reclamaciones de clasificación.
Una colección de búsqueda en Python ofrece un recorrido que proporciona contexto adicional; utiliza la interfaz de solicitud actual mostrada aquí para este conjunto de datos.
Construye Tu Próxima Observación de Búsqueda
Configura la API de Búsqueda de Google en torno a las preguntas que tu equipo necesita responder. Revisa los precios de Scrapeless antes de establecer la frecuencia de colección. El modelo de parámetros de búsqueda de Google explica los controles de contexto utilizados en este flujo de trabajo.
Discute tu implementación con la comunidad en Discord o Telegram.
FAQ
P: ¿Esto recupera las clasificaciones históricas de Google de antes de que comenzara la colección?
No. Este flujo de trabajo construye la historia a partir de las observaciones que guardas. No crea instantáneas anteriores ni proporciona una base de datos de clasificaciones históricas.
P: ¿Es un arreglo orgánico vacío lo mismo que una solicitud fallida?
No. Un arreglo vacío presente se registra como empty; las fallas HTTP, fallas de transporte, tareas pendientes y una respuesta no mapeada tienen estados separados.
P: ¿Pueden diferentes países compartir la misma historia de clasificación?
Pueden compartir un sistema de almacenamiento, pero deben permanecer como grupos de comparación separados. El país es parte del contexto de la solicitud.
P: ¿Una posición de resultado mide visitas o ingresos?
No. Describe la observación de búsqueda devuelta. El tráfico y los resultados comerciales necesitan sus propias evidencias y definiciones coincidentes.
P: ¿Con qué frecuencia deberían recogerse las instantáneas?
Elige una cadencia que coincida con la pregunta de investigación, el presupuesto y la capacidad de revisión. Registra las observaciones perdidas y evita dar a entender que un horario muestreado captura cada cambio.
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.


