Scraper tes leads en langage naturel : le skill Claude Code qui remplace ton abonnement scraper
Installe ScrapeGraphAI, ajoute un skill à Claude Code, et demande tes leads en français. Le script exact, le schéma qui fige les colonnes, et la sortie CSV prête pour ton CRM.
5 août 2026 · 9 min de lecture
Pourquoi ce montage
Tu veux quarante prospects avec leur email, leur rôle et leur société. Tu paies un outil au millier de lignes, tu exportes, et trois semaines plus tard le site refait son HTML : ton extraction rend des colonnes vides. Le scraping classique casse parce qu'il dépend de la structure de la page, jamais de son sens.
ScrapeGraphAI inverse la logique. La bibliothèque récupère la page, l'envoie à un modèle, et lui demande ce qu'il faut en sortir. Tu ne décris plus où se trouve la donnée, tu décris la donnée que tu veux. Pas de sélecteur CSS, pas de XPath, et une extraction qui survit à une refonte de template.
Open source sous licence MIT, écrite en Python, 29 000 stars sur GitHub. Branchée sur Claude Code via un skill maison, elle devient une phrase que tu tapes dans ton terminal : « sors-moi tous les fondateurs de cette page avec leur email ».
Ce guide donne la séquence complète, vérifiée sur scrapegraphai 2.1.6 et Claude Code 2.1.222 : le moteur, le skill, le script qu'il exécute, et le détail qui rend le fichier réellement importable dans un CRM.
Le Claude AI Lab, c'est ma communauté Skool où je partage mes systèmes Claude et les modules plus avancés. L'accès est à $67/mois.
Rejoindre le Lab →Installer le moteur
Le piège est sur la première ligne. macOS livre encore un python3 en 3.9, et la bibliothèque exige 3.12 minimum. Le venv doit donc être créé avec une version explicite, sinon l'install échoue avant même de télécharger quoi que ce soit.
python3.12 -m venv ~/scraper-env
~/scraper-env/bin/pip install scrapegraphai
~/scraper-env/bin/playwright install chromium
Si python3.12 n'existe pas sur ta machine, brew install python@3.12 sur macOS, ou le paquet équivalent de ta distribution.
La deuxième commande installe une centaine de paquets (LangChain, Playwright, les clients OpenAI et Ollama). La troisième télécharge le navigateur qui chargera les pages, environ 95 Mo. Sans elle, la collecte échoue au moment de rendre la page.
Puis la clé du modèle, dans ton shell et dans ton ~/.zshrc pour la garder d'une session à l'autre :
export OPENAI_API_KEY="ta-cle"
Tout vit dans un venv dédié, jamais dans ton Python système. Le chemin ~/scraper-env/bin/python est celui que le skill appellera : c'est la seule information que Claude Code a besoin de connaître.
Créer le skill Claude Code
Un skill Claude Code est un dossier contenant un fichier SKILL.md. Dans ~/.claude/skills/, il est disponible dans tous tes projets. Dans .claude/skills/ à la racine d'un projet, il ne vit que dans ce projet.
mkdir -p ~/.claude/skills/scraper
Le contenu de ~/.claude/skills/scraper/SKILL.md :
---
name: scraper
description: Extraction web en langage naturel avec ScrapeGraphAI. À utiliser
quand on demande de scraper des leads, des emails, des annonces, des offres
d'emploi, ou n'importe quelle liste depuis une page web.
---
# Scraper
Pour toute demande d'extraction depuis une URL, exécute
`~/scraper-env/bin/python ~/scraper-env/scrape.py "<demande>" "<url>"`.
Le script rend du JSON.
Ensuite :
- affiche le résultat en tableau markdown
- écris un CSV à côté dès qu'il y a plus de dix lignes
- ne réécris jamais une valeur extraite et ne comble jamais un trou
Deux choses comptent dans ce fichier. La description est ce que Claude lit pour décider d'utiliser le skill, donc elle doit contenir les mots que tu emploies vraiment : scraper, leads, emails, liste. Le name est optionnel, il reprend le nom du dossier par défaut.
La dernière ligne des instructions vaut le détour : sans elle, un modèle serviable a tendance à compléter une fiche incomplète avec ce qui lui semble probable. Sur un fichier de prospection, c'est exactement ce que tu ne veux pas.
Le dossier ~/.claude/skills/ est surveillé pendant la session : un skill créé maintenant est actif immédiatement. Le seul cas qui demande un redémarrage, c'est quand ce dossier n'existait pas encore au lancement de Claude Code. Tape /skills pour vérifier qu'il est bien vu.
Le script qui extrait
Le skill décide quand extraire, le script fait le travail. Vingt-cinq lignes suffisent.
import json, os, sys
from typing import List, Optional
from pydantic import BaseModel
from scrapegraphai.graphs import SmartScraperGraph
class Ligne(BaseModel):
nom: str
role: Optional[str] = None
email: Optional[str] = None
societe: Optional[str] = None
lien: Optional[str] = None
class Resultat(BaseModel):
lignes: List[Ligne]
config = {
"llm": {
"api_key": os.environ["OPENAI_API_KEY"],
"model": "openai/gpt-4o-mini",
},
"headless": True,
"verbose": False,
}
demande, url = sys.argv[1], sys.argv[2]
graph = SmartScraperGraph(prompt=demande, source=url, config=config, schema=Resultat)
print(json.dumps(graph.run(), ensure_ascii=False, indent=2))
Pour le tester sans passer par Claude Code :
~/scraper-env/bin/python ~/scraper-env/scrape.py \
"tous les membres de l'équipe avec leur rôle et leur email" \
"https://exemple.com/equipe"
Le paramètre schema est le point qui change tout. Sans lui, le modèle nomme les clés comme il l'entend : email sur une page, mail sur la suivante, contact sur la troisième. Avec lui, la sortie est contrainte au modèle Pydantic, donc les colonnes sont identiques à chaque exécution et deux extractions s'empilent dans le même fichier sans retouche.
Optional[str] = None évite que l'extraction entière plante parce qu'une fiche n'a pas d'email. Tu récupères la ligne avec un trou, ce qui vaut mieux qu'une erreur sur l'ensemble du lot.
Parler à ton scraper
Le skill en place, tu ne touches plus au Python. Tu ouvres Claude Code dans n'importe quel dossier et tu demandes.
Quand tu n'as pas d'URL de départ, la bibliothèque sait chercher elle-même. SearchGraph prend la demande sans source, interroge un moteur de recherche et agrège les premières pages. Le nombre de résultats se règle dans le config, trois par défaut :
from scrapegraphai.graphs import SearchGraph
config["max_results"] = 10
graph = SearchGraph(
prompt="cabinets de recrutement à Lyon avec leur email de contact",
config=config,
schema=Resultat,
)
Une demande égale une liste. « Les fondateurs, et aussi les investisseurs, et le chiffre d'affaires » rend une bouillie. Trois extractions séparées rendent trois fichiers propres.
Rendre le fichier utilisable
Un export brut n'est pas un fichier de prospection. Quatre réflexes le rendent exploitable.
Côté coût, gpt-4o-mini lit une page pour une fraction de centime : un fichier de deux cents lignes construit sur vingt pages reste sous l'euro. Pour supprimer le coût variable, la bibliothèque tourne aussi en local sur Ollama. Tu remplaces le bloc llm par {"model": "ollama/llama3.2", "model_tokens": 8192, "format": "json"} et tu retires la clé API. La contrepartie est la qualité d'extraction sur les pages denses, à tester sur tes propres cibles avant de basculer.
Côté cadre, reste sur des pages publiques, accessibles sans compte. Une page derrière un login sort du périmètre, techniquement comme contractuellement. Et pour la prospection B2B en Europe, une donnée professionnelle collectée publiquement s'utilise à condition d'annoncer d'où elle vient et de traiter les désinscriptions dès la première demande.
Lance la même extraction deux fois à quelques jours d'intervalle. Si les colonnes sont identiques et que seules les lignes bougent, ton montage est fiable et tu peux le mettre en routine.
Le vrai gain
Ce montage ne fait pas de toi un scraper. Il supprime la friction entre « j'ai besoin de cette liste » et « j'ai le fichier ». Trois minutes au lieu d'une demi-journée, et aucun abonnement qui court les mois où tu n'extrais rien.
Le moteur lit le sens de la page, donc l'extraction survit aux refontes. Le schéma fige les colonnes, donc les fichiers s'empilent. Le skill retire le Python de l'équation, donc tu formules en français la liste que tu veux obtenir.
Trois briques, une seule fois à installer : le venv Python 3.12 qui porte la bibliothèque, le script de vingt-cinq lignes qui contraint la sortie, et le fichier SKILL.md qui traduit tes phrases en extraction. Tout le reste, c'est de la formulation.
Tu veux aller plus loin ?
Dans le Lab, je partage mes automatisations Claude et n8n, de l'idée au truc qui tourne tout seul pendant que tu dors.
Une session ou un programme dédié, calibré sur tes outils et tes cas d'usage.
Et au quotidien, je partage un reel par jour sur Instagram : @quentin_iamarketing