- Due parole chiave appartengono allo stesso gruppo quando le loro top 10 condividono abbastanza URL: 3 o 4 in comune è la soglia più usata.
- Il metodo si basa su ciò che Google mostra davvero, non sulla somiglianza delle parole: due parole chiave simili possono finire insieme oppure no.
- Con l’API di Semscraper, 1.000 parole chiave in pagina 1 costano 0,30 €, e lo script Python di questo articolo fa il resto.
Il principio
Il clustering per somiglianza delle SERP parte da un’idea semplice: se Google mostra le stesse pagine per due query, le interpreta come lo stesso intento. Una sola pagina del tuo sito può allora posizionarsi su entrambe. Al contrario, due parole chiave che si somigliano ma le cui SERP non hanno nulla in comune richiedono due pagine distinte.
Il metodo è più affidabile del raggruppamento in base alle parole stesse, perché si basa sul giudizio di Google e non sulla somiglianza delle stringhe. “Scarpe running donna” e “calzature da jogging femminili” non hanno quasi nessuna parola in comune, eppure le loro SERP spesso si sovrappongono ampiamente.
I passaggi
- Raccogli la top 10 di ogni parola chiave, nel paese, nella lingua e sul dispositivo giusti.
- Estrai gli URL dei risultati organici, ignorando annunci, video e altri blocchi.
- Confronta le parole chiave a coppie: quanti URL hanno in comune?
- Raggruppa le coppie sopra una soglia.
Scegliere la soglia
| URL in comune nella top 10 | Effetto |
|---|---|
| 2 | Gruppi ampi, con il rischio di mescolare intenti vicini |
| 3 o 4 | L’impostazione più comune: gruppi coerenti senza troppa frammentazione |
| 5 e oltre | Gruppi molto ristretti, molte parole chiave isolate |
Parti da 3, controlla a mano una decina di gruppi, poi aggiusta. La soglia giusta dipende dal tuo settore: le SERP e-commerce, dominate da pochi grandi siti, si sovrappongono più facilmente di quelle editoriali.
Gruppi stretti o larghi
Ci sono due approcci. Nel clustering stretto, ogni parola chiave di un gruppo deve raggiungere la soglia con una parola chiave pivot, di solito la più cercata del gruppo. I gruppi sono puliti, ed è l’approccio dello script qui sotto. Nel clustering largo, a una parola chiave basta essere collegata a un solo membro del gruppo: i gruppi crescono a catena, con il rischio di scivolare da un intento all’altro.
Per decidere quali pagine creare o accorpare, il clustering stretto è quasi sempre la scelta giusta.
Lo script completo
Questo script invia le tue parole chiave all’API, recupera le SERP, poi costruisce i gruppi. Sostituisci la chiave API, l’elenco delle parole chiave e, se serve, la soglia. Le parole chiave vanno ordinate dalla più alla meno cercata, così il pivot di ogni gruppo è la sua query principale.
import time
import requests
API_KEY = "API_KEY"
API = "https://api.semscraper.com/v1/serp"
HEADERS = {"Authorization": "Bearer " + API_KEY}
THRESHOLD = 3
# dalla più alla meno cercata
keywords = ["scarpe running donna", "calzature da jogging femminili", "scarpe trail donna"]
# 1. crea le raccolte: top 10, google.it, desktop
items = [{"search_engine": "google_search", "keyword": k, "device": "desktop",
"location": "it", "language": "it", "depth": 1} for k in keywords]
created = requests.post(API, json=items, headers=HEADERS).json()
ids = [row["id"] for row in created["data"]]
# 2. attendi, poi recupera le SERP, per 10 minuti al massimo
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 stretto attorno a un pivot
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))Gli ID restituiti alla creazione vengono poi passati alla chiamata di recupero, separati da virgole. Per grandi volumi usa piuttosto un URL di callback: l’API ti invia i risultati non appena sono pronti, senza ciclo di polling.
Errori da evitare
- Mescolare località o dispositivi: confronta SERP raccolte nelle stesse condizioni, altrimenti le differenze dipendono dal contesto e non dall’intento. Per un tema locale, geolocalizza tutte le query nella stessa città.
- Confrontare SERP di date diverse: raccogli l’intero batch nello stesso giorno.
- Tenere gli URL grezzi: normalizza almeno la barra finale, ed eventualmente i parametri, per non perdere URL identici.
- Contare i blocchi non organici: video, notizie o annunci cambiano da un’ora all’altra e falsano il confronto.
Quanto costa
Per confrontare le top 10 basta una sola pagina di risultati: con Semscraper 1.000 parole chiave costano 0,30 €, 10.000 parole chiave 3 €. Le 1.000 richieste gratuite all’iscrizione ti permettono di provare il metodo su un vero batch di parole chiave. I parametri di raccolta sono descritti nella pagina API Google Search.
