Guia

Clusterização de palavras-chave por similaridade de SERP

Duas palavras-chave que mostram as mesmas páginas no Google atendem à mesma intenção: uma única página deve trabalhar as duas. Veja o método, os limites certos e um script pronto para usar.

Principais pontos
  • 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

  1. Colete o top 10 de cada palavra-chave, no país, no idioma e no dispositivo certos.
  2. Extraia as URLs dos resultados orgânicos, ignorando anúncios, vídeos e outros blocos.
  3. Compare as palavras-chave duas a duas: quantas URLs elas compartilham?
  4. Agrupe os pares acima de um limite.

Como escolher o limite

URLs em comum no top 10Efeito
2Grupos amplos, com risco de misturar intenções vizinhas
3 ou 4A configuração mais comum: grupos coerentes sem fragmentação excessiva
5 ou maisGrupos 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.

clustering.py
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 em lotes de 1.000 (o máximo por chamada): top 10, google.com.br, desktop
ids = []
for i in range(0, len(keywords), 1000):
    items = [{"search_engine": "google_search", "keyword": k, "device": "desktop",
              "location": "br", "language": "pt", "depth": 1} for k in keywords[i:i + 1000]]
    created = requests.post(API, json=items, headers=HEADERS).json()
    ids += [row["id"] for row in created["data"]]

# 2. busca as SERPs em lotes de 100 IDs, por até 10 minutos
serps, pending, attempts = {}, ids, 0
while pending and attempts < 60:
    attempts += 1
    time.sleep(10)
    done = set()
    for i in range(0, len(pending), 100):
        res = requests.get(API, params={"ids": ",".join(pending[i:i + 100]), "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
                done.add(row["id"])
    pending = [x for x in pending if x not in done]

# 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, no máximo 100 por chamada; a criação aceita 1.000 palavras-chave por chamada, daí os dois loops em lotes. 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 SERPs 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.

Teste com suas próprias palavras-chave

1.000 SERPs grátis, sem cartão de crédito.