Colas Mérand
10/05/2025
web scraping
javascript
automatisation
5 minutes
Dans un monde où les données sont devenues le nouvel or noir, l'accès à ces informations représente un enjeu stratégique pour de nombreuses entreprises. Mais que faire lorsque les données dont vous avez besoin se trouvent sur un site qui ne propose pas d'API ? C'est là qu'intervient le web scraping, une technique d'extraction automatisée qui permet de collecter des informations structurées à partir de pages web.
L'extraction de données sur des sites web statiques est relativement simple. Cependant, avec l'évolution des technologies web, de plus en plus de sites utilisent JavaScript pour charger dynamiquement leur contenu. Ces sites présentent des défis particuliers pour le scraping traditionnel :
Pour illustrer ce propos, prenons l'exemple d'un site de big data qui propose un formulaire de recherche JavaScript permettant d'accéder à des milliers de résultats, chacun contenant un fichier XML à télécharger. Comment automatiser ce processus sans API disponible ?
Pour réaliser un scraping efficace sur des sites JavaScript complexes, plusieurs outils se démarquent :
Ces bibliothèques permettent d'automatiser un navigateur Chrome ou Firefox headless (sans interface graphique). Elles offrent un contrôle total sur le navigateur, ce qui permet :
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
// Configuration pour permettre le téléchargement de fichiers
await page._client.send('Page.setDownloadBehavior', {
behavior: 'allow',
downloadPath: './downloads'
});
await page.goto('https://site-exemple.com/formulaire');
// Remplir le formulaire
await page.type('#search-input', 'terme de recherche');
await page.click('#submit-button');
// Attendre les résultats
await page.waitForSelector('.results-container');
// Extraire les liens vers les fichiers XML
const xmlLinks = await page.evaluate(() => {
return Array.from(document.querySelectorAll('.xml-download-link')).map(a => a.href);
});
// Télécharger chaque fichier XML
for (const link of xmlLinks) {
await page.goto(link);
// Le téléchargement se fait automatiquement grâce à la configuration précédente
}
await browser.close();
})();
Pour des sites moins complexes, la combinaison de Cheerio (pour parser le HTML) et Axios (pour les requêtes HTTP) peut être suffisante :
const axios = require('axios');
const cheerio = require('cheerio');
async function scrapeData() {
const { data } = await axios.get('https://site-exemple.com');
const $ = cheerio.load(data);
// Extraction des données
$('.item').each((index, element) => {
const title = $(element).find('.title').text();
console.log(title);
});
}
scrapeData();
La plupart des sites imposent des limites au nombre de requêtes que vous pouvez effectuer dans un laps de temps donné. Pour éviter d'être bloqué :
// Fonction pour introduire un délai
const delay = ms => new Promise(resolve => setTimeout(resolve, ms));
// Utilisation dans une boucle de scraping
for (const url of urlsToScrape) {
await scrapePage(url);
// Attendre entre 2 et 5 secondes entre chaque requête
await delay(2000 + Math.random() * 3000);
}
Certains sites nécessitent une authentification. Puppeteer permet de gérer facilement les cookies :
// Se connecter à un site
await page.goto('https://site-exemple.com/login');
await page.type('#username', 'votre_identifiant');
await page.type('#password', 'votre_mot_de_passe');
await page.click('#login-button');
// Sauvegarder les cookies pour les utiliser ultérieurement
const cookies = await page.cookies();
fs.writeFileSync('./cookies.json', JSON.stringify(cookies));
Une fois les fichiers XML téléchargés, vous pouvez les traiter pour en extraire les informations pertinentes :
const fs = require('fs');
const xml2js = require('xml2js');
const parser = new xml2js.Parser();
// Lire et parser un fichier XML
fs.readFile('./downloads/file.xml', (err, data) => {
parser.parseString(data, (err, result) => {
// Traiter les données structurées
console.log(result.root.element[0]);
// Stocker dans une base de données ou un fichier
storeInDatabase(result);
});
});
Une fois les données extraites, il est crucial de les structurer correctement. Pour des projets de taille modeste, Google Sheets peut être une solution efficace :
const { GoogleSpreadsheet } = require('google-spreadsheet');
async function storeInGoogleSheets(data) {
// Initialiser le document
const doc = new GoogleSpreadsheet('YOUR_SPREADSHEET_ID');
await doc.useServiceAccountAuth(require('./credentials.json'));
await doc.loadInfo();
// Sélectionner une feuille
const sheet = doc.sheetsByIndex[0];
// Ajouter des lignes
await sheet.addRows(data);
}
Chez Platane, nous avons eu l'occasion de mettre en œuvre ces techniques pour plusieurs clients aux besoins variés. Par exemple, pour le projet Epictory, nous avons développé un système d'extraction de données à partir de l'API Strava pour générer des posters personnalisés basés sur les parcours sportifs des utilisateurs.
De même, pour le projet Dealt, nous avons conçu une marketplace de jobbing qui agrège des données provenant de multiples sources, certaines ne disposant pas d'API officielle. Notre stack technique (React, TypeScript, Node.js) nous a permis de créer des solutions robustes et évolutives pour ces défis d'extraction et de traitement de données.
Plus récemment, pour notre propre plateforme de gestion de contenu, nous avons développé un système d'automatisation par IA qui collecte, analyse et structure des données provenant de diverses sources web, démontrant ainsi notre expertise dans ce domaine en constante évolution.
Le web scraping est un outil puissant, mais qui doit être utilisé de manière responsable :
// Définir un User-Agent approprié
await page.setUserAgent('Mozilla/5.0 (compatible; MyScraperBot/1.0; +https://monsite.com/bot)');
L'extraction de données à partir de sites JavaScript complexes nécessite une approche sur mesure, adaptée aux spécificités de chaque site et aux besoins précis du projet. Chez Platane, nous combinons notre expertise technique avec une méthodologie éprouvée pour concevoir des solutions d'extraction de données efficaces, éthiques et évolutives.
Que vous ayez besoin d'extraire des milliers de fichiers XML d'un site de big data, de collecter des informations structurées pour alimenter vos analyses, ou de synchroniser des données entre différentes plateformes, notre équipe possède l'expérience et les compétences nécessaires pour relever ces défis.
Vous avez un projet d'extraction de données ou d'automatisation web ? N'hésitez pas à nous contacter via notre formulaire de contact pour échanger sur vos besoins spécifiques. Chez Platane, nous transformons les défis techniques en opportunités d'innovation, en alliant technologies de pointe et créativité au service de vos objectifs.