Lo esencial
En esta lección vas a construir justo ese sistema: configurarás el monitoreo automático de tu competencia y pondrás a correr un reporte semanal con IA.
Conceptos clave
- Inteligencia competitiva: reunir y analizar de forma sistemática datos sobre lo que hacen tus competidores para tomar decisiones estratégicas
- Ahrefs MCP: integración de los datos SEO (optimización para buscadores) de Ahrefs en Claude para analizar el tráfico orgánico y las palabras clave de la competencia
- Playwright: una biblioteca de Microsoft para automatizar el navegador: permite extraer datos (scraping) de cualquier sitio
- ChangeDetection.io: un servicio que vigila cambios en páginas web y avisa
- SimilarWeb API (API: interfaz de programación de aplicaciones): datos sobre la audiencia, las fuentes de tráfico y la demografía de los visitantes de la competencia
- Price scraping: recolección automática y periódica de los precios de la competencia
- Análisis diferencial: comparar el "antes / después" para detectar cambios estratégicos
- Síntesis de datos: cuando Claude convierte hechos sueltos en un reporte estratégico coherente
Teoría
Inteligencia competitiva: qué cambió con la IA
Antes de la IA, el análisis de la competencia era un ritual trimestral. Contratas a un becario o a un analista, se pasa una semana revisando sitios, exporta datos de Semrush y arma una tabla. La miras y te das cuenta de que los datos ya son viejos: el competidor lanzó ayer una función nueva.
Hoy la arquitectura es otra:
- Los datos se reúnen automáticamente (Playwright, ChangeDetection, API)
- La actualización es diaria o semanal, sin que intervenga una persona
- El análisis es inmediato, con Claude
- La entrega llega a un chat o al correo el lunes en la mañana
No es solo más rápido. Es otra clase de herramienta: ves el mercado en tiempo real, no una foto del trimestre pasado.
Qué vigilar: el mapa de observación de la competencia
No todo importa igual. Esto es lo que conviene seguir, en orden de prioridad:
| Señal | Qué significa | Herramienta |
|---|---|---|
| Cambio de precios | El competidor prueba un nuevo modelo de monetización | Scraping con Playwright |
| Páginas nuevas en el sitio | Entran a un nicho nuevo o lanzan una función | ChangeDetection.io |
| Crecimiento del tráfico orgánico | Encontraron una estrategia SEO que funciona | Ahrefs MCP / Semrush |
| Palabras clave nuevas | A qué le apuestan en contenido | Ahrefs / SpyFu |
| Cambio en la página principal | Reposicionamiento del producto o de su propuesta de valor | ChangeDetection.io |
| Vacantes | En qué invierten (si contratan desarrolladores, viene un producto) | La página de empleos del sitio del competidor (ChangeDetection.io), LinkedIn a mano |
| Reseñas de clientes | Puntos débiles (las quejas = tus oportunidades) | G2, Capterra, App Store |
Ahrefs MCP: datos SEO directo en Claude
Ahrefs es una de las herramientas SEO líderes: muestra el tráfico orgánico de los sitios, las palabras clave con las que posicionan y de dónde vienen sus enlaces. La integración MCP (Model Context Protocol) te deja consultar esos datos directamente desde Claude, sin cambiar de herramienta. Ahrefs y Semrush tienen conexión MCP; la disponibilidad depende del plan, revísala en tu cuenta del servicio.
Qué puedes preguntar con Ahrefs MCP:
- ¿Cuánto tráfico orgánico tiene competitor.com?
- ¿Con qué palabras clave están en el top 3 de Google?
- ¿Qué páginas les traen más tráfico?
- ¿Con qué palabras clave nuevas empezaron a posicionar en el último mes?
Ejemplo práctico de petición en Claude con Ahrefs MCP:
Usa Ahrefs MCP para analizar al competidor [URL]. Necesito: 1. El tráfico orgánico total de los últimos 3 meses (tendencia) 2. Las 10 páginas con más tráfico 3. Palabras clave en posiciones 4-10 (opportunity keywords, casi en el top) 4. Palabras clave nuevas de los últimos 30 días Con base en el análisis: - ¿Qué le funciona al competidor en SEO? - ¿Qué palabras clave me conviene atacar? - ¿Hay temas de contenido que se les pasaron?
Sin MCP: la alternativa con la API de Ahrefs:
import requests
import anthropic
import json
from datetime import date
def get_ahrefs_data(domain: str, api_key: str) -> dict:
"""Obtiene las métricas SEO principales de un dominio con la Ahrefs API v3.
La API está disponible en los planes de pago. Revisa los parámetros obligatorios y los límites en docs.ahrefs.com:
los parámetros de los endpoints cambian."""
headers = {"Authorization": f"Bearer {api_key}"}
base = "https://api.ahrefs.com/v3"
# Métricas orgánicas
metrics_resp = requests.get(
f"{base}/site-explorer/metrics",
headers=headers,
params={"target": domain, "mode": "domain", "date": date.today().isoformat()}
)
# Páginas principales
pages_resp = requests.get(
f"{base}/site-explorer/top-pages",
headers=headers,
params={"target": domain, "mode": "domain", "limit": 10}
)
return {
"metrics": metrics_resp.json() if metrics_resp.ok else {},
"top_pages": pages_resp.json() if pages_resp.ok else {}
}
# Análisis con Claude
client = anthropic.Anthropic()
competitors = ["competitor1.com", "competitor2.com", "competitor3.com"]
# AHREFS_API_KEY = os.getenv("AHREFS_API_KEY")
# Para la demostración, la estructura de datos que vas a recibir:
demo_data = {
"competitor1.com": {
"organic_traffic": 45200,
"organic_keywords": 3840,
"top_pages": [
{"url": "/blog/ai-automation-guide", "traffic": 8400},
{"url": "/pricing", "traffic": 4200},
]
}
}
message = client.messages.create(
model="claude-sonnet-5-5",
max_tokens=1500,
messages=[{
"role": "user",
"content": f"""Analiza los datos SEO de la competencia:
{json.dumps(demo_data, ensure_ascii=False, indent=2)}
Mi sitio es [tu dominio], nicho: herramientas de IA para pequeños negocios.
Responde:
1. ¿Quién lidera en orgánico y por qué?
2. ¿Qué temas o páginas generan más tráfico?
3. ¿Qué palabras clave me conviene atacar primero?
4. ¿Qué se les escapa a los competidores (huecos de contenido)?"""
}]
)
print("".join(b.text for b in message.content if b.type == "text"))Playwright: scraping de cualquier sitio
Playwright es una biblioteca de Microsoft para automatizar el navegador. A diferencia de las peticiones HTTP simples, Playwright abre un navegador de verdad, así que funciona incluso con sitios que se dibujan con JavaScript (React, Vue, Next.js).
Instalación:
pip install playwright
playwright install chromiumScraping de los precios de la competencia:
import asyncio
from playwright.async_api import async_playwright
import json
from datetime import datetime
async def scrape_pricing_page(url: str) -> dict:
"""Extrae la página de precios de un competidor"""
async with async_playwright() as p:
browser = await p.chromium.launch(headless=True)
page = await browser.new_page()
# Nos presentamos como un navegador normal; no evadimos la protección del sitio
await page.set_extra_http_headers({
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36"
})
await page.goto(url, wait_until="networkidle", timeout=30000)
# Extraemos el texto de la página
content = await page.inner_text("body")
# Buscamos los precios con JavaScript
prices = await page.evaluate("""
() => {
const priceElements = document.querySelectorAll('[class*="price"], [class*="plan"], [class*="tier"]');
return Array.from(priceElements).map(el => el.innerText.trim()).filter(t => t.length > 0);
}
""")
await browser.close()
return {
"url": url,
"scraped_at": datetime.now().isoformat(),
"page_text": content[:5000], # los primeros 5000 caracteres
"price_elements": prices[:20]
}
async def monitor_competitors(competitor_urls: list) -> list:
"""Vigila una lista de competidores en paralelo"""
tasks = [scrape_pricing_page(url) for url in competitor_urls]
results = await asyncio.gather(*tasks, return_exceptions=True)
return [r for r in results if not isinstance(r, Exception)]
# Arranque
competitors_pricing = [
"https://competitor1.com/pricing",
"https://competitor2.com/plans",
]
results = asyncio.run(monitor_competitors(competitors_pricing))
# Guardamos con la fecha (para el análisis diferencial)
filename = f"competitor_data_{datetime.now().strftime('%Y-%m-%d')}.json"
with open(filename, 'w', encoding='utf-8') as f:
json.dump(results, f, ensure_ascii=False, indent=2)
print(f"Datos guardados: {filename}")El scraping y las reglas. Reúne solo páginas públicas, lee el robots.txt y los términos de uso del sitio, no evadas la protección contra bots y no generes carga de más: para monitorear, una vez por semana basta. Si necesitas una o dos páginas sin escribir código propio, te sirve Firecrawl (entrega la página como markdown limpio).
Análisis diferencial (qué cambió):
import json
from datetime import datetime, timedelta
def find_changes(old_file: str, new_file: str) -> dict:
"""Compara dos fotos de los datos de la competencia"""
with open(old_file) as f:
old_data = json.load(f)
with open(new_file) as f:
new_data = json.load(f)
changes = []
old_by_url = {r['url']: r for r in old_data}
new_by_url = {r['url']: r for r in new_data}
for url in new_by_url:
if url in old_by_url:
old_text = old_by_url[url].get('page_text', '')
new_text = new_by_url[url].get('page_text', '')
# Comparación simple; en producción usa difflib
if old_text != new_text:
changes.append({
"url": url,
"change_detected": True,
"old_length": len(old_text),
"new_length": len(new_text),
"delta": len(new_text) - len(old_text)
})
return changesChangeDetection.io: monitoreo sin código
Para páginas que no necesitan un análisis complicado, ChangeDetection.io es más sencillo y confiable que escribir tu propio scraper.
Cómo configurarlo:
- Regístrate en changedetection.io (la versión que instalas en tu propio servidor es gratis, la versión en la nube es de pago; precios en el sitio)
- Agrega la URL del competidor
- Indica qué elementos vigilar (puede ser con un selector CSS)
- Configura el aviso: correo o webhook
Webhook → n8n → Claude → aviso en un chat:
ChangeDetection.io detectó un cambio
→ Webhook POST a n8n
→ n8n: petición a Claude con el texto de "antes" y "después"
→ Claude analiza: ¿qué cambió en lo estratégico?
→ Te llega un aviso por Telegram (o por correo, o por Slack) con el análisisEjemplo de workflow de n8n (mira la lección n8n y workflows con IA) con un paso extra de Claude:
Prompt de sistema para Claude en n8n:
Eres un analista de inteligencia competitiva.
Un competidor cambió una página de su sitio.
Esto es lo que había:
{old_content}
Esto es lo que hay ahora:
{new_content}
Analiza:
1. ¿Qué cambió exactamente (en concreto)?
2. ¿Qué dice esto en lo estratégico?
3. ¿Necesitamos reaccionar? ¿Cómo?
Sé breve: 3-5 oraciones.SimilarWeb API: la audiencia de la competencia
SimilarWeb muestra lo que Ahrefs no: las fuentes de tráfico (no solo orgánico, también publicidad pagada, directo, referidos), la geografía de la audiencia, la demografía y el comportamiento.
Lo que conviene saber:
- La API oficial está pensada para cuentas empresariales y es cara (precio bajo solicitud)
- Para vigilar a pocos competidores basta la extensión gratuita de SimilarWeb para el navegador (tomas los datos a mano una vez al mes)
- En los marketplaces de API hay envoltorios no oficiales, pero sus condiciones y la calidad de sus datos las tienes que revisar tú
Lo que de verdad te sirve saber de un competidor en SimilarWeb:
- % del tráfico que viene de búsqueda vs. directo vs. redes sociales (el tráfico directo = audiencia leal)
- Las principales fuentes de tráfico de referidos (alianzas y menciones que funcionan)
- La duración promedio de la sesión (qué tan involucrada está la audiencia)
- Los países con más audiencia
El pipeline completo: reporte semanal de inteligencia
Esta es la arquitectura del sistema que vas a construir:
[LUNES 06:00, automático]
│
├─ Scraper con Playwright: reúne los datos de precios de la competencia
├─ ChangeDetection: revisa cambios en los sitios
└─ Ahrefs API: descarga las métricas SEO
│
▼
[Análisis de Claude]
Junta todos los datos
Compara con la semana pasada
Arma un reporte con conclusiones
│
▼
[Bot de Telegram, 08:00]
📊 Reporte semanal de la competencia
Competidor 1: sin cambios
Competidor 2: ⚠️ Bajó el precio de $49 → $39
Competidor 3: 🆕 Página nueva /ai-assistant
Análisis de Claude: [conclusiones estratégicas]En el ejemplo el reporte llega por Telegram porque su API para bots es sencilla; puedes cambiar ese último paso por correo o Slack.
Script: reporte semanal automático
import asyncio
import anthropic
import json
import os
from datetime import datetime
from playwright.async_api import async_playwright
import requests
ANTHROPIC_API_KEY = os.getenv("ANTHROPIC_API_KEY")
TELEGRAM_TOKEN = os.getenv("TELEGRAM_TOKEN")
TELEGRAM_CHAT_ID = os.getenv("TELEGRAM_CHAT_ID")
COMPETITORS = [
{
"name": "Competidor A",
"pricing_url": "https://competitorA.com/pricing",
"homepage": "https://competitorA.com"
},
{
"name": "Competidor B",
"pricing_url": "https://competitorB.com/plans",
"homepage": "https://competitorB.com"
},
]
async def scrape_page_text(url: str) -> str:
"""Devuelve el contenido de texto de la página"""
try:
async with async_playwright() as p:
browser = await p.chromium.launch(headless=True)
page = await browser.new_page()
await page.goto(url, wait_until="domcontentloaded", timeout=20000)
text = await page.inner_text("body")
await browser.close()
return text[:8000]
except Exception as e:
return f"Error de scraping en {url}: {e}"
def load_previous_data(filename: str) -> dict:
try:
with open(filename) as f:
return json.load(f)
except FileNotFoundError:
return {}
def save_current_data(data: dict, filename: str):
with open(filename, 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=2)
def send_telegram(message: str):
url = f"https://api.telegram.org/bot{TELEGRAM_TOKEN}/sendMessage"
requests.post(url, json={
"chat_id": TELEGRAM_CHAT_ID,
"text": message,
"parse_mode": "Markdown"
})
async def generate_weekly_report():
print(f"Empiezo a reunir datos: {datetime.now()}")
# Cargamos los datos anteriores
prev_data = load_previous_data("competitor_snapshot.json")
current_data = {}
# Hacemos scraping de todos los competidores
for competitor in COMPETITORS:
print(f" Extrayendo {competitor['name']}...")
pricing_text = await scrape_page_text(competitor['pricing_url'])
homepage_text = await scrape_page_text(competitor['homepage'])
current_data[competitor['name']] = {
"scraped_at": datetime.now().isoformat(),
"pricing": pricing_text,
"homepage": homepage_text
}
# Guardamos la foto actual
save_current_data(current_data, "competitor_snapshot.json")
# Armamos el contexto para Claude
analysis_input = []
for name, data in current_data.items():
prev = prev_data.get(name, {})
analysis_input.append({
"competitor": name,
"current_pricing": data['pricing'][:2000],
"current_homepage": data['homepage'][:1000],
"previous_pricing": prev.get('pricing', 'Sin datos')[:2000],
"change_detected": data['pricing'] != prev.get('pricing', '')
})
# Análisis con Claude
client = anthropic.Anthropic(api_key=ANTHROPIC_API_KEY)
message = client.messages.create(
model="claude-sonnet-5-5",
max_tokens=1500,
messages=[{
"role": "user",
"content": f"""Este es el reporte semanal de inteligencia competitiva.
Datos de los competidores (semana actual vs. la anterior):
{json.dumps(analysis_input, ensure_ascii=False, indent=2)}
Escribe un reporte breve (hasta 500 palabras) para un chat, con emojis:
1. 🔍 Qué cambió en cada competidor
2. ⚠️ Señales importantes que requieren que reaccionemos
3. 💡 Una recomendación estratégica para esta semana
Si no hubo cambios, dilo también de forma directa."""
}]
)
report = "".join(b.text for b in message.content if b.type == "text")
# Enviamos a Telegram
header = f"📊 *Inteligencia semanal*: {datetime.now().strftime('%d/%m/%Y')}\n\n"
send_telegram(header + report)
print("Reporte enviado a Telegram")
# Arranque
asyncio.run(generate_weekly_report())Automatización con cron (que corra cada lunes a las 06:00):
# crontab -e
0 6 * * 1 cd /path/to/project && python competitive_monitor.py >> logs/ci_$(date +\%Y\%m\%d).log 2>&1Práctica
Tarea: configurar el monitoreo de 3 competidores con reporte semanal
Paso 1: preparar el entorno (5 minutos)
mkdir competitive-intel && cd competitive-intel
python3 -m venv venv && source venv/bin/activate
pip install playwright anthropic python-dotenv requests
playwright install chromium
# Crea el archivo .env:
# ANTHROPIC_API_KEY=sk-ant-...
# TELEGRAM_TOKEN=...
# TELEGRAM_CHAT_ID=...Paso 2: la primera foto a mano (10 minutos)
Crea first_snapshot.py usando el script generate_weekly_report() de la teoría.
Córrelo a mano para obtener la foto base:
python first_snapshot.pyVerifica que se haya creado competitor_snapshot.json con datos reales de la competencia.
Paso 3: configurar ChangeDetection.io (5 minutos)
- Instala changedetection.io en tu equipo o servidor (esa versión es gratis) o usa la versión en la nube
- Agrega las URL de las páginas de precios de los tres competidores
- Activa los avisos por correo o webhook
- Programa la revisión: cada 24 horas
Ahora, ante cualquier cambio en la página, te llegará un aviso sin correr scripts.
Paso 4: probar el análisis manual con Claude (10 minutos)
# test_analysis.py
import anthropic
import json
client = anthropic.Anthropic()
# Cargamos los datos extraídos
with open('competitor_snapshot.json') as f:
data = json.load(f)
# Les damos formato para Claude
summary = ""
for name, info in data.items():
summary += f"\n### {name}\n"
summary += f"Página de precios (primeros 500 caracteres):\n{info['pricing'][:500]}\n"
message = client.messages.create(
model="claude-sonnet-5-5",
max_tokens=1000,
messages=[{
"role": "user",
"content": f"""Estos son los datos de los sitios de la competencia:
{summary}
Dime:
1. ¿Qué modelo de precios usa cada uno?
2. ¿Quién es el más barato y quién el más caro?
3. ¿Qué parece lo más fuerte de su oferta?
4. ¿Qué puntos débiles ves?"""
}]
)
print("".join(b.text for b in message.content if b.type == "text"))Paso 5: configurar el arranque automático (5 minutos)
En Mac, con launchd o simplemente con cron:
# Abrimos el crontab
crontab -e
# Agregamos la línea (cada lunes a las 07:00)
0 7 * * 1 /Users/tu-usuario/competitive-intel/venv/bin/python /Users/tu-usuario/competitive-intel/competitive_monitor.pyEn un VPS, la misma línea en el crontab del usuario.
Alternativa: correrlo con el Schedule Trigger de n8n (lección n8n y workflows con IA): sin configurar un servidor, solo un nodo con horario.
Herramientas y recursos
- Playwright: automatización del navegador para scraping, gratis (Microsoft)
- ChangeDetection.io: monitoreo de cambios; gratis si lo instalas tú, de pago en la nube
- Ahrefs: datos SEO de la competencia; hay un Ahrefs Free gratuito para revisar tu propio sitio; precios de los planes de pago y condiciones de la API en su sitio
- Semrush: alternativa a Ahrefs, con periodo de prueba
- SpyFu: alternativa enfocada en datos de PPC (de pago)
- SimilarWeb: audiencia y tráfico, extensión gratuita del navegador para datos básicos
- Anthropic API: Claude para sintetizar y analizar los datos; los nombres de modelo en el código de la lección son de octubre de 2026; precios y versiones vigentes: Lo vigente
- G2 / Capterra: reseñas de los clientes de la competencia (una mina de sus debilidades)
Ideas clave
"La inteligencia competitiva antes costaba 3 días de un analista. Ahora, un script de 100 líneas y Claude. Pero el valor no está en los datos: está en actuar con base en ellos antes de que el competidor afiance su posición."
"El mejor hallazgo en un análisis de la competencia no es lo que hacen bien, sino lo que hacen mal. Las reseñas de los clientes de la competencia son, literalmente, una lista de funciones que hay que construir para atraer a su audiencia."
"Un reporte semanal automático no es un lujo. Es higiene. El mercado cambia cada semana. Quien lo mira una vez por trimestre siempre va atrás."
Siguiente lección
→ CRM en piloto automático: HubSpot + IA
Pasamos de observar el mercado a tus propias ventas: cómo Claude llena las fichas de clientes, califica prospectos y escribe los mensajes de seguimiento.
La marca se guarda solo en este navegador y no se envía a ningún sitio. Mi progreso