• Share on Google+

Au cours de mes nombreux projets, j’ai été confronté à beaucoup de problématiques de crawl / traitement de données. Du crawl de page web à l’exploitation de csv / xml, j’ai eu l’occasion d’essayer de nombreuses technologies permettant d’acquérir une base de donnée complète et exploitable.

Aujourd’hui, le web en est à l’ère du big data. Des masses énormes de données sont disponibles, provenant de différentes sources, et donc dans différents formats. Si certaines données sont structurées, et donc facilement utilisables, d’autres le sont beaucoup moins. Voici un petit tour d’horizon de mes technologies préférées pour le crawl de données / web scraping / data-mining, dans différents formats.

Chacune des ces techniques a la même finalité : transformer des données non structurées en une base de donnée exploitable. À vous de sélectionner le SGBD le plus approprié (pour moi MySQL ou MongoDB), de créer la structure de votre base, et d’y enregistrer les informations crawlées.

Ma sélection d’outils

Pour le web-scrapping, mes choix s’orientent souvent vers NodeJS. Cette techno est particulièrement adaptée grâce à ses performances, à sa nature asynchrone, à sa facilité et à ses nombreux paquets NPM disponibles.

Kimono, transformer des sites en APIs

Parfois, on a besoin de récupérer un flux de données provenant d’un site tiers. Dans ce cas, un service génial va vous changer la vie : kimono. Pour le moment totalement gratuit, ce service vous permet de définir un schéma de crawl pour les pages web, et d’en faire une API exploitable. Kimono est donc très utile pour rendre des données non-structurées en un fichier JSON facilement exploitable. Ce service dispose de beaucoup d’options, et s’adapte donc à de nombreux besoins. Il est assez facile de gérer un grand nombre d’APIs.

Actuellement, j’utilise Kimono pour crawler des offres d’emploi, dans le cadre de mon projet Dooock. J’ai défini plus de 60 APIs, qui donnent un flux d’environ 800 annonces par jour. Une tâche CRON consulte chaque jour les différents endpoints d’API et les ajoute en base.

En gros, Kimono est super intéressant parce qu’il est :

  • Très facile à mettre en place
  • Totalement gratuit (pour le moment)
  • Très flexible, grâce à ses nombreuses options, comme la périodicité des crawls

Liens / ressources

  • https://www.kimonolabs.com/
  • http://blog.kimonolabs.com/ (des articles super intéressants)

Cheerio, le web scraping en NodeJS

Cheerio est un paquet NPM qui vous permet de travailler sur des pages web en utilisant la syntaxe jQuery. Vous pouvez donc télécharger des pages web avec request, et les exploiter en utilisant des sélecteurs sur le DOM à la jQuery.


var request = require("request"), cheerio = require("cheerio"), url = "monurl'; request(url, function (error, response, body) { if (!error) { var $ = cheerio.load(body), data = $(".selector").html(); console.log(data); } else { console.log("Erreur : " + error); } });

Liens / ressources

  • https://github.com/cheeriojs/cheerio
  • https://www.npmjs.com/package/cheerio
  • http://www.smashingmagazine.com/2015/04/08/web-scraping-with-nodejs/
  • http://code.tutsplus.com/tutorials/screen-scraping-with-nodejs–net-25560

PhantomJS, le navigateur headless en NodeJS

PhantomJS est un navigateur headless utilisant webkit et scriptable en JS. En gros, c’est un navigateur web que vous controllez en JS, depuis un script NodeJS. Il permet de reproduire des comportement utilisateurs assez difficiles à reproduire via l’URL, par exemple.

Je l’utilise actuellement pour crawler automatique des informations sur les sociétés françaises. Mon script me permet de :

  • Me rendre sur societe.com,
  • Effectuer une recherche via le champs de recherche dans le header,
  • Cliquer sur le premier lien,
  • Récupérer et stocker les informations sur la société, comme le capital, le nombre de salariés, le numéro de SIREN ou le status juridique.

Tout ça de façon automatisée. J’utilise PhantomJS pour crawler des pages web, mais ses utilités principales sont toutes autres. Il permet par exemple d’effectuer des tests fonctionnels, de faire des captures d’écran avec différentes résolutions, ou de faire des audits de performances automatiques.

Liens / ressources

  • http://phantomjs.org/
  • https://github.com/ariya/phantomjs
  • http://nrabinowitz.github.io/pjscrape/

NodeJS + csv-parse

De nombreux sets de données sont disponibles en format .csv. Par exemple, toutes les données locales de l’INSEE sont distribuées dans ce format. Avec csv-parse, il est facile d’extraire des données de ces fichiers csv.

Toujours pour mon projet Dooock, j’ai eu l’occasion de mettre en place un outil permettant d’automatiser la phase d’import des fichiers CSV dans une base de donnée (MySQL ou MongoDB). L’intérêt d’utiliser NodeJS et csv-parse est que vous pouvez traiter chaque ligne indépendemment. Vous pouvez par exemple utiliser un module NPM permettant de géocoder chacune des lignes, afin de géolocaliser vos indicateurs.

Voici un exemple d’utilisation de csv-parse, avec une fonction récursive de traitement de chaque ligne, handleLine().


var _DATA, _I=0; fs.readFile('data.csv', 'utf8', function (err,data) { if(err){ console.log("Can't open file"); return console.log(err); } csvparse(data, {delimiter : ";"}, function(err, data){ _DATA = data; save_handleLine(_I,function(){ console.log(_I+" entries saved"); }); }); });

Liens / ressources

  • http://csv.adaltas.com/parse/
  • http://www.insee.fr/fr/bases-de-donnees/default.asp?page=statistiques-locales.htm (les données locales de l’INSEE)

Soyez inventif !

Comme vous l’avez surement vu, il y a de nombreuses manière d’arriver à votre fin en terme de web scrapping. Certaines methodes sont parfois mieux adaptées, mais de manière générale, concevoir sois-même ses outils à base de modules déjà existants semble être la meilleure solution.

Quelques exemples de projets

  • http://www.dooock.com, crawl et géolocalisation de plus de 2 millions d’indicateurs de l’INSEE
  • http://www.disneyti.me, récupération de tous les temps d’attente de Disneyland Paris depuis 8 ans
  • http://www.ultimate75th.com, crawl de l’API Marvel

Le web est plein de données en tous genres, ça serait dommage de ne pas les exploiter !

Si vous voulez plus d’informations, ou que vous recherchez un service de scrapping, n’hésitez pas à me contact à contact@tristanfarneau.com.