Aperçu
Les répertoires en ligne comme Clutch, G2 et Capterra ont des centaines de pages d'annonces. La navigation manuelle est lente et incomplète. Ce workflow n8n automatise les requêtes de recherche paginées pour extraire toutes les annonces d'une catégorie, déduplique les résultats et construit une liste maîtresse de prospects. Chaque page de résultats de recherche coûte 0,005 $.
Déclencheur
Cron hebdomadaire le lundi à 3h00 UTC ou à la demande pour de nouvelles catégories.
Planification
Hebdomadaire (lundi 3h00 UTC)
Étapes du workflow
Configurer les cibles de répertoire et de catégorie
Définir les répertoires à rechercher et les catégories à extraire. Chaque cible inclut le domaine du répertoire et les mots-clés de catégorie.
Exécuter des requêtes de recherche paginées
Pour chaque paire répertoire-catégorie, exécuter plusieurs requêtes de recherche avec des décalages de page pour capturer toutes les annonces. Continuer jusqu'à ce que les résultats soient vides ou que le nombre maximal de pages soit atteint.
Extraire les données des entreprises à partir des résultats
Analyser les noms d'entreprise, descriptions et URLs des résultats organiques. Extraire des signaux supplémentaires des extraits (notes, nombre d'avis, spécialités).
Dédupliquer par rapport à la liste maîtresse
Comparer les nouveaux résultats à la liste maîtresse existante. Ajouter uniquement les nouvelles entreprises. Marquer les entreprises qui sont apparues lors des exécutions précédentes mais qui sont maintenant absentes.
Exporter vers Google Sheets ou CRM
Ajouter les nouvelles entreprises à la feuille de calcul maîtresse ou créer de nouveaux contacts CRM. Étiqueter avec la source du répertoire, la catégorie et la date d'extraction.
Implémentation Python
import requests, os, json
API_KEY = os.environ["SCAVIO_API_KEY"]
def paginated_directory_search(directory: str, category: str, max_pages: int = 5) -> list:
"""Search a directory with pagination."""
all_results = []
for page in range(max_pages):
resp = requests.post(
"https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY, "Content-Type": "application/json"},
json={"query": f"site:{directory} {category}", "country_code": "us", "start": page * 10},
timeout=15,
)
data = resp.json()
results = data.get("organic_results", [])
if not results:
break
for r in results:
all_results.append({"title": r.get("title", ""), "url": r.get("link", ""), "snippet": r.get("snippet", "")})
# Deduplicate by URL
seen = set()
unique = []
for r in all_results:
if r["url"] not in seen:
seen.add(r["url"])
unique.append(r)
return unique
listings = paginated_directory_search("clutch.co", "seo agencies", max_pages=5)
print(f"Extracted {len(listings)} unique listings from Clutch")Implémentation JavaScript
const H = {'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json'};
async function paginatedSearch(directory, category, maxPages=5) {
const all = [];
for (let page=0; page<maxPages; page++) {
const r = await fetch('https://api.scavio.dev/api/v1/search', {method:'POST', headers:H, body:JSON.stringify({query:'site:'+directory+' '+category, country_code:'us', start:page*10})});
const d = await r.json();
if (!(d.organic_results||[]).length) break;
d.organic_results.forEach(r => all.push({title:r.title, url:r.link, snippet:r.snippet}));
}
const seen = new Set();
return all.filter(r => { if (seen.has(r.url)) return false; seen.add(r.url); return true; });
}
const listings = await paginatedSearch('clutch.co', 'seo agencies', 5);
console.log(listings.length + ' unique listings extracted');Plateformes utilisées
Recherche web avec graphe de connaissances, PAA et aperçus IA