- Dos palabras clave van en el mismo grupo cuando sus top 10 comparten suficientes URLs: de 3 a 4 en común es el umbral más habitual.
- El método se basa en lo que Google muestra de verdad, no en la similitud de las palabras: dos palabras clave que se parecen pueden acabar juntas o no.
- Con la API de Semscraper, 1.000 palabras clave en la página 1 cuestan 0,30 €, y el script de Python de este artículo hace el resto.
El principio
El clustering por similitud de SERP parte de una idea sencilla: si Google muestra las mismas páginas para dos consultas, es que las entiende como la misma intención. Una sola página de tu sitio puede entonces posicionar para las dos. A la inversa, dos palabras clave que se parecen pero cuyas SERPs no tienen nada en común piden dos páginas distintas.
El método es más fiable que agrupar por las propias palabras, porque se apoya en el criterio de Google y no en la similitud de las cadenas de texto. «Zapatillas running mujer» y «deportivas para correr de chica» casi no comparten palabras y, sin embargo, sus SERPs suelen solaparse mucho.
Los pasos
- Recoge el top 10 de cada palabra clave, en el país, el idioma y el dispositivo correctos.
- Extrae las URLs de los resultados orgánicos, ignorando anuncios, vídeos y demás bloques.
- Compara las palabras clave de dos en dos: ¿cuántas URLs comparten?
- Agrupa los pares que superan un umbral.
Elegir el umbral
| URLs comunes en el top 10 | Efecto |
|---|---|
| 2 | Grupos amplios, con riesgo de mezclar intenciones cercanas |
| 3 o 4 | El ajuste más habitual: grupos coherentes sin demasiada fragmentación |
| 5 o más | Grupos muy ajustados, muchas palabras clave aisladas |
Empieza por 3, revisa a mano una docena de grupos y luego ajusta. El umbral adecuado depende de tu temática: las SERPs de e-commerce, dominadas por unos pocos sitios grandes, se solapan con más facilidad que las editoriales.
Grupos estrictos o flexibles
Hay dos enfoques. En el clustering estricto, cada palabra clave de un grupo debe compartir el umbral con una palabra clave pivote, normalmente la más buscada del grupo. Los grupos quedan limpios, y es el enfoque del script de más abajo. En el clustering flexible, basta con que una palabra clave esté vinculada a un miembro del grupo: los grupos crecen en cadena, con el riesgo de derivar de una intención a otra.
Para decidir qué páginas crear o fusionar, el clustering estricto es casi siempre la opción correcta.
El script completo
Este script envía tus palabras clave a la API, recupera las SERPs y luego forma los grupos. Sustituye la clave de API, la lista de palabras clave y, si hace falta, el umbral. Las palabras clave deben ir ordenadas de la más buscada a la menos buscada, para que el pivote de cada grupo sea su consulta principal.
import time
import requests
API_KEY = "API_KEY"
API = "https://api.semscraper.com/v1/serp"
HEADERS = {"Authorization": "Bearer " + API_KEY}
THRESHOLD = 3
# de la más buscada a la menos buscada
keywords = ["zapatillas running mujer", "deportivas para correr de chica", "zapatillas trail mujer"]
# 1. crear las recogidas: top 10, google.es, escritorio
items = [{"search_engine": "google_search", "keyword": k, "device": "desktop",
"location": "es", "language": "es", "depth": 1} for k in keywords]
created = requests.post(API, json=items, headers=HEADERS).json()
ids = [row["id"] for row in created["data"]]
# 2. esperar y recuperar las SERPs, 10 minutos como máximo
serps, attempts = {}, 0
while len(serps) != len(ids) and attempts < 60:
attempts += 1
time.sleep(10)
res = requests.get(API, params={"ids": ",".join(ids), "output": "json"}, headers=HEADERS).json()
for row in res["data"]:
if row["status"] == "done":
urls = set()
for block in row["results"]:
if block["type"] == "organic":
urls.update(item["url"].rstrip("/") for item in block["items"])
serps[row["keyword"]] = urls
# 3. clustering estricto alrededor de un pivote
clusters, seen = [], set()
for pivot in keywords:
if pivot in seen or pivot not in serps:
continue
group = [pivot]
seen.add(pivot)
for other in keywords:
if other not in seen and other in serps:
if len(serps[pivot] & serps[other]) >= THRESHOLD:
group.append(other)
seen.add(other)
clusters.append(group)
for group in clusters:
print(" | ".join(group))Los ID devueltos al crear las recogidas se pasan después a la llamada de recuperación, separados por comas. Para grandes volúmenes, usa mejor una URL de callback: la API te envía los resultados en cuanto están listos, sin bucle de consulta.
Errores que hay que evitar
- Mezclar ubicaciones o dispositivos: compara SERPs recogidas en las mismas condiciones; si no, las diferencias vienen del contexto y no de la intención. Para una temática local, geolocaliza todas las consultas en la misma ciudad.
- Comparar SERPs de fechas distintas: recoge todo el lote el mismo día.
- Quedarte con las URLs en bruto: normaliza al menos la barra final, y quizá los parámetros, para no pasar por alto URLs idénticas.
- Contar los bloques no orgánicos: los vídeos, las noticias o los anuncios cambian de una hora a otra y sesgan la comparación.
Cuánto cuesta
Una sola página de resultados basta para comparar los top 10: con Semscraper, 1.000 palabras clave cuestan 0,30 €, y 10.000 palabras clave 3 €. Las 1.000 peticiones gratis del registro te permiten probar el método con un lote real de palabras clave. Los parámetros de recogida se detallan en la página de la API de Google Search.
