Scraper avec nodejs

scraper-avec-nodejs

Il est temps. Pour 2017, il me semble important de maîtriser un langage de programmation. J’ai essayé plusieurs langages (php ou même ruby) mais mon dévolu se porte aujourd’hui sur le javascript. Plusieurs raisons à cela. Tout d’abord, le javascript peut être utilisé autant en front qu’en back. Ainsi l’apprentissage d’un seul langage peut être profitable partout. Autre point, la communauté js me semble la plus active mais surtout très créative. Enfin, un environnement javascript retient tout particulièrement mon attention par sa puissance : nodejs. Pour vous montrer et démontrer sa puissance, nous allons voir comment coder un scraper avec nodejs.

Introduction

Il serait malvenue de ma part de réaliser ici un réquisitoire pour un langage que je viens à peine de découvrir. J’aurais aussi bien du mal à vous expliquer les tenants et aboutissants de nodejs, mais pour ne pas vous laisser sur votre fin/faim, je vous invite à regarder cette excellente vidéo de Grafikart.

Si vous n’avez jamais écrit du javascript, je vous conseille Sololearn dans un premier temps et Codeacademy par la suite.

Installation

Nodejs a un autre avantage, il est multi-plateforme. Que vous soyez Windows, Mac ou Linux, vous pourrez utiliser nodejs sans problèmes. Pour l’installation, rendez-vous sur nodejs.org et installez le logiciel.

En termes d’éditeur de texte, je vous conseille un IDE qui embarque un terminal. Visual Code Studio fera parfaitement l’affaire, en plus il est gratuit, open-source et tout comme node, multi-plateformes.

Scraper avec nodejs

Je tiens à remercier Gabin Desserprit pour son aide à la rédaction de cet article et à ses nombreuses contributions sur le sujet. En plus, il prend le relais pour le prochain exercice de scraping :)

Enregistrer la page HTML

Le cobaye pour ce test sera le site growthhacking.fr où nous dissertons avec d’autres collègues growth hackers passés maîtres dans l’art de scraper avec nodejs. Pour faire fonctionner ce code, il vous faudra installer axios au préalable. Rien de très compliqué. Placez vous à la racine de votre dossier et exécuter dans votre terminal :

npm install axios
Installation d'Axios

Ce qui est vraiment pratique avec nodejs, c’est l’usage de npm qui vous permet d’installer des paquets et leurs dépendances associées.

Pour les plus curieux, vous pouvez aller faire un tour sur le site de npm

let fs = require('fs');                                         // fs nous sert ici à écrire notre fichier
let axios = require('axios');                                   // axios sert à réaliser une requête http

axios('https://www.growthhacking.fr').then((response) => {      // on demande ici à axios d'aller sur growthhacking.fr, si la réponse est bonne...
    fs.writeFileSync('gh.html', response.data);                 // alors fs enregistre le code html dans le fichier gh.html
}, (error) => {                                                 // si ça marche pas...
    console.log("Error: ", error);                              // merci d'afficher l'erreur dans le terminal :)
});
Enregistrer la page html

Vous pouvez donner le nom que vous voulez à votre fichier. Pour l’exercice je vous propose de l’appeler script.js

Extraction des datas

Normalement, votre code enregistre la page gh.html. La prochaine étape est de parser le fichier et extraire les données.

Nous aurons besoin cette fois-ci de deux autres paquets npm : cheeriojsonframe-cheerio.

npm install cheerio
npm i jsonframe-cheerio --save
Installation de Cheerio & Jsonfrme-cheerio
let fs = require('fs');                                                         // fs nous sert ici à écrire notre fichier
let axios = require('axios');                                                   // axios sert à réaliser une requête http
let cheerio = require('cheerio');                                               // on charge cheerio
let jsonframe = require('jsonframe-cheerio');                                   // et jsonframe-cheerio

axios('https://www.growthhacking.fr').then((response) => {                      // on demande ici à axios d'aller sur growthhacking.fr, si la réponse est bonne...
    fs.writeFileSync('gh.html', response.data);                                 // alors fs enregistre le code html dans le fichier gh.html
    if (response.status === 200) {                                              // si la réponse du serveur est 200 OK
        let $ = cheerio.load(response.data);                                    // on enregistre le contenu html dans une variable $
        jsonframe($);                                                           // cette dernière est placée dans une jsonframe
        var frame = {                                                           // on créé une autre variable frame qui nous permet de construire notre objet
            "post": {
                "selector": "[itemprop=itemListElement]",
                "data": [{
                    "name": "[itemprop=name]",                                  // tous les éléments qui nous intéressent sont décomposés ici
                    "url": {                                                    // pour les retrouver consultez la page gh.html
                        "selector": "[itemprop=url]",                           // et la documentation de jsonframe-cheerio
                        "attr": "content",
                    }
                }]
            }
        };
        var postsList = $('body').scrape(frame);                                // on créé une varibale postsList qui reprend les posts scrapés dans le body
        fs.writeFile('gh.json', JSON.stringify(postsList), function (err) {     // fs.WriteFile nous permet d'enregistrer nos données stockées dans postsList
            if (err) {
                return console.log(err);                                        // y'a un blème ?
            } else {
                console.log("Le fichier est sauvegardé ! #OKLM");               // si tout roule, tu trouveras ce message dans le terminal
            }
        });
    };
});
Scraper avec nodejs

Exécution du script

Votre script semble fonctionner ? Qu’une seule façon de le savoir, l’exécuter !

node script.js
Exécution du script

Si tout fonctionne, vous devriez avoir un message dans votre terminal et votre fichier .json enregistré à la racine de votre dossier.

Le résultat : vous avez réalisé votre premier scraper avec nodejs !

Ce premier script est une première base pour vos prochaines actions. À vous de vous adapter aux prérequis des sites que vous souhaitez aspirer et d’améliorer votre script.

Bonne chasse !

Pour vous inscrire à la newsletter c’est par ici :