- Deux mots-clés appartiennent au même groupe quand leurs top 10 partagent assez d'URL : 3 à 4 en commun est le seuil le plus courant.
- La méthode s'appuie sur ce que Google affiche réellement, pas sur la ressemblance des mots : « avocat divorce » et « avocat séparation » peuvent finir ensemble ou non.
- Avec l'API Semscraper, 1 000 mots-clés en page 1 coûtent 0,30 €, et le script Python de cet article fait le reste.
Le principe
Le regroupement par similarité de SERP part d'une idée simple : si Google affiche les mêmes pages pour deux requêtes, c'est qu'il les comprend comme une même intention. Une seule page de votre site peut alors se positionner sur les deux. À l'inverse, deux mots-clés proches en apparence mais dont les SERP n'ont rien en commun appellent deux pages distinctes.
La méthode est plus fiable qu'un regroupement sur les mots eux-mêmes, parce qu'elle s'appuie sur le jugement de Google, pas sur la ressemblance des chaînes de caractères. « Chaussure running femme » et « basket course à pied femme » ne partagent presque aucun mot, mais leurs SERP se recoupent souvent largement.
Les étapes
- Collecter le top 10 de chaque mot-clé, dans le bon pays, la bonne langue et sur le bon appareil.
- Extraire les URL des résultats naturels, en ignorant annonces, vidéos et autres blocs.
- Comparer les mots-clés deux à deux : combien d'URL ont-ils en commun ?
- Regrouper ceux qui dépassent un seuil.
Choisir le seuil
| URL communes dans le top 10 | Effet |
|---|---|
| 2 | Groupes larges, au risque de mélanger des intentions voisines |
| 3 ou 4 | Le réglage le plus courant : des groupes cohérents sans trop fragmenter |
| 5 et plus | Groupes très resserrés, beaucoup de mots-clés isolés |
Commencez à 3, regardez une dizaine de groupes à la main, puis ajustez. Le bon seuil dépend de votre thématique : les SERP de e-commerce, dominées par quelques grands sites, se recoupent plus facilement que celles d'un sujet éditorial.
Groupes stricts ou souples
Deux approches existent. En regroupement strict, chaque mot-clé d'un groupe doit partager le seuil avec un mot-clé pivot, en général le plus recherché du groupe. Les groupes sont nets, et c'est l'approche du script ci-dessous. En regroupement souple, il suffit qu'un mot-clé soit relié à un seul membre du groupe : les groupes grossissent par enchaînement, au risque de dériver d'une intention à l'autre.
Pour décider quelles pages créer ou fusionner, le regroupement strict est presque toujours le bon choix.
Le script complet
Ce script envoie vos mots-clés à l'API, récupère les SERP, puis forme les groupes. Remplacez la clé API, la liste de mots-clés et, si besoin, le seuil. Les mots-clés doivent être triés du plus recherché au moins recherché, pour que chaque groupe ait pour pivot sa requête principale.
import time
import requests
API_KEY = "API_KEY"
API = "https://api.semscraper.com/v1/serp"
HEADERS = {"Authorization": "Bearer " + API_KEY}
THRESHOLD = 3
# du plus recherché au moins recherché
keywords = ["chaussure running femme", "basket course à pied femme", "chaussure trail femme"]
# 1. créer les collectes : top 10, Google France, desktop
items = [{"search_engine": "google_search", "keyword": k, "device": "desktop",
"location": "fr", "language": "fr", "depth": 1} for k in keywords]
created = requests.post(API, json=items, headers=HEADERS).json()
ids = [row["id"] for row in created["data"]]
# 2. attendre puis récupérer les SERP
serps = {}
while len(serps) != len(ids):
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. regroupement strict autour d'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))Les identifiants renvoyés par la création se passent ensuite à la récupération, séparés par des virgules. Si vous traitez de gros volumes, préférez une URL de callback : l'API vous envoie les résultats dès qu'ils sont prêts, sans boucle d'attente.
Les pièges à éviter
- Mélanger les localisations ou les appareils : comparez des SERP collectées dans les mêmes conditions, sinon les écarts viennent du contexte et non de l'intention. Pour un sujet local, géolocalisez toutes les requêtes dans la même ville.
- Comparer des SERP d'époques différentes : collectez tout le lot le même jour.
- Garder les URL brutes : normalisez au moins la barre oblique finale, et éventuellement les paramètres, pour ne pas rater des URL identiques.
- Compter les blocs autres que naturels : vidéos, actualités ou annonces changent d'une heure à l'autre et faussent la comparaison.
Combien ça coûte
Une seule page de résultats suffit pour comparer des top 10 : avec Semscraper, 1 000 mots-clés coûtent 0,30 €, 10 000 mots-clés 3 €. Les 1 000 requêtes offertes à l'inscription permettent de tester la méthode sur un vrai lot de mots-clés. Les paramètres de collecte sont détaillés sur la page API Google Search.
