Los hilos de Reddit contienen comentarios sobre productos sin filtrar, solicitudes de funciones y quejas de la competencia que ninguna encuesta puede replicar. Este escáner busca señales de mercado en varios subreddits, las clasifica por tipo (punto débil, solicitud de función, mención de la competencia, intención de compra) y genera un informe de investigación priorizado. Cada búsqueda cuesta $0,005 a través del punto final de Scavio Reddit.
Requisitos previos
- Python 3.8+
- solicita biblioteca
- Una clave API de Scavio de scavio.dev
- Categoría de producto objetivo o mercado a investigar
Guia paso a paso
Paso 1: Configurar el escáner de investigación de mercado
Configure consultas de búsqueda dirigidas a diferentes tipos de señales de mercado.
import os, requests
from collections import defaultdict
API_KEY = os.environ['SCAVIO_API_KEY']
SH = {'x-api-key': API_KEY, 'Content-Type': 'application/json'}
def market_queries(product):
return [
f'{product} alternative to',
f'{product} looking for recommendation',
f'{product} vs',
f'{product} problem with',
f'{product} wish feature',
f'{product} switched from',
]
PRODUCT = 'serp api'
queries = market_queries(PRODUCT)
print(f'Market research for "{PRODUCT}": {len(queries)} signal queries')
print(f'Estimated cost: ${len(queries) * 0.005:.3f}')Paso 2: Escanee Reddit en busca de señales de mercado
Ejecute búsquedas y extraiga señales de mercado estructuradas de los resultados.
SIGNAL_TYPES = {
'alternative to': 'switching_intent',
'looking for': 'purchase_intent',
'recommendation': 'purchase_intent',
'vs': 'comparison',
'problem with': 'pain_point',
'wish feature': 'feature_request',
'switched from': 'churn_signal'
}
def scan_signals(product):
signals = defaultdict(list)
for query in market_queries(product):
data = requests.post('https://api.scavio.dev/api/v1/search',
headers=SH, json={'query': query, 'platform': 'reddit', 'country_code': 'us'}).json()
signal_type = next((v for k, v in SIGNAL_TYPES.items() if k in query), 'other')
for r in data.get('organic_results', [])[:5]:
signals[signal_type].append({
'title': r.get('title', '')[:80],
'snippet': r.get('snippet', '')[:150],
'link': r.get('link', '')
})
return dict(signals)
signals = scan_signals(PRODUCT)
for stype, items in signals.items():
print(f'\n{stype}: {len(items)} signals')
for item in items[:2]:
print(f' - {item["title"][:60]}')Paso 3: Extraiga competidores y puntos débiles
Analice las señales para identificar los competidores mencionados y los puntos débiles recurrentes.
def extract_competitors(signals):
competitors = defaultdict(int)
for items in signals.values():
for item in items:
text = f"{item['title']} {item['snippet']}".lower()
known = ['serpapi', 'dataforseo', 'serper', 'scrapingbee', 'brightdata', 'apify', 'tavily', 'exa']
for comp in known:
if comp in text:
competitors[comp] += 1
return dict(sorted(competitors.items(), key=lambda x: -x[1]))
def extract_pain_points(signals):
pain_keywords = ['slow', 'expensive', 'unreliable', 'broken', 'complex', 'limited',
'missing', 'annoying', 'frustrating', 'confusing']
pains = defaultdict(int)
for items in signals.get('pain_point', []) + signals.get('churn_signal', []):
text = f"{items['title']} {items['snippet']}".lower()
for kw in pain_keywords:
if kw in text:
pains[kw] += 1
return dict(sorted(pains.items(), key=lambda x: -x[1]))
comps = extract_competitors(signals)
pains = extract_pain_points(signals)
print(f'\nCompetitors mentioned: {comps}')
print(f'Pain points: {pains}')Paso 4: Generar informe de investigación de mercado
Combine todas las señales en un informe de investigación de mercado estructurado.
def market_report(product):
signals = scan_signals(product)
competitors = extract_competitors(signals)
pains = extract_pain_points(signals)
cost = len(market_queries(product)) * 0.005
print(f'\n=== Market Research Report: {product} ===')
print(f'\nSignal summary:')
for stype, items in signals.items():
print(f' {stype:20}: {len(items)} signals')
print(f'\nTop competitors mentioned:')
for comp, count in list(competitors.items())[:5]:
print(f' {comp:20}: {count} mentions')
print(f'\nTop pain points:')
for pain, count in list(pains.items())[:5]:
print(f' {pain:20}: {count} mentions')
# High-intent signals
purchase = signals.get('purchase_intent', [])
print(f'\nHigh-intent threads ({len(purchase)}):')
for p in purchase[:3]:
print(f' - {p["title"][:60]}')
print(f'\nCost: ${cost:.3f}')
market_report('serp api')Ejemplo en Python
import os, requests
from collections import defaultdict
SH = {'x-api-key': os.environ['SCAVIO_API_KEY'], 'Content-Type': 'application/json'}
def scan(product):
signals = defaultdict(list)
for q in [f'{product} alternative', f'{product} vs', f'{product} problem']:
data = requests.post('https://api.scavio.dev/api/v1/search',
headers=SH, json={'query': q, 'platform': 'reddit', 'country_code': 'us'}).json()
for r in data.get('organic_results', [])[:3]:
signals[q.split()[-1]].append(r.get('title', '')[:60])
for stype, items in signals.items():
print(f'{stype}: {len(items)} signals')
for i in items[:2]: print(f' - {i}')
scan('serp api')Ejemplo en JavaScript
const SH = { 'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json' };
async function scan(product) {
for (const suffix of ['alternative', 'vs', 'problem']) {
const data = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST', headers: SH,
body: JSON.stringify({ query: `${product} ${suffix}`, platform: 'reddit', country_code: 'us' })
}).then(r => r.json());
console.log(`${suffix}: ${(data.organic_results || []).length} results`);
(data.organic_results || []).slice(0, 2).forEach(r => console.log(` - ${r.title.slice(0, 60)}`));
}
}
scan('serp api').catch(console.error);Salida esperada
Market research for "serp api": 6 signal queries
Estimated cost: $0.030
switching_intent: 8 signals
- Looking for SerpAPI alternative, too expensive for startup
- Switched from SerpAPI to something cheaper
purchase_intent: 6 signals
comparison: 7 signals
pain_point: 5 signals
Top competitors mentioned:
serpapi : 8 mentions
dataforseo : 5 mentions
serper : 3 mentions
Cost: $0.030