Apollo y proveedores de datos B2B similares lo encierran en costosas suscripciones con datos que se vuelven obsoletos. Una capa de enriquecimiento basada en búsquedas extrae datos nuevos cada vez que los necesita: descripciones de empresas de Google Knowledge Graph, señales tecnológicas de ofertas de trabajo, velocidad de contratación y presencia social. Este tutorial crea una capa de enriquecimiento modular utilizando la API de Scavio a $0,005 por búsqueda. Sin contratos anuales, sin bases de datos obsoletas.
Requisitos previos
- Python 3.9+ instalado
- solicita biblioteca instalada
- Una clave API de Scavio de scavio.dev
- Una lista de dominios o nombres de empresas para enriquecer
Guia paso a paso
Paso 1: Construir el enriquecedor del perfil de la empresa
Busque en Google cada empresa para extraer datos del Gráfico de conocimiento, descripción del sitio web e información básica de la empresa.
import os, requests, time, re
SCAVIO_KEY = os.environ['SCAVIO_API_KEY']
URL = 'https://api.scavio.dev/api/v1/search'
H = {'x-api-key': SCAVIO_KEY, 'Content-Type': 'application/json'}
def enrich_company(company: str) -> dict:
"""Get basic company profile from search."""
resp = requests.post(URL, headers=H,
json={'query': f'{company} company', 'country_code': 'us', 'num_results': 5})
data = resp.json()
kg = data.get('knowledge_graph', {})
organic = data.get('organic_results', [])
return {
'company': company,
'description': kg.get('description', organic[0].get('snippet', '') if organic else ''),
'website': kg.get('website', ''),
'type': kg.get('type', ''),
'founded': kg.get('founded', ''),
'headquarters': kg.get('headquarters', ''),
'employees': kg.get('employees', ''),
}
profile = enrich_company('Vercel')
for key, val in profile.items():
if val:
print(f' {key}: {val}')Paso 2: Agregar detección de pila de tecnología
Busque las ofertas de trabajo de la empresa para detectar su pila tecnológica. Los requisitos laborales revelan qué tecnologías utiliza realmente la empresa.
def detect_tech_stack(company: str) -> dict:
"""Detect tech stack from job postings."""
resp = requests.post(URL, headers=H,
json={'query': f'{company} hiring engineer 2026',
'country_code': 'us', 'num_results': 5})
results = resp.json().get('organic_results', [])
all_text = ' '.join(f"{r.get('title','')} {r.get('snippet','')}" for r in results).lower()
tech_categories = {
'languages': ['python', 'javascript', 'typescript', 'go', 'rust', 'java', 'ruby'],
'frameworks': ['react', 'next.js', 'django', 'fastapi', 'rails', 'spring', 'vue'],
'databases': ['postgresql', 'mongodb', 'redis', 'mysql', 'dynamodb', 'elasticsearch'],
'cloud': ['aws', 'gcp', 'azure', 'vercel', 'cloudflare', 'railway'],
'tools': ['docker', 'kubernetes', 'terraform', 'github actions', 'datadog'],
}
detected = {}
for category, techs in tech_categories.items():
found = [t for t in techs if t in all_text]
if found:
detected[category] = found
return {
'tech_stack': detected,
'hiring_signals': len(results),
'job_titles': [r['title'][:60] for r in results[:3]],
}
tech = detect_tech_stack('Vercel')
print(f'Tech Stack:')
for cat, techs in tech['tech_stack'].items():
print(f' {cat}: {", ".join(techs)}')
print(f'\nHiring signals: {tech["hiring_signals"]} job postings')Paso 3: Agregar análisis de presencia social
Compruebe la presencia de la empresa en Reddit y YouTube. La presencia social activa indica una empresa que interactúa con los desarrolladores y podría ser una buena perspectiva.
def analyze_social(company: str) -> dict:
"""Check social presence on Reddit and YouTube."""
social = {}
# Reddit presence
resp = requests.post(URL, headers=H,
json={'query': f'site:reddit.com {company}',
'country_code': 'us', 'num_results': 5})
reddit_results = resp.json().get('organic_results', [])
social['reddit'] = {
'mentions': len(reddit_results),
'subreddits': list(set(
re.search(r'r/(\w+)', r.get('link', '')).group(1)
for r in reddit_results
if re.search(r'r/(\w+)', r.get('link', ''))
)),
'recent_topics': [r['title'][:60] for r in reddit_results[:3]],
}
time.sleep(0.3)
# YouTube presence
resp = requests.post(URL, headers=H,
json={'query': f'site:youtube.com {company}',
'country_code': 'us', 'num_results': 5})
yt_results = resp.json().get('organic_results', [])
social['youtube'] = {
'videos': len(yt_results),
'recent_videos': [r['title'][:60] for r in yt_results[:3]],
}
return social
social = analyze_social('Vercel')
print(f'Reddit: {social["reddit"]["mentions"]} mentions in {", ".join(social["reddit"]["subreddits"][:3])}')
print(f'YouTube: {social["youtube"]["videos"]} videos')Paso 4: Construir todo el proceso de enriquecimiento y exportar
Combine todas las fuentes de enriquecimiento en un perfil de empresa completo. Exporte como JSON para integración con CRM o CSV para revisión manual.
import json, csv
def full_enrichment(company: str) -> dict:
"""Run all enrichment steps for a company."""
profile = enrich_company(company)
time.sleep(0.3)
tech = detect_tech_stack(company)
time.sleep(0.3)
social = analyze_social(company)
profile.update({
'tech_stack': tech['tech_stack'],
'hiring_signals': tech['hiring_signals'],
'reddit_mentions': social['reddit']['mentions'],
'youtube_videos': social['youtube']['videos'],
'credits_used': 4, # 1 company + 1 jobs + 1 reddit + 1 youtube
'cost': 0.020,
})
return profile
def batch_enrich(companies: list, output: str = 'enriched_companies.json'):
results = []
for company in companies:
print(f'Enriching: {company}...')
profile = full_enrichment(company)
results.append(profile)
time.sleep(0.5)
with open(output, 'w') as f:
json.dump(results, f, indent=2)
total_cost = sum(r['cost'] for r in results)
print(f'\nEnriched {len(results)} companies')
print(f'Total cost: ${total_cost:.3f}')
print(f'Apollo equivalent: ~$50-100/month for similar data')
return results
results = batch_enrich(['Vercel', 'Supabase', 'Railway'])
for r in results:
stack = ', '.join(t for techs in r.get('tech_stack', {}).values() for t in techs)
print(f" {r['company']}: {r.get('description', '')[:50]}")
print(f" Stack: {stack[:60]}")Ejemplo en Python
import os, requests, time
SCAVIO_KEY = os.environ['SCAVIO_API_KEY']
H = {'x-api-key': SCAVIO_KEY, 'Content-Type': 'application/json'}
def enrich(company):
# Company info
resp = requests.post('https://api.scavio.dev/api/v1/search', headers=H,
json={'query': f'{company} company', 'country_code': 'us', 'num_results': 3})
kg = resp.json().get('knowledge_graph', {})
time.sleep(0.3)
# Tech stack from jobs
resp2 = requests.post('https://api.scavio.dev/api/v1/search', headers=H,
json={'query': f'{company} hiring engineer', 'country_code': 'us', 'num_results': 3})
text = ' '.join(r.get('snippet','') for r in resp2.json().get('organic_results', [])).lower()
techs = [t for t in ['python','react','typescript','aws','docker'] if t in text]
print(f"{company}: {kg.get('description','N/A')[:60]}")
print(f" Tech: {', '.join(techs) or 'N/A'}")
for c in ['Vercel', 'Supabase']:
enrich(c)
time.sleep(0.3)Ejemplo en JavaScript
const SCAVIO_KEY = process.env.SCAVIO_API_KEY;
async function enrich(company) {
const resp = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST',
headers: { 'x-api-key': SCAVIO_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({ query: `${company} company`, country_code: 'us', num_results: 3 })
});
const kg = (await resp.json()).knowledge_graph || {};
const resp2 = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST',
headers: { 'x-api-key': SCAVIO_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({ query: `${company} hiring engineer`, country_code: 'us', num_results: 3 })
});
const text = ((await resp2.json()).organic_results || []).map(r => r.snippet || '').join(' ').toLowerCase();
const techs = ['python','react','typescript','aws','docker'].filter(t => text.includes(t));
console.log(`${company}: ${(kg.description || 'N/A').slice(0, 60)}`);
console.log(` Tech: ${techs.join(', ') || 'N/A'}`);
}
(async () => { for (const c of ['Vercel', 'Supabase']) await enrich(c); })();Salida esperada
Enriching: Vercel...
Enriching: Supabase...
Enriching: Railway...
Enriched 3 companies
Total cost: $0.060
Apollo equivalent: ~$50-100/month for similar data
Vercel: Cloud platform for frontend frameworks and serverle
Stack: typescript, react, next.js, aws
Supabase: Open source Firebase alternative with PostgreSQL
Stack: typescript, postgresql, docker
Railway: Cloud platform for deploying applications
Stack: typescript, docker, kubernetesTutoriales relacionados
- Cómo crear una canalización de clientes potenciales basada en la intención con datos de búsqueda
- Cómo encontrar clientes de agencias de automatización con datos de búsqueda
- Cómo enriquecer clientes potenciales con datos de búsqueda de Google para correo electrónico frío
- Cómo extraer datos del gráfico de conocimiento de Google a través de API