Imaginez vous réveiller chaque matin pour trouver une base de données pleine d’articles d’actualité du jour, déjà nettoyée, structurée et prête pour l’analyse. Pas de navigation manuelle, pas de copier-coller, pas de casse-tête de mise en forme. Juste des données fraîches qui vous attendent.
C’est exactement ce que nous avons construit : un extracteur d’actualités universel qui fonctionne sur pratiquement n’importe quel site d’actualités, comprend les dates en langage naturel dans n’importe quel format, découvre automatiquement les liens de pagination, s’arrête lorsqu’il atteint les articles d’hier, et stocke tout proprement dans une base de données SQLite locale.
L’idée clé est d’utiliser l’IA non pas comme un chatbot mais comme un moteur d’analyse intelligent. Au lieu d’écrire des sélecteurs CSS fragiles qui se cassent à chaque fois qu’un site est redesigné, nous laissons Gemini lire la page comme un humain et extraire ce qui est important.
Aperçu de l’Architecture
Le système se compose de trois composants fonctionnant localement sur votre machine :
Serveur Proxy (port 3001) — Un serveur HTTP Node.js avec deux points d’accès. Le point d’accès /fetch télécharge n’importe quelle URL, supprime les scripts et les styles, préserve les balises HTML structurelles, extrait les liens de pagination du HTML brut avant la troncature, et renvoie un contenu structuré propre. Le point d’accès /ai reçoit le contenu de la page et une invite, les envoie à l’API Gemini avec une nouvelle tentative automatique en cas d’erreurs de limite de taux, et renvoie la réponse du modèle.
Script d’Extraction — Un script Node.js qui orchestre tout. Il fonctionne en deux phases : la Phase 1 collecte tous les liens d’articles à partir des pages de liste en suivant automatiquement la pagination, la Phase 2 visite chaque URL d’article, extrait le contenu complet via Gemini, et enregistre dans la base de données.
Base de Données SQLite — Une base de données locale à fichier unique stockant les articles avec des champs pour l’URL (unique, empêche les doublons), le titre, le contenu, la date, la source, et l’horodatage de création.
[N'importe quel site d'actualités]
↓ Récupération HTTP (en-têtes de type navigateur)
[Serveur Proxy — server.js :3001]
↓ HTML propre + lien de pagination
[API Gemini 2.5 Flash Lite]
↓ JSON structuré
[scrape.js]
↓ INSERT OR IGNORE
[news.db — SQLite]
Pourquoi Gemini et Non un Modèle Local ?
Nous avons testé des modèles locaux (Llama 3.2, Mistral 7B via Ollama) pour cette tâche. Les résultats ont été décevants — les petits modèles fonctionnant sur CPU sont trop lents pour traiter des centaines de pages, ils hallucinent des liens de pagination qui n’existent pas, et ils ont du mal à distinguer le contenu principal des widgets de la barre latérale lorsque la structure de la page est complexe.
Gemini 2.5 Flash Lite résout tous ces problèmes. Il traite une page nettoyée complète en 1 à 2 secondes, identifie correctement les dates des articles dans n’importe quelle langue et format, comprend la structure sémantique HTML, et coûte pratiquement rien — environ 0,55 € pour 200 articles.
Étape 1 : Obtenez Votre Clé API Gemini
Allez sur aistudio.google.com/api-keys et créez une nouvelle clé. Le niveau gratuit offre 20 requêtes par minute, ce qui est suffisant pour le développement. Pour l’extraction en production, ajoutez un moyen de paiement — coûte environ 0,25 € par mois à une utilisation quotidienne typique.
Collez votre clé dans server.js à la ligne 10 :
const GEMINI_KEY = 'votre_clé_ici';
Étape 2 : Le Serveur Proxy (server.js)
Le serveur proxy est le cœur du système. Son travail le plus critique est d’extraire le lien de la page suivante avant de supprimer les attributs HTML — un détail subtil mais important.
Lorsque nous nettoyons le HTML, nous supprimons des attributs comme rel="next" et aria-label pour réduire la taille du contenu pour l’IA. Mais ce sont exactement les attributs qui identifient le lien de pagination. Nous appelons donc extractNextPage() d’abord sur le HTML brut, puis nettoyons tout le reste.
La fonction recherche trois modèles qui couvrent la grande majorité des sites d’actualités :
rel="next"— l’attribut de pagination standard HTML5aria-labelcontenant “next”, “далі”, “вперед”, “следующая”- Éléments avec la classe
is-next— commun dans les frameworks CSS
// server.js
// [INSÉRER LE CODE COMPLET DE server.js ICI]
La fonction cleanHtml() conserve les balises structurelles (<main>, <article>, <section>, <aside>, <nav>, <time datetime>) tout en supprimant tout le reste. Cela donne à Gemini suffisamment de contexte pour distinguer le contenu principal des barres latérales sans traiter des mégaoctets de HTML brut.
La fonction askGemini() lit le temps d’attente réel à partir de la réponse d’erreur de limite de taux de Gemini (retry in 23.9s) et attend exactement ce temps avant de réessayer. Pas de devinettes, pas de délais fixes.
Étape 3 : Installer les Dépendances et Lancer le Serveur
cd votre-dossier-projet
npm install better-sqlite3
node server.js
Vous devriez voir :
Serveur en cours d'exécution à http://localhost:3001
Testez-le en ouvrant cette URL dans votre navigateur :
http://localhost:3001/fetch?url=https://example.com
Vous obtiendrez une réponse JSON avec les champs text, links, et nextPage.
Étape 4 : Découverte Intelligente de la Pagination
L’extracteur n’a jamais de liste codée en dur d’URL de pages. Il commence à partir d’une URL et suit automatiquement le lien “page suivante” sur chaque page.
Différents sites utilisent des modèles de pagination complètement différents :
https://site.com/news/page/2— style WordPresshttps://site.com/news/page-2— séparateur par tiret (TSN.ua comme exemple pour l’article)https://site.com/news?page=2— paramètre de requêtehttps://site.com/news-2.html— style HTML plat
Le proxy gère tous ces cas car il recherche des attributs sémantiques dans le HTML, pas des modèles d’URL. L’extracteur lit simplement pageData.nextPage de la réponse du proxy et le suit aveuglément.
Étape 5 : Filtrage de Date Alimenté par l’IA
C’est là que l’approche brille vraiment par rapport aux extracteurs traditionnels. Les sites d’actualités affichent les dates dans des formats très différents :
<time datetime="2026-04-21T17:30:00+03:00">— standard HTML521 квітня 2026— forme longue ukrainienneСьогодні, 17:30— “Aujourd’hui” en ukrainien- Juste
17:30— heure seulement, impliquant aujourd’hui
Un extracteur traditionnel aurait besoin d’une logique d’analyse personnalisée pour chaque format sur chaque site. Nous disons simplement à Gemini la date d’aujourd’hui et lui demandons de filtrer :
Aujourd'hui, c'est le 2026-04-21.
Extrayez les liens d'articles d'actualité de la zone de contenu PRINCIPALE publiés AUJOURD'HUI uniquement.
Les dates peuvent être dans n'importe quel format : <time datetime>, "21.04.26", "17:30" (heure seulement = aujourd'hui), "сьогодні", etc.
EXCLURE : barres latérales, "читайте також", publicités, navigation, pages de catégorie/tag/auteur.
Définir "stop": true si vous voyez des articles d'HIER ou plus anciens dans le contenu principal.
Retournez UNIQUEMENT un JSON valide :
{"articles":[{"title":"...","url":"https://..."}],"stop":false,"reason":"..."}
Le drapeau stop est le mécanisme clé. Lorsque Gemini voit des articles d’hier dans le contenu principal, il renvoie "stop": true et l’extracteur cesse de suivre la pagination — peu importe le numéro de page sur lequel nous sommes.
Étape 6 : Extraction du Contenu des Articles
La Phase 2 visite chaque URL d’article et extrait le contenu réel. L’invite est délibérément minimale :
Extrayez ce qui suit de cette page d'article d'actualité :
1. "title" — le titre de l'article
2. "date" — date de publication au format AAAA-MM-JJ
3. "content" — texte complet de l'article, propre, sans publicités ni navigation
Retournez UNIQUEMENT un JSON valide sans explication, sans markdown, sans texte avant ou après :
{"title":"...","date":"2026-04-21","content":"..."}
Remarquez qu’il n’y a pas de champ résumé. Il est tentant de générer des résumés lors de l’extraction, mais cela gaspille des jetons et du temps pour quelque chose que vous n’utiliserez peut-être jamais. Stockez le contenu brut maintenant, générez des résumés à la demande lorsque vous en avez réellement besoin pour l’analyse.
Étape 7 : Le Script d’Extraction (scrape.js)
// scrape.js
// [INSÉRER LE CODE COMPLET DE scrape.js ICI]
L’instruction SQL INSERT OR IGNORE combinée avec la contrainte UNIQUE sur la colonne url gère automatiquement toute la déduplication. Exécutez l’extracteur toutes les heures — il passe silencieusement tout article déjà dans la base de données.
Exécution
Vous avez besoin de deux fenêtres de terminal :
Terminal 1 — serveur proxy (à garder en cours d’exécution) :
node server.js
Terminal 2 — extracteur (à exécuter lorsque vous voulez des articles frais) :
node scrape.js
Pour extraire un site d’actualités différent, changez juste une ligne en haut de scrape.js :
const START = 'https://votre-site-d-actualités.com/news';
Résultats
Exécution contre TSN.ua (grand site d’actualités ukrainien, comme exemple pour l’article) le 21 avril 2026 :
- Phase 1 : 198 liens d’articles collectés à partir de 20 pages — arrêt automatique lorsque les articles d’hier sont apparus
- Phase 2 : 198 articles récupérés, nettoyés et stockés
- Temps total : ~11 minutes
- Coût total : 0,55 € en crédits API Gemini
- Taille de la base de données : ~8MB
L’extracteur a correctement ignoré les widgets de la barre latérale avec d’anciens articles populaires, horoscopes, prévisions météorologiques, et pages de taux de change. Seuls les articles d’actualité réels publiés ce jour-là ont été intégrés dans la base de données.
Visualisation de la Base de Données
Téléchargez DB Browser for SQLite — gratuit, open source. Ouvrez news.db et vous verrez tous les articles dans une vue de type tableur. Vous pouvez filtrer par date, rechercher du contenu, exporter vers CSV.
Et Après
Publication automatique sur WordPress — un script qui lit à partir de la base de données et publie sur WordPress via l’API REST. Combiné avec Claude réécrivant le contenu en espagnol, allemand ou polonais, cela devient un site d’actualités multilingue entièrement automatisé.
Sources multiples — le même serveur et extracteur fonctionnent sur n’importe quel site d’actualités. BBC, Reuters, TechCrunch, sites régionaux dans n’importe quelle langue — une seule base de code les gère tous.
Exécution planifiée — ajoutez une tâche planifiée Windows ou un cron Linux pour exécuter node scrape.js chaque matin. Réveillez-vous avec une base de données complète des actualités du jour.
Couche d’analyse — un deuxième script lit les articles du jour à partir de SQLite, les envoie à l’API Claude, et génère un briefing matinal : histoires clés, tendances, implications. La base de données devient un flux d’intelligence.
Construit en un jour en utilisant Node.js 23, Gemini 2.5 Flash Lite, et better-sqlite3. La partie la plus difficile a été de découvrir que les liens de pagination disparaissent lorsque vous supprimez les attributs HTML — c’est pourquoi extractNextPage() doit s’exécuter sur le HTML brut avant tout nettoyage.
Télécharger le Code Source
- sources — serveur proxy avec intégration Gemini + extracteur en deux phases avec stockage SQLite