Les fournisseurs de données B2B comme Apollo vous enferment dans des abonnements coûteux avec des données obsolètes. Une couche d'enrichissement basée sur la recherche extrait des données fraîches à chaque fois que vous en avez besoin : descriptions d'entreprise depuis le Knowledge Graph de Google, signaux de stack technique à partir des offres d'emploi, rythme d'embauche et présence sociale. Ce tutoriel construit une couche d'enrichissement modulaire utilisant l'API Scavio à 0,005 $ par recherche. Pas de contrats annuels, pas de bases de données obsolètes.
Prérequis
- Python 3.9+ installé
- bibliothèque requests installée
- Une clé API Scavio provenant de scavio.dev
- Une liste de domaines ou noms d'entreprise à enrichir
Parcours
Étape 1: Construisez l'enrichisseur de profil d'entreprise
Recherchez chaque entreprise sur Google pour extraire les données du Knowledge Graph, la description du site web et les informations de base de l'entreprise.
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}')Étape 2: Ajoutez la détection de stack technique
Recherchez les offres d'emploi de l'entreprise pour détecter leur stack technique. Les exigences des postes révèlent les technologies réellement utilisées par l'entreprise.
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')Étape 3: Ajoutez l'analyse de la présence sociale
Vérifiez la présence de l'entreprise sur Reddit et YouTube. Une présence sociale active indique une entreprise qui interagit avec les développeurs et pourrait être un bon prospect.
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')Étape 4: Construisez le pipeline d'enrichissement complet et exportez
Combinez toutes les sources d'enrichissement en un profil d'entreprise complet. Exportez en JSON pour l'intégration CRM ou en CSV pour une révision manuelle.
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]}")Exemple 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)Exemple 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); })();Sortie attendue
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, kubernetesTutoriels associés
- Comment construire un pipeline de leads basé sur l'intention avec des données de recherche
- Comment trouver des clients pour une agence d'automatisation avec des données de recherche
- Comment enrichir des leads avec les données de recherche Google pour le cold email
- Comment extraire les données du Google Knowledge Graph via l'API