FR
Guide

Regrouper ses mots-clés par similarité de SERP

Deux mots-clés qui affichent les mêmes pages dans Google répondent à la même intention : ils doivent être ciblés par une seule page. Voici la méthode, les bons seuils et un script prêt à l'emploi.

En bref
  • 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

  1. Collecter le top 10 de chaque mot-clé, dans le bon pays, la bonne langue et sur le bon appareil.
  2. Extraire les URL des résultats naturels, en ignorant annonces, vidéos et autres blocs.
  3. Comparer les mots-clés deux à deux : combien d'URL ont-ils en commun ?
  4. Regrouper ceux qui dépassent un seuil.

Choisir le seuil

URL communes dans le top 10Effet
2Groupes larges, au risque de mélanger des intentions voisines
3 ou 4Le réglage le plus courant : des groupes cohérents sans trop fragmenter
5 et plusGroupes 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.

clustering.py
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.

Testez sur vos propres mots-clés

1 000 requêtes offertes, sans carte bancaire.