Como construir um sistema pessoal completo de SEO e monitoramento de concorrentes
Projeto técnico e estratégico de uma plataforma pessoal de SEO, com arquitetura, módulos, fontes de dados, bibliotecas, custos, riscos e roteiro de implementação.
Como construir um sistema pessoal completo de SEO e monitoramento de concorrentes
É perfeitamente possível programar um sistema de SEO muito útil para uso pessoal. A dificuldade depende menos do painel e mais do tipo de dado que se pretende obter. Rastrear sites, comparar alterações, auditar páginas, integrar Google Search Console, acompanhar Core Web Vitals e gerar alertas está ao alcance de um desenvolvedor trabalhando sozinho. Manter um índice próprio de bilhões de backlinks, reproduzir volumes globais de palavras-chave ou consultar continuamente resultados do Google em muitos países já é outra categoria de problema.
Esta pesquisa propõe uma plataforma chamada provisoriamente Radar SEO Pessoal. Ela não tenta copiar integralmente Ahrefs, Semrush ou Similarweb. A ideia correta é construir o sistema de decisão, o histórico, o crawler e a interface, aproveitando APIs oficiais para os próprios sites e comprando apenas os dados externos que seriam irracionais de coletar sozinho.
Resumo executivo
Resposta direta
Não é difícil demais, desde que o escopo seja dividido corretamente:
- um primeiro sistema realmente útil tem dificuldade média;
- um crawler técnico e um monitor de mudanças podem ser feitos com software livre e custo operacional baixo;
- Google Search Console, Google Analytics, Bing Webmaster Tools, CrUX e PageSpeed fornecem dados excelentes sobre propriedades próprias;
- posições no Google, backlinks de concorrentes, volume de palavras-chave e estimativas de tráfego exigem bases externas ou serviços pagos;
- raspar diretamente a página de resultados do Google não é uma boa fundação: é instável, enfrenta CAPTCHA e o próprio Google classifica consultas automatizadas para verificar posições como tráfego não permitido;
- o melhor desenho é um monólito modular, não uma coleção de microsserviços;
- a stack recomendada é Python 3.14 + Django 5.2 LTS + PostgreSQL 18 + Celery 5.6 + Redis + HTMX + Chart.js;
- para o crawler, usar HTTPX e lxml/selectolax nas páginas comuns, Trafilatura para texto principal, extruct para dados estruturados e Playwright somente como fallback para páginas dependentes de JavaScript;
- para SERPs, palavras-chave e backlinks, DataForSEO é a primeira opção a testar por permitir consumo granular; SerpApi é uma alternativa focada em resultados de busca, enquanto Semrush oferece dados amplos, mas sua API completa tende a exigir planos e unidades mais caros;
- o MVP deve começar pelo próprio site e pelo monitoramento de concorrentes, deixando backlinks, IA e estimativas de tráfego para depois.
O produto que vale a pena construir
O melhor resultado não é “mais uma ferramenta que mostra uma pontuação SEO”. É uma central privada que responde diariamente:
- O que mudou nos meus sites e nos concorrentes?
- Quais posições subiram ou caíram?
- Quais páginas perderam cliques, impressões ou conversões?
- Que conteúdo novo os concorrentes publicaram?
- Que temas eles cobrem e eu ainda não cubro?
- Quais problemas técnicos apareceram desde a última varredura?
- Quais oportunidades combinam demanda, relevância e capacidade real de execução?
- O que merece atenção hoje, em vez de exibir centenas de métricas sem prioridade?
Metodologia e critérios
A pesquisa foi concluída em 26 de julho de 2026. Foram consultadas documentações oficiais do Google, Bing, IndexNow, Django, Python, PostgreSQL, Celery, Scrapy, Playwright e das principais fontes de dados consideradas.
As decisões foram avaliadas pelos seguintes critérios:
- utilidade para uma única pessoa ou pequena operação;
- custo de desenvolvimento e manutenção;
- possibilidade de começar localmente e crescer sem reescrever tudo;
- qualidade, legalidade e estabilidade das fontes de dados;
- compatibilidade entre dependências;
- capacidade de guardar histórico próprio;
- automação, alertas e interpretação prática;
- redução de dependência de um único fornecedor;
- privacidade de credenciais e dados analíticos.
Estimativas de prazo e custo são identificadas como estimativas. Preços, limites e versões de serviços podem mudar e devem ser confirmados antes da implementação.
Onde está a dificuldade de verdade
| Parte | Dificuldade | Custo externo | Observação |
|---|---|---|---|
| Cadastro de projetos e concorrentes | baixa | nenhum | CRUD comum |
| Crawler do próprio site | média | baixo | limites, canonicals e deduplicação exigem cuidado |
| Monitor de páginas concorrentes | média | baixo | precisa de coleta educada e comparação sem ruído |
| Auditoria técnica | média | baixo | regras precisam ser explicáveis |
| Search Console e GA4 | média | nenhum ou baixo | OAuth e normalização são o trabalho principal |
| Core Web Vitals e Lighthouse | média | baixo | laboratório e dados reais não são a mesma coisa |
| Rank tracking | média na integração | recorrente | a coleta confiável da SERP é o produto do fornecedor |
| Pesquisa de palavras-chave | média | variável | volume e CPC não nascem do crawler |
| Backlinks de concorrentes | alta se própria | recorrente | requer um índice enorme da web |
| Estimativa de tráfego alheio | muito alta | alta | é modelagem de terceiros, não analytics real |
| Recomendações automáticas | média/alta | baixo a variável | qualidade depende da qualidade dos dados |
| “Clone do Ahrefs/Semrush” | impraticável para uma pessoa | muito alto | não deve ser o objetivo |
O que pode ser construído integralmente
- rastreamento de URLs, links, sitemaps e redirecionamentos;
- inventário de títulos, descrições, headings, canonicals, robots e hreflang;
- histórico de HTML, texto principal, hashes e capturas opcionais;
- comparação de conteúdo, metadados, links internos e dados estruturados;
- auditorias de status HTTP, profundidade, páginas órfãs e cadeias de redirecionamento;
- análise de sobreposição temática e possível canibalização;
- agrupamento de palavras-chave já conhecidas;
- integração, histórico, alertas, relatórios e prioridades;
- detecção de novos artigos, páginas removidas e grandes alterações de concorrentes.
O que deve vir de terceiros
- SERPs do Google em localizações e dispositivos específicos;
- posição histórica confiável de concorrentes;
- volume de busca, CPC, concorrência publicitária e dificuldade proprietária;
- índice de backlinks, links novos e perdidos;
- estimativas de tráfego e participação de mercado de outros domínios;
- resultados locais de mapas em grade geográfica.
Proposta funcional do Radar SEO Pessoal
1. Painel diário
Primeira tela operacional, com:
- tarefas críticas e avisos novos;
- variações de cliques, impressões, CTR e posição;
- palavras-chave que entraram ou saíram do Top 3, Top 10 e Top 20;
- páginas próprias que mais ganharam ou perderam tráfego;
- conteúdo novo ou alterado pelos concorrentes;
- problemas técnicos surgidos desde a varredura anterior;
- pioras em LCP, INP e CLS;
- consumo mensal e saldo estimado das APIs pagas.
O painel deve mostrar mudança e prioridade, não apenas totais.
2. Projetos, sites e concorrentes
Cada projeto contém:
- domínio principal e variantes;
- país, idioma, mecanismo e dispositivo;
- propriedades do Search Console e GA4;
- lista de concorrentes comerciais;
- concorrentes orgânicos descobertos nas SERPs;
- grupos de palavras-chave;
- frequência de coleta;
- orçamento mensal de API;
- canais de alerta.
Concorrente comercial e concorrente orgânico são conceitos diferentes. Uma empresa pode vender o mesmo produto sem disputar muitas consultas; um portal editorial pode dominar as SERPs sem vender o mesmo serviço.
3. Crawler e auditoria técnica
O crawler deverá:
- iniciar por sitemap, homepage e URLs informadas;
- respeitar escopo de host e regras configuradas;
- normalizar URLs e remover fragmentos;
- registrar status, cadeia de redirecionamento e URL final;
- extrair
title, meta description, headings e texto principal; - identificar canonical, meta robots, X-Robots-Tag e hreflang;
- coletar links internos e externos;
- detectar JSON-LD, Microdata e RDFa;
- registrar tamanho, tipo MIME, tempo de resposta e data;
- calcular profundidade de clique e páginas órfãs;
- comparar a nova execução com a anterior;
- produzir problemas com evidência, gravidade e orientação.
Regras úteis:
- páginas 4xx/5xx;
- links internos quebrados;
- redirecionamentos em cadeia ou loop;
- página indexável apontando canonical para outra URL;
noindexinesperado;- título ausente, duplicado ou excessivamente longo;
- descrição ausente ou duplicada;
- H1 ausente ou múltiplo;
- conteúdo quase duplicado;
- páginas sem links internos recebidos;
- profundidade excessiva;
- imagens sem texto alternativo;
- sitemap contendo URLs redirecionadas, bloqueadas ou não canônicas;
- conflito entre robots.txt, robots meta e canonical;
- hreflang inválido ou sem retorno;
- dados estruturados ausentes ou alterados;
- links internos para HTTP quando existe HTTPS;
- páginas lentas ou com aumento grande de tamanho.
Uma pontuação geral pode existir, mas cada nota precisa ser derivada de problemas visíveis. Uma nota misteriosa é menos útil que cinco evidências acionáveis.
4. Monitoramento de concorrentes
É o módulo de maior diferencial para uso pessoal. Para cada domínio, ele pode:
- descobrir URLs por sitemap, feeds e links internos;
- monitorar páginas prioritárias em frequência maior;
- detectar páginas novas e removidas;
- comparar título, descrição, H1, headings, preço visível e CTA;
- identificar links externos e internos adicionados ou removidos;
- extrair texto principal sem navegação, rodapé e banners;
- guardar hash do HTML bruto, DOM normalizado e texto principal;
- marcar alteração editorial pequena, reformulação ou mudança estrutural;
- acompanhar novos tipos de Schema.org;
- produzir uma linha do tempo por página e domínio;
- avisar quando surgir conteúdo para um grupo estratégico de palavras-chave.
Para reduzir falsos positivos, o normalizador deve eliminar:
- tokens, IDs de sessão e parâmetros conhecidos de rastreamento;
- timestamps gerados em toda requisição;
- banners de cookies, anúncios e blocos recomendados variáveis;
- ordem aleatória de itens;
- espaços, atributos e marcação sem efeito semântico.
As comparações devem existir em três níveis:
- metadados: title, description, canonical, robots, headings e schema;
- conteúdo: frases e blocos adicionados, removidos ou reescritos;
- estrutura: links, navegação, templates, componentes e profundidade.
5. Rank tracking e análise de SERP
Cada verificação precisa fixar:
- palavra-chave;
- mecanismo de busca;
- país e localização;
- idioma;
- desktop ou celular;
- data e horário;
- profundidade, como Top 10 ou Top 100;
- domínio e URL encontrados;
- recursos presentes: anúncios, mapas, vídeos, imagens, notícias, snippets e resultados gerados por IA quando o fornecedor os identificar.
Além da posição absoluta, o sistema deve calcular:
- melhor posição e posição média por período;
- volatilidade;
- URL que ranqueia para a palavra;
- troca de URL e possível canibalização;
- share of voice ponderado por volume;
- concorrentes que mais aparecem no grupo;
- ganho ou perda após uma alteração de conteúdo;
- diferença entre celular e desktop;
- presença de recursos que reduzem cliques orgânicos.
Não raspar diretamente o Google. A política da Pesquisa Google afirma que consultas automatizadas, inclusive scraping para verificar rankings, violam as políticas e os Termos. Use uma API especializada e mantenha um adaptador independente de fornecedor.
6. Palavras-chave e oportunidades
Fontes possíveis:
- consultas reais do Search Console;
- Google Ads Keyword Plan Ideas e métricas históricas;
- sugestões de uma API comercial;
- palavras extraídas das páginas próprias e concorrentes;
- termos obtidos de títulos e resultados da SERP;
- perguntas, modificadores, entidades e combinações informadas pelo usuário.
Pipeline recomendado:
- importar e normalizar termos;
- preservar acentos, mas criar uma chave normalizada para deduplicação;
- agregar volume, CPC, origem e data;
- gerar vetores TF-IDF;
- usar embeddings multilíngues apenas quando necessário;
- agrupar por similaridade e intenção;
- associar a uma página existente ou sugerir uma nova;
- calcular uma oportunidade transparente.
Exemplo de pontuação, ajustável por projeto:
oportunidade =
0,30 * demanda_normalizada
+ 0,25 * relevancia_para_o_negocio
+ 0,20 * lacuna_contra_concorrentes
+ 0,15 * probabilidade_de_ranquear
+ 0,10 * tendencia
- custo_de_producao
Não se deve tratar “keyword difficulty” de fornecedores diferentes como a mesma medida. Ela é uma métrica proprietária. Guarde fornecedor, versão, data e escala junto ao valor.
7. Search Console, GA4 e Bing
Para propriedades verificadas, o sistema deve integrar:
- consultas, páginas, países, dispositivos, cliques, impressões, CTR e posição do Search Console;
- status e dados da inspeção de URL para diagnósticos pontuais;
- sessões, usuários, eventos, páginas de entrada e conversões do GA4;
- consultas, tráfego, links e estatísticas de rastreamento do Bing Webmaster;
- envio de URLs próprias atualizadas pelo IndexNow.
O Search Console possui cotas oficiais suficientes para uma aplicação pessoal, mas consultas agrupadas simultaneamente por página e consulta, períodos longos e paginação intensa podem consumir mais carga. Deve-se importar diariamente, armazenar localmente e consultar o banco do projeto para os painéis.
A URL Inspection API tem limites menores e só funciona para propriedades às quais a conta possui acesso. Ela não é um meio de inspecionar concorrentes.
8. Desempenho e Core Web Vitals
Usar três fontes complementares:
- Lighthouse: teste de laboratório controlado;
- PageSpeed Insights: execução e recomendações convenientes;
- CrUX API: experiência real agregada de usuários do Chrome, quando houver amostra suficiente.
LCP, INP e CLS devem ser guardados por URL ou origem, dispositivo, período e fonte. Uma URL pequena pode não possuir dados CrUX; isso é ausência de amostra, não nota zero.
A documentação do PageSpeed avisa que seus dados de campo podem deixar de ser oferecidos ali. Por isso, o conector CrUX deve ser independente. Lighthouse pode rodar por linha de comando ou módulo Node e requer Chrome/Chromium.
9. Backlinks
Para concorrentes, use um provedor de índice. O sistema local deve:
- importar resumo por domínio;
- guardar domínios de referência, URLs, âncoras e atributos do link;
- detectar links novos e perdidos;
- comparar interseções entre concorrentes;
- identificar fontes que apontam para vários concorrentes, mas não para você;
- pontuar relevância temática e risco sem transformar qualquer número em “autoridade verdadeira”.
O Common Crawl é gratuito e disponibiliza WARC bruto, WAT com metadados e links e WET com texto. É excelente para experiências, investigações históricas e descoberta em lote, mas não substitui sozinho um índice comercial atualizado de backlinks. Seu uso exige processar grandes arquivos e aceitar cobertura e frequência diferentes das ferramentas especializadas.
10. Alertas e relatórios
Alertas de alto valor:
- queda relevante de cliques ou impressões;
- saída do Top 3 ou Top 10;
- mudança da URL ranqueada;
- página estratégica indisponível ou desindexável;
- novo bloqueio, canonical ou redirecionamento;
- sitemap com falha;
- concorrente publicou ou reescreveu página relevante;
- novo concorrente recorrente nas SERPs;
- piora significativa de Core Web Vitals;
- consumo de API acima do orçamento;
- tarefa atrasada ou conector sem autenticação.
O sistema deve agrupar eventos relacionados e aplicar período de silêncio. Receber cinquenta notificações para uma única falha de servidor torna o alerta inútil.
Arquitetura recomendada
flowchart LR
A["Agendador"] --> B["Fila de tarefas"]
B --> C["Crawler HTTP"]
B --> D["Navegador opcional"]
B --> E["APIs próprias"]
B --> F["Provedores SEO"]
C --> G["Extração e normalização"]
D --> G
E --> H["Importadores"]
F --> H
G --> I["PostgreSQL"]
G --> J["Snapshots comprimidos"]
H --> I
I --> K["Análises e regras"]
J --> K
K --> L["Dashboard"]
K --> M["Alertas e relatórios"]
Decisão principal: monólito modular
Uma aplicação Django, um worker, um agendador e um banco são suficientes. Os módulos devem ter fronteiras claras, mas podem viver no mesmo repositório:
radar_seo/
core/
projects/
crawling/
audits/
competitors/
keywords/
serp/
analytics/
performance/
backlinks/
alerts/
reports/
providers/
templates/
Isso simplifica autenticação, migrações, backups, painel administrativo e implantação. Separar serviços só passa a fazer sentido se o crawler crescer a ponto de precisar escalar independentemente.
Stack recomendada
Base da aplicação
| Componente | Escolha | Motivo |
|---|---|---|
| Linguagem | Python 3.14 | ecossistema forte para crawling, dados e NLP; versão estável em correções |
| Framework | Django 5.2 LTS | auth, admin, ORM, templates, formulários e suporte até abril de 2028 |
| API interna | Django Ninja ou Django REST Framework, somente se necessária | evitar uma API antes de existir consumidor |
| Banco | PostgreSQL 18 | JSONB, busca textual, índices, agregações e cinco anos de suporte |
| Fila | Celery 5.6 | integração madura com Django, retries, filas e tarefas periódicas |
| Broker/cache | Redis | simples para fila, locks, cache e limitação de frequência |
| Scheduler | Celery Beat | agenda no mesmo ecossistema da fila |
| Interface | Django Templates + HTMX | interação dinâmica sem uma SPA complexa |
| Gráficos | Chart.js | séries temporais e comparações suficientes para o projeto |
| CSS | CSS próprio ou Tailwind, se já houver preferência | não é necessário adotar um kit grande |
| Dependências | uv | ambientes, lockfile e instalação rápida |
| Implantação | Docker Compose | reprodução simples em desktop, NAS ou VPS |
Django 6.0.7 era a versão corrente em 26 de julho de 2026, mas Django 5.2 LTS é a escolha conservadora: recebe atualizações de segurança até abril de 2028, suporta Python 3.14 e evita depender imediatamente do novo framework de Tasks. O framework de Tasks do Django 6.0 define e enfileira tarefas, mas a própria documentação esclarece que ele não fornece o worker de produção.
PostgreSQL 18.4 era a versão corrente da série 18, suportada até novembro de 2030. PostgreSQL 17 também é aceitável. Não usar a versão 19 beta em produção.
Bibliotecas de coleta e parsing
| Dependência | Papel | Uso recomendado |
|---|---|---|
httpx |
cliente HTTP síncrono/assíncrono | padrão para páginas e APIs |
scrapy |
crawler completo | adotar se o volume e a fronteira do crawl crescerem |
lxml |
HTML/XML, XPath e sitemaps | parser robusto principal |
selectolax |
parsing HTML rápido | extração repetitiva em grande volume |
trafilatura |
texto e metadados principais | diffs de conteúdo sem navegação e rodapé |
extruct |
JSON-LD, Microdata, RDFa e Open Graph | auditoria de dados estruturados |
advertools |
utilidades de SEO, sitemap e robots | exploração e importadores auxiliares |
playwright |
renderização com navegador | fallback para conteúdo realmente dependente de JS |
tldextract |
domínio registrável e subdomínio | normalização correta de hosts |
charset-normalizer |
detecção de encoding | páginas legadas |
feedparser |
RSS e Atom | descoberta de publicações |
protego ou urllib.robotparser |
robots.txt | política de acesso por host |
Pillow |
metadados básicos de imagens | dimensões e formatos |
dnspython |
DNS | inspeção de registros e erros |
HTTPX possui timeouts por padrão e permite limites de conexão. Mesmo assim, o projeto deve configurar explicitamente tempo de conexão, leitura, tamanho máximo, redirects e concorrência por host.
Scrapy é excelente quando se precisa de scheduler, downloader middlewares, pipelines, AutoThrottle e muitos spiders. Para um MVP controlado, HTTPX com uma fila de URLs persistida é mais fácil de integrar ao domínio da aplicação.
Playwright não deve abrir um navegador para cada URL. Ele custa muito mais CPU e memória e cada versão depende de binários de navegador compatíveis. Use-o em uma fila separada e somente após a resposta HTML comum não conter o conteúdo necessário.
Conteúdo, similaridade e análise
| Dependência | Função |
|---|---|
scikit-learn |
TF-IDF, similaridade cosseno, clustering e modelos simples |
rapidfuzz |
comparação aproximada de strings |
sentence-transformers |
embeddings multilíngues opcionais |
spacy |
tokenização, entidades e processamento linguístico opcional |
numpy e pandas |
cálculos e importações; não usar DataFrame como banco |
diff-match-patch ou difflib |
visualização de alterações textuais |
deepdiff |
comparação de estruturas JSON normalizadas |
langdetect ou fastText |
detecção de idioma quando realmente necessária |
pgvector |
vetores no PostgreSQL, somente depois de validar o uso |
Começar com TF-IDF e similaridade cosseno. Embeddings são úteis para lacunas semânticas, mas adicionam modelos, memória, versão de vetor e reprocessamento. Não devem ser uma dependência estrutural do MVP.
Integrações oficiais
| Fonte | O que fornece | Restrição essencial |
|---|---|---|
| Search Console API | cliques, impressões, CTR, posição, sitemaps | apenas propriedades autorizadas |
| URL Inspection API | estado conhecido de indexação | apenas propriedades autorizadas e cota menor |
| GA4 Data API | tráfego, eventos e conversões | propriedade autorizada |
| Google Ads API | ideias e métricas históricas de keywords | conta, OAuth, developer token e limites |
| PageSpeed Insights API | Lighthouse e recomendações | dados de campo devem migrar para CrUX |
| CrUX API | LCP, INP, CLS e métricas reais agregadas | pode não haver amostra por URL |
| Bing Webmaster API | tráfego, rankings, links e crawl do próprio site | site verificado |
| IndexNow | aviso de URL própria alterada | exige chave e controle do host |
As métricas históricas do Google Ads incluem média aproximada de buscas mensais, volumes mensais, concorrência, índice de concorrência e faixas de lance. Elas são atualizadas mensalmente e devem ser cacheadas. A API de planejamento tem limites mais restritos do que operações comuns do Google Ads.
Fornecedores de dados competitivos
| Fornecedor | Melhor uso | Vantagem | Limitação |
|---|---|---|---|
| DataForSEO | SERP, keywords, backlinks, domínio e on-page | catálogo amplo e consumo granular | custo por chamada/linha e integração mais técnica |
| SerpApi | resultados de busca estruturados | API simples e especializada em SERP | backlinks e inteligência ampla ficam fora |
| Semrush API | keywords, domínio, backlinks, projetos e local | base integrada e muitos relatórios | acesso completo pode exigir plano Business, add-on e unidades |
| Ahrefs API | backlinks e inteligência competitiva | índice e métricas conhecidos | confirmar plano e limites atuais antes de escolher |
| Moz Links API | links e métricas de domínio | integração focada | cobertura e custo devem ser testados no nicho |
| Majestic API | backlinks históricos e atuais | especialização em links | interface e métricas próprias |
| Common Crawl | pesquisa pública em lote | gratuito e aberto | processamento pesado; não substitui rank tracker |
Primeira escolha para protótipo: DataForSEO, começando por poucas palavras-chave e concorrentes. Em 26 de julho de 2026, a página de preços de backlinks mostrava como exemplo uma requisição de US$ 0,024 mais US$ 0,000036 por linha, totalizando US$ 0,06 para mil linhas. Isso é apenas uma fotografia de preço e não deve ser codificado no sistema.
O adaptador deve seguir uma interface comum:
class SerpProvider:
def check(self, keyword, location, language, device, depth):
...
class KeywordProvider:
def ideas(self, seeds, location, language):
...
class BacklinkProvider:
def summary(self, domain):
...
def new_and_lost(self, domain, since):
...
Trocar fornecedor deve exigir novo adaptador, não migração de toda a aplicação.
Sempre guardar provider, requested_at, parâmetros, custo estimado e resposta
bruta com retenção limitada.
Qualidade, testes e operação
| Dependência/ferramenta | Papel |
|---|---|
pytest e pytest-django |
testes unitários e de integração |
respx |
simular respostas HTTPX |
factory_boy |
dados de teste |
ruff |
lint e formatação |
mypy ou Pyright |
tipos nas fronteiras e conectores |
pydantic |
validar respostas externas e configurações |
structlog |
logs estruturados |
sentry-sdk |
erros, opcional |
prometheus-client |
métricas operacionais, opcional |
django-environ |
configuração externa |
psycopg |
driver PostgreSQL |
Testes indispensáveis:
- normalização e canonicalização de URLs;
- limites de escopo do crawler;
- robots.txt;
- redirects e loops;
- parsing de HTML malformado;
- extração de canonical, robots, hreflang e schema;
- diffs que ignoram áreas dinâmicas;
- idempotência dos importadores;
- paginação, rate limit e retry dos provedores;
- cálculo de posição e share of voice;
- timezone e agregação diária;
- expiração de credenciais e alertas;
- proteção contra URLs internas e SSRF.
Modelo de dados inicial
| Tabela | Conteúdo principal |
|---|---|
projects |
nome, mercado, idioma, timezone, orçamento |
domains |
domínio próprio ou concorrente e configurações |
provider_accounts |
referência a credenciais criptografadas |
crawl_runs |
início, fim, estado, limites e estatísticas |
urls |
URL normalizada, domínio, primeira e última aparição |
page_snapshots |
status, metadados, hash, conteúdo e data |
links |
origem, destino, atributos e execução |
issues |
regra, evidência, gravidade, estado e histórico |
keywords |
termo, mercado, idioma e origem |
keyword_groups |
cluster, intenção e página-alvo |
serp_checks |
palavra, local, dispositivo, data e fornecedor |
serp_results |
posição, URL, domínio, tipo e recurso |
gsc_daily |
dimensões e métricas diárias |
ga4_daily |
dimensões, eventos e métricas diárias |
web_vitals |
fonte, URL/origem, dispositivo e métricas |
backlink_snapshots |
alvo, origem, âncora, estado e provedor |
alerts |
regra, deduplicação, severidade e entrega |
jobs |
agenda, execução, tentativas, custo e erro |
Estratégias importantes
- uma URL normalizada não substitui a URL observada; guardar ambas;
- métricas externas sempre carregam data, fonte, localização e dispositivo;
- snapshots grandes devem ser comprimidos no disco ou armazenamento compatível com S3, não acumulados integralmente em JSONB;
- manter no PostgreSQL os campos necessários para consulta e o caminho/hash do artefato bruto;
- particionar séries temporais apenas quando o volume justificar;
- implementar retenção: SERP detalhada, HTML bruto e screenshots não precisam viver para sempre;
- nunca apagar histórico por causa de uma nova execução incompleta.
Frequência de coleta recomendada
| Dado | Frequência inicial |
|---|---|
| Search Console e GA4 | diária, importando dias recentes novamente |
| palavras-chave críticas | diária |
| demais palavras-chave | semanal |
| páginas próprias críticas | diária |
| crawl completo próprio | semanal |
| páginas concorrentes prioritárias | diária ou a cada 2 dias |
| crawl amplo de concorrentes | semanal ou quinzenal |
| PageSpeed/Lighthouse | semanal e após deploy |
| CrUX | semanal; a janela é móvel e atualizada diariamente |
| backlinks novos/perdidos | semanal |
| volume de palavras-chave | mensal |
| DNS, TLS, sitemap e robots | diária |
Reimportar uma pequena janela recente do Search Console e GA4 ajuda a capturar ajustes tardios. Todas as tarefas devem ser idempotentes.
Segurança, ética e limites legais
Coleta responsável
- identificar o crawler com
User-Agente meio de contato; - respeitar robots.txt e termos específicos do site;
- limitar concorrência por host, inicialmente a uma requisição por vez;
- usar intervalo, jitter, backoff e
Retry-After; - aproveitar
ETag,Last-Modifiede respostas condicionais; - não contornar login, paywall, CAPTCHA ou bloqueios;
- não reproduzir conteúdo concorrente; guardar apenas o necessário para análise privada e controlar retenção;
- permitir exclusões de caminhos e domínios;
- documentar a base e a finalidade de qualquer dado pessoal eventualmente encontrado, considerando a LGPD.
Proteção do próprio crawler
Um sistema que aceita URLs pode ser explorado para alcançar serviços internos. Aplicar proteção contra SSRF:
- aceitar apenas
httpehttps; - resolver DNS antes e validar novamente após redirects;
- bloquear loopback, link-local, redes privadas, multicast e metadata de nuvem;
- limitar redirects, bytes, tempo e tipo MIME;
- impedir
file:,ftp:,gopher:,data:e esquemas desconhecidos; - executar o worker de navegação sem acesso desnecessário à rede interna;
- não passar URLs a comandos de shell;
- sanitizar HTML antes de mostrar snapshots na interface.
Credenciais
- OAuth com escopos mínimos;
- tokens criptografados em repouso;
- segredos fora do repositório;
- rotação e revogação visíveis;
- logs sem tokens, cookies ou conteúdo sensível;
- backup criptografado;
- autenticação forte mesmo sendo um sistema pessoal exposto à internet.
Custos realistas
Cenário econômico
Para um site, 3 a 5 concorrentes e algumas centenas de palavras-chave:
- servidor doméstico ou VPS pequena;
- banco e crawler próprios;
- APIs Google e Bing dentro das cotas;
- SERP paga somente para termos escolhidos;
- backlinks consultados semanalmente;
- custo dominado pelo fornecedor de dados, não pela hospedagem.
Como impedir surpresas
Cada tarefa paga deve ter:
- preço estimado antes do envio;
- limite diário e mensal por projeto;
- cache por conjunto de parâmetros;
- deduplicação de pedidos simultâneos;
- profundidade configurável;
- botão para pausar o fornecedor;
- alerta em 50%, 80% e 100% do orçamento;
- relatório por módulo, palavra e concorrente.
Não consultar mil palavras diariamente só porque é possível. Criar camadas:
- críticas: todos os dias;
- importantes: duas ou três vezes por semana;
- exploratórias: semanal ou mensalmente;
- arquivadas: sem coleta.
Roteiro de construção
Os prazos abaixo são estimativas para uma pessoa com experiência em Python e web, trabalhando em tempo parcial. Pesquisa, configuração de OAuth e qualidade dos sites monitorados podem alterar bastante o tempo.
Fase 0 — prova de conceito, 2 a 4 dias
- cadastrar um domínio próprio e dois concorrentes;
- baixar 20 páginas por domínio;
- extrair metadados e texto;
- guardar snapshots;
- mostrar uma comparação entre duas versões;
- testar uma API de SERP com 10 palavras-chave.
Saída: confirmação de que crawling, diff e fornecedor atendem ao nicho.
Fase 1 — fundação, 1 semana
- projeto Django, PostgreSQL e autenticação;
- projetos, domínios e configurações;
- worker, scheduler e estados de tarefa;
- logs, retries, orçamento e health check;
- backup e ambiente de desenvolvimento reproduzível.
Fase 2 — crawler próprio e auditoria, 1 a 2 semanas
- sitemap, fila persistente e escopo;
- normalização, redirects e robots;
- extração técnica;
- links e profundidade;
- primeiro conjunto de regras;
- histórico por execução.
Fase 3 — concorrentes e alterações, 1 a 2 semanas
- páginas prioritárias;
- normalização de conteúdo;
- diff de metadados, texto e links;
- descoberta de páginas novas;
- linha do tempo e alertas agrupados.
Fase 4 — dados próprios, 1 a 2 semanas
- OAuth;
- Search Console;
- GA4;
- Bing Webmaster;
- CrUX e PageSpeed;
- painéis e reconciliação diária.
Fase 5 — SERP e palavras-chave, 1 a 2 semanas
- adaptador do primeiro fornecedor;
- rank tracking;
- recursos de SERP;
- clusters;
- páginas-alvo, lacunas e canibalização;
- orçamento e cache.
Fase 6 — backlinks e relatórios, 1 a 2 semanas
- resumo e links novos/perdidos;
- interseção de domínios de referência;
- relatório semanal;
- exportação CSV;
- notificações por e-mail, ntfy ou Gotify.
Fase 7 — inteligência avançada, contínua
- score de oportunidade calibrado;
- embeddings opcionais;
- correlação de alterações com desempenho;
- anotações de deploy e campanhas;
- resumo assistido por IA com links para todas as evidências;
- local SEO, se for relevante.
Um MVP convincente pode surgir em 4 a 8 semanas de trabalho parcial. Uma versão madura tende a exigir 3 a 6 meses de evolução. São estimativas de planejamento, não promessas de prazo.
O que não construir no início
- microserviços;
- Kubernetes;
- um navegador para toda página;
- um índice global próprio de backlinks;
- scraping direto de resultados do Google;
- um frontend React separado;
- data warehouse;
- modelos próprios de linguagem;
- geração automática de centenas de artigos;
- pontuação opaca de “autoridade”;
- previsão de tráfego apresentada como certeza;
- integrações antes de existir um caso de uso diário.
Melhor versão mínima
O menor produto que já justificaria o esforço contém:
- cadastro de um site e cinco concorrentes;
- crawler semanal do próprio site;
- monitor diário de páginas concorrentes selecionadas;
- Search Console importado diariamente;
- 100 a 300 palavras-chave divididas por prioridade;
- uma API de SERP;
- diff de title, headings, texto, links e schema;
- problemas técnicos com evidência;
- painel de mudanças e oportunidades;
- resumo semanal e alertas críticos.
Backlinks, GA4, CrUX, clustering semântico e IA entram depois. Essa ordem produz valor cedo e evita investir meses antes de descobrir quais relatórios realmente mudam decisões.
Recomendações práticas
Decisão final de stack
Usaria:
Python 3.14
Django 5.2 LTS
PostgreSQL 18
Celery 5.6 + Redis + Celery Beat
Django Templates + HTMX + Chart.js
HTTPX + lxml/selectolax
Trafilatura + extruct
Playwright em uma fila opcional
scikit-learn primeiro; sentence-transformers depois
Docker Compose
DataForSEO como primeiro teste de dados competitivos
Google Search Console + GA4 + CrUX + PageSpeed
Bing Webmaster + IndexNow
Primeiras decisões de produto
- o sistema será privado e single-user no começo;
- português do Brasil como interface, com mercados e idiomas configuráveis;
- frequência e orçamento por projeto;
- evidência sempre clicável junto à recomendação;
- dado externo sempre identificado pela fonte;
- toda afirmação incerta marcada como estimativa;
- exportação CSV e JSON desde cedo;
- adaptadores independentes para não aprisionar o projeto a um fornecedor;
- IA apenas resume e investiga dados existentes, nunca inventa métricas.
Ordem recomendada para começar amanhã
- Criar o repositório e a base Django.
- Modelar
Project,Domain,Url,CrawlRunePageSnapshot. - Implementar downloader seguro e normalizador de URL.
- Extrair metadados, links, texto e dados estruturados.
- Produzir o primeiro diff útil.
- Integrar Search Console.
- Testar DataForSEO e SerpApi com o mesmo conjunto de 20 termos.
- Comparar precisão, localização, recursos de SERP, latência e custo.
- Implementar o painel diário.
- Só então expandir para backlinks e agrupamento semântico.
Conclusão
Construir um sistema pessoal completo de SEO é viável e uma boa ideia. A parte que você deve possuir é justamente a mais valiosa para o uso cotidiano: histórico, crawler, regras, alertas, integração dos próprios dados, comparação de concorrentes e priorização.
O projeto fica difícil quando tenta produzir sozinho os ativos que grandes empresas levaram anos e enorme infraestrutura para formar: índices globais de links, bases de palavras-chave e coleta contínua de SERPs. A solução não é abandonar a ideia, mas desenhá-la como uma plataforma híbrida. O Radar SEO Pessoal coleta diretamente o que é razoável, usa APIs oficiais no que pertence ao usuário e compra de forma controlada somente os dados competitivos.
A recomendação é iniciar pelo MVP de crawler, mudanças de concorrentes e Search Console. Essa versão já pode superar ferramentas genéricas em relevância pessoal, porque acompanha exatamente os sites, páginas, consultas e decisões que importam. SERPs pagas vêm em seguida; backlinks e IA, somente depois que o fluxo básico estiver sendo usado de verdade.
Fontes consultadas
Google e Bing
- Google Search Console API
- Cotas da Search Console API
- Google Analytics Data API
- Cotas da Google Analytics Data API
- Google Ads: geração de ideias de palavras-chave
- Google Ads: métricas históricas de palavras-chave
- Google Ads: visão geral do planejamento de palavras-chave
- PageSpeed Insights API
- Chrome UX Report API
- Visão geral do Lighthouse
- Google Search: rastreamento e indexação
- Google Search: políticas de spam e tráfego automatizado
- Google Search: conteúdo útil e voltado às pessoas
- Bing Webmaster API
- Documentação do IndexNow
Dados competitivos e web aberta
- DataForSEO APIs
- DataForSEO SERP API
- DataForSEO Backlinks API
- Preços da DataForSEO Backlinks API
- SerpApi Search API
- Semrush API: visão geral
- Semrush Projects API
- Common Crawl: primeiros passos
- Índice de URLs do Common Crawl
Stack e bibliotecas
- Versões ativas do Python
- Django 5.2 LTS
- Versões suportadas do Django
- Política de versões do PostgreSQL
- Celery: integração com Django
- Celery 5.6
- Django Tasks e a necessidade de worker externo
- Scrapy: arquitetura
- HTTPX: timeouts
- HTTPX: limites de recursos
- Trafilatura
- extruct
- advertools
- Playwright para Python
- HTMX
- Chart.js
- uv
- scikit-learn: extração de atributos textuais
- Sentence Transformers
- OWASP: prevenção de SSRF
Nota sobre atualidade
Pesquisa concluída em 26 de julho de 2026. Versões, preços, cotas, condições de acesso e políticas de APIs podem mudar. Confirme esses pontos nas fontes oficiais antes de contratar serviços ou fixar dependências.