- Zwei Keywords gehören zur selben Gruppe, wenn ihre Top 10 genug URLs teilen: 3 bis 4 gemeinsame URLs sind der gängigste Schwellenwert.
- Die Methode stützt sich auf das, was Google tatsächlich anzeigt, nicht auf die Ähnlichkeit der Wörter: Zwei ähnlich klingende Keywords können zusammen landen oder auch nicht.
- Mit der Semscraper API kosten 1.000 Keywords auf Seite 1 0,30 €, und das Python-Skript in diesem Artikel erledigt den Rest.
Das Prinzip
Das Clustering nach SERP-Ähnlichkeit beruht auf einer einfachen Idee: Zeigt Google für zwei Suchanfragen dieselben Seiten, versteht es sie als dieselbe Suchintention. Eine einzige Seite Ihrer Website kann dann für beide ranken. Umgekehrt erfordern zwei Keywords, die sich ähneln, deren SERPs aber nichts gemeinsam haben, zwei getrennte Seiten.
Die Methode ist zuverlässiger als eine Gruppierung nach den Wörtern selbst, denn sie stützt sich auf das Urteil von Google, nicht auf die Ähnlichkeit von Zeichenketten. „Laufschuhe Damen“ und „Joggingschuhe für Frauen“ haben kaum ein Wort gemeinsam, ihre SERPs überschneiden sich aber oft stark.
Die Schritte
- Die Top 10 erfassen für jedes Keyword, im richtigen Land, in der richtigen Sprache und auf dem richtigen Gerät.
- Die URLs der organischen Ergebnisse extrahieren, ohne Anzeigen, Videos und andere Blöcke.
- Die Keywords paarweise vergleichen: Wie viele URLs teilen sie?
- Gruppieren: die Paare oberhalb eines Schwellenwerts zusammenfassen.
Den Schwellenwert wählen
| Gemeinsame URLs in den Top 10 | Wirkung |
|---|---|
| 2 | Breite Gruppen, mit dem Risiko, benachbarte Suchintentionen zu vermischen |
| 3 oder 4 | Die gängigste Einstellung: stimmige Gruppen ohne allzu starke Zersplitterung |
| 5 und mehr | Sehr enge Gruppen, viele isolierte Keywords |
Beginnen Sie bei 3, prüfen Sie ein Dutzend Gruppen von Hand und passen Sie dann an. Der richtige Schwellenwert hängt von Ihrem Thema ab: E-Commerce-SERPs, die von wenigen großen Websites dominiert werden, überschneiden sich leichter als redaktionelle.
Strikte oder lockere Gruppen
Es gibt zwei Ansätze. Beim strikten Clustering muss jedes Keyword einer Gruppe den Schwellenwert mit einem Pivot-Keyword erreichen, in der Regel dem meistgesuchten der Gruppe. Die Gruppen sind sauber, und es ist der Ansatz des Skripts unten. Beim lockeren Clustering genügt es, wenn ein Keyword mit einem einzigen Mitglied der Gruppe verbunden ist: Die Gruppen wachsen durch Verkettung, mit dem Risiko, von einer Suchintention zur nächsten abzudriften.
Um zu entscheiden, welche Seiten Sie erstellen oder zusammenführen, ist das strikte Clustering fast immer die richtige Wahl.
Das vollständige Skript
Dieses Skript sendet Ihre Keywords an die API, ruft die SERPs ab und bildet dann die Gruppen. Ersetzen Sie den API-Schlüssel, die Keyword-Liste und bei Bedarf den Schwellenwert. Die Keywords sollten vom meistgesuchten zum am wenigsten gesuchten sortiert sein, damit der Pivot jeder Gruppe ihre Hauptsuchanfrage ist.
import time
import requests
API_KEY = "API_KEY"
API = "https://api.semscraper.com/v1/serp"
HEADERS = {"Authorization": "Bearer " + API_KEY}
THRESHOLD = 3
# vom meistgesuchten zum am wenigsten gesuchten
keywords = ["laufschuhe damen", "joggingschuhe frauen", "trailschuhe damen"]
# 1. Erfassungen anlegen: Top 10, google.de, Desktop
items = [{"search_engine": "google_search", "keyword": k, "device": "desktop",
"location": "de", "language": "de", "depth": 1} for k in keywords]
created = requests.post(API, json=items, headers=HEADERS).json()
ids = [row["id"] for row in created["data"]]
# 2. warten, dann die SERPs abrufen, höchstens 10 Minuten lang
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. striktes Clustering um ein Pivot-Keyword
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))Die bei der Erstellung zurückgegebenen IDs werden anschließend, durch Kommas getrennt, an den Abruf übergeben. Bei großen Volumen nutzen Sie besser eine Callback-URL: Die API sendet Ihnen die Ergebnisse, sobald sie fertig sind, ganz ohne Polling-Schleife.
Fallstricke, die Sie vermeiden sollten
- Standorte oder Geräte mischen: Vergleichen Sie SERPs, die unter denselben Bedingungen erfasst wurden, sonst stammen die Unterschiede vom Kontext, nicht von der Suchintention. Bei einem lokalen Thema geolokalisieren Sie alle Suchanfragen in derselben Stadt.
- SERPs von verschiedenen Tagen vergleichen: Erfassen Sie den gesamten Batch am selben Tag.
- Rohe URLs behalten: Normalisieren Sie mindestens den abschließenden Schrägstrich und gegebenenfalls die Parameter, damit identische URLs nicht übersehen werden.
- Nicht-organische Blöcke mitzählen: Videos, News oder Anzeigen ändern sich stündlich und verfälschen den Vergleich.
Was es kostet
Eine einzige Ergebnisseite reicht, um Top 10 zu vergleichen: Bei Semscraper kosten 1.000 Keywords 0,30 €, 10.000 Keywords 3 €. Mit den 1.000 kostenlosen Anfragen bei der Registrierung testen Sie die Methode an einem echten Keyword-Set. Die Erfassungsparameter sind auf der Seite Google Search API beschrieben.
