- Duas palavras-chave ficam no mesmo grupo quando seus top 10 compartilham URLs suficientes: 3 a 4 em comum é o limite mais usado.
- O método se baseia no que o Google realmente mostra, e não na semelhança das palavras: duas palavras-chave parecidas podem ou não acabar juntas.
- Com a API do Semscraper, 1.000 palavras-chave na página 1 custam € 0,30, e o script Python deste artigo faz o resto.
O princípio
A clusterização por similaridade de SERP parte de uma ideia simples: se o Google mostra as mesmas páginas para duas consultas, ele as entende como a mesma intenção. Uma única página do seu site pode então se posicionar nas duas. Por outro lado, duas palavras-chave parecidas, mas cujas SERPs não têm nada em comum, pedem duas páginas separadas.
O método é mais confiável do que agrupar pelas próprias palavras, porque se apoia no julgamento do Google, e não na semelhança entre os textos. “Tênis de corrida feminino” e “calçado para correr mulher” quase não têm palavras em comum, mas suas SERPs costumam se sobrepor bastante.
As etapas
- Colete o top 10 de cada palavra-chave, no país, no idioma e no dispositivo certos.
- Extraia as URLs dos resultados orgânicos, ignorando anúncios, vídeos e outros blocos.
- Compare as palavras-chave duas a duas: quantas URLs elas compartilham?
- Agrupe os pares acima de um limite.
Como escolher o limite
| URLs em comum no top 10 | Efeito |
|---|---|
| 2 | Grupos amplos, com risco de misturar intenções vizinhas |
| 3 ou 4 | A configuração mais comum: grupos coerentes sem fragmentação excessiva |
| 5 ou mais | Grupos muito restritos, muitas palavras-chave isoladas |
Comece com 3, revise manualmente uma dúzia de grupos e depois ajuste. O limite certo depende do seu nicho: as SERPs de e-commerce, dominadas por alguns grandes sites, se sobrepõem com mais facilidade do que as editoriais.
Grupos rígidos ou flexíveis
Há duas abordagens. Na clusterização rígida, cada palavra-chave de um grupo precisa atingir o limite com uma palavra-chave pivô, em geral a mais buscada do grupo. Os grupos ficam limpos, e é a abordagem do script abaixo. Na clusterização flexível, basta que uma palavra-chave esteja ligada a um membro do grupo: os grupos crescem em cadeia, com o risco de derivar de uma intenção para outra.
Para decidir quais páginas criar ou mesclar, a clusterização rígida é quase sempre a escolha certa.
O script completo
Este script envia suas palavras-chave para a API, busca as SERPs e monta os grupos. Substitua a chave de API, a lista de palavras-chave e, se necessário, o limite. As palavras-chave devem estar ordenadas da mais buscada para a menos buscada, para que o pivô de cada grupo seja sua consulta principal.
import time
import requests
API_KEY = "API_KEY"
API = "https://api.semscraper.com/v1/serp"
HEADERS = {"Authorization": "Bearer " + API_KEY}
THRESHOLD = 3
# da mais buscada para a menos buscada
keywords = ["tenis de corrida feminino", "calcado para correr mulher", "tenis de trilha feminino"]
# 1. cria as coletas: top 10, google.com.br, desktop
items = [{"search_engine": "google_search", "keyword": k, "device": "desktop",
"location": "br", "language": "pt", "depth": 1} for k in keywords]
created = requests.post(API, json=items, headers=HEADERS).json()
ids = [row["id"] for row in created["data"]]
# 2. espera e busca as SERPs, por até 10 minutos
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. clusterização rígida em torno de um pivô
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))Os IDs retornados na criação são então passados para a chamada de busca, separados por vírgulas. Para grandes volumes, use de preferência uma URL de callback: a API envia os resultados assim que ficam prontos, sem loop de consulta.
Armadilhas a evitar
- Misturar localizações ou dispositivos: compare SERPs coletadas nas mesmas condições, senão as diferenças vêm do contexto, e não da intenção. Para um tema local, geolocalize todas as consultas na mesma cidade.
- Comparar SERPs de datas diferentes: colete o lote inteiro no mesmo dia.
- Manter as URLs brutas: normalize pelo menos a barra final e, se for o caso, os parâmetros, para não deixar passar URLs idênticas.
- Contar os blocos não orgânicos: vídeos, notícias e anúncios mudam de uma hora para outra e distorcem a comparação.
Quanto custa
Uma única página de resultados basta para comparar os top 10: com o Semscraper, 1.000 palavras-chave custam € 0,30, e 10.000 palavras-chave € 3. As 1.000 requisições grátis no cadastro permitem testar o método em um lote real de palavras-chave. Os parâmetros de coleta estão detalhados na página da API do Google Search.
