Parfois il est indispensable de récupérer des informations mises à jour régulièrement sur un site web qui n'expose aucune API au public, ou tout simplement de parcourir toutes les pages d'un site en particulier à la manière d'un robot de moteur de recherche afin de les indexer.

Disclaimer : Attention la majorité des informations publiés sur les sites internet restent la propriété de ces sites et n'ont pas vocation à être récupérées par un tiers sans autorisation.

Si vous avez tout de même besoin de récupérer de telles informations, vous allez devoir récupérer le code source des pages en question (crawler), puis chercher les données dont vous avez besoin (parser) dans cette masse d'information.

Nous allons voir comment faire tout cela en NodeJS aujourd'hui, avec un code minimal que vous pourrez réutiliser et détourner à votre guise.

La méthode

Pour récupérer notre page web et les données qui nous intéressent, nous allons utiliser deux outils différents : Puppeteer et CheeriosJS. Si vous ne connaissez pas ces deux librairies, pas de panique, je vous explique tout.

Puppeteer

Puppeteer est une librairie NodeJS qui met à disposition une API pour automatiser des actions sur une (ou plusieurs) instance Chrome/Chromium. Autrement dit, grâce à cette librairie vous allez pouvoir faire toutes les actions que vous feriez avec un navigateur classique, mais que vous allez contrôler de manière programmatique.

Puppeteer intège de nombreuses fonctionnalités par défaut en plus du chargement des pages comme la prise de screenshots, la génération en pdf à partir d'une page web, etc...

Par défaut, puppeteer est lancé en mode "headless", c'est à dire qu'il n'affiche aucune fenêtre ni aucun rendu graphique.

puppeteer/puppeteer
Headless Chrome Node.js API. Contribute to puppeteer/puppeteer development by creating an account on GitHub.

CheerioJS

Cheerio est simplement une implémentation côté serveur de la célèbre librairie jQuery. En lui passant un code source html ainsi qu'une query, Cheerio va être capable de nous retourner les informations demandée de manière simple et très rapide !

Vous ne pensiez pas réutiliser jQuery un jour avouez ?
cheeriojs/cheerio
Fast, flexible, and lean implementation of core jQuery designed specifically for the server. - cheeriojs/cheerio

Le code

Voici un code minimal pour faire fonctionner ces deux librairies ensembles. En exécutant ce programme, Puppeteer va charger la page principale de mon blog, puis passer le code source à Cheerio afin que ce dernier puisse parser toutes les liens présents sur la page.

Etant donné que le code est simple et commenté à presque chaque ligne, je ne vais pas le détailler plus qu'il ne l'est déjà !

const puppeteer = require('puppeteer'),
    $ = require('cheerio');

(async function(){
	
    //Chrome instance launching, do not launch an instance for each page
    let browser = await puppeteer.launch();
    //Create new blank page in browser
    let page = await browser.newPage();
    //Open the desired url
    await page.goto("https://blog.nicolas.brondin-bernard.com/");
    //Once page loaded, get the source code
    let html = await page.content();
    //Use cheerio to parse every link attribute
    let links = $("a", html);
    links.each(function(i,link){
        console.log($(link).attr("href"));
    })
    //Don't forget to close the browser instance
    await browser.close(); 

})();

Vous devriez voir apparaitre la liste des liens présents sur l'accueil de mon blog après quelques secondes directement dans votre terminal.

Comme vous pouvez le voir, le code est très court et facile à comprendre. Puppeteer est un outil très puissant, n'hésitez pas à aller voir la documentation pour découvrir tout ce qu'il est possible de faire avec !

Et pour aller plus loin, je vous invite à lire mon article intitulé "5 techniques avancées pour créer un crawler web efficace".

J'espère que cet article vous aura plus, à bientôt sur le blog !

À propos de l'auteur

Hello, je suis Nicolas Brondin-Bernard, ingénieur web indépendant depuis 2015 passionné par le partage de d'expériences et de connaissances.

Aujourd'hui je suis aussi coach pour développeurs web juniors, tu peux me contacter sur nicolas@brondin.com, sur mon site ou devenir membre de ma newsletter pour ne jamais louper le meilleur article de la semaine et être tenu au courant de mes projets !


Photo by Vidar Nordli-Mathisen on Unsplash