Claude · Automation

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.

QQuentin Megevand
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.

Claude AI Lab

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 →
29 000
stars GitHub, licence MIT
2.1.6
version stable testée
3.12
version de Python minimum
0 €
de licence, tu paies juste les tokens
Ce qu'il te faut
1
Python 3.12 ou plus. La bibliothèque refuse de s'installer en dessous.
2
Une clé API pour le modèle qui lit les pages. Une clé OpenAI suffit, et une page coûte une fraction de centime. Ollama en local si tu veux zéro coût variable.
3
Claude Code installé. C'est lui qui recevra tes demandes en français.
4
Dix minutes. L'install prend le plus clair du temps.
1

Installer le moteur

🔗 github.com/ScrapeGraphAI/Scrapegraph-ai

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"
Détail qui compte

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.

2

Créer le skill Claude Code

📄 ~/.claude/skills/scraper/SKILL.md

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.

Pas besoin de redémarrer

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.

3

Le script qui extrait

🐍 ~/scraper-env/scrape.py

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.

Pourquoi les champs sont optionnels

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.

4

Parler à ton scraper

⌨️ claude

Le skill en place, tu ne touches plus au Python. Tu ouvres Claude Code dans n'importe quel dossier et tu demandes.

🎯
Fondateurs et emails
« Sors-moi tous les fondateurs de cette page avec leur email »
🏢
Décideurs
« Récupère chaque décideur de cette liste de sociétés dans un CSV »
💼
Offres d'emploi
« Scrape toutes les offres de cette page carrières avec le titre et la ville »
🏠
Annonces
« Prends chaque annonce ici avec le prix, la surface et le quartier »
📍
Fiches locales
« Sors le nom, le téléphone et la note de chaque commerce de cette page de résultats »
👥
Répertoires
« Extrais le nom, le poste et la société de chaque personne listée »

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,
)
Le bon découpage

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.

5

Rendre le fichier utilisable

🧹 avant l'import CRM

Un export brut n'est pas un fichier de prospection. Quatre réflexes le rendent exploitable.

🧹Avant d'importer quoi que ce soit
5
Dédoublonne sur l'email. Deux pages listent souvent la même personne. Demande la fusion des lignes identiques avant l'export, pas après.
6
Garde la source. Ajoute une colonne avec l'URL d'origine. Dans six mois tu voudras savoir d'où vient un contact, et c'est ce qui te permet de rejouer l'extraction.
7
Vérifie cinq lignes à la main. Prends-les au hasard et compare à la page. Un modèle qui invente un email le fait de façon plausible, donc invisible dans un total de deux cents lignes.
8
Fais valider les adresses avant le premier envoi. Un fichier neuf contient toujours des emails morts, et un taux de rebond élevé abîme la réputation de ton domaine pour des mois.

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.

Le test qui tranche

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.

À retenir

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 ?

Et au quotidien, je partage un reel par jour sur Instagram : @quentin_iamarketing