Moon Flower Society > 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.
Posted July 26, 2026. Markdown. Tags: pesquisa, seo, monitoramento, concorrentes, crawler, django, analytics.
É 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.
Não é difícil demais, desde que o escopo seja dividido corretamente:
O melhor resultado não é “mais uma ferramenta que mostra uma pontuação SEO”. É uma central privada que responde diariamente:
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:
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.
| 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 |
Primeira tela operacional, com:
O painel deve mostrar mudança e prioridade, não apenas totais.
Cada projeto contém:
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.
O crawler deverá:
title, meta description, headings e texto principal;Regras úteis:
noindex inesperado;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.
É o módulo de maior diferencial para uso pessoal. Para cada domínio, ele pode:
Para reduzir falsos positivos, o normalizador deve eliminar:
As comparações devem existir em três níveis:
Cada verificação precisa fixar:
Além da posição absoluta, o sistema deve calcular:
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.
Fontes possíveis:
Pipeline recomendado:
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.
Para propriedades verificadas, o sistema deve integrar:
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.
Usar três fontes complementares:
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.
Para concorrentes, use um provedor de índice. O sistema local deve:
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.
Alertas de alto valor:
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.
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"]
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.
| 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.
| 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.
| 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.
| 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.
| 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.
| 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:
| 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 |
| 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.
User-Agent e meio de contato;Retry-After;ETag, Last-Modified e respostas condicionais;Um sistema que aceita URLs pode ser explorado para alcançar serviços internos. Aplicar proteção contra SSRF:
http e https;file:, ftp:, gopher:, data: e esquemas desconhecidos;Para um site, 3 a 5 concorrentes e algumas centenas de palavras-chave:
Cada tarefa paga deve ter:
Não consultar mil palavras diariamente só porque é possível. Criar camadas:
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.
Saída: confirmação de que crawling, diff e fornecedor atendem ao nicho.
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 menor produto que já justificaria o esforço contém:
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.
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
Project, Domain, Url, CrawlRun e PageSnapshot.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.
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.
View the original Markdown file
Ideas | What changed | RSS | About | Text version
Pablo Murad <pablomurad@pm.me>