Le contexte

Plusieurs fois chez Press’Innov, nous avons du mettre en place des solutions d’extraction de texte sur une page web. Le web est une gigantesque base de données accessible mais cette base de données est loin d’être structurée et directement exploitable. On est impatient que l’ensemble de l’information disponible soit disponible dans des formats interrogeables (appelons ça le Web 3.0 ou le Web Sémantique ou le Linked Data) mais en attendant, il faut encore souvent avoir recours à des techniques plus rudimentaires pour extraire l’essence de l’information d’une page web.
olive-oil-610366_640

Le bon exemple consiste à réussir à extraire le cœur de page d’un article de presse en ligne. Les besoins sont nombreux, mais on peut prendre pour exemple le fact-checking: Je suis blogger media et je suis curieux de savoir combien de fois par semaine le nom « François Hollande » apparaît sur les sites des grands quotidiens nationaux.

Les outils en place

Il existe sur le marché plusieurs catégories d’outils qui répondent à ce besoin. Tout d’abord des produits purement manuels, ou l’on clique sur les régions de texte à extraire, page après page. D’autres outils s’appuient sur ce mécanisme mais permettent d’automatiser la récurrence: on leur montre où se trouve le texte sur une page, puis on lui demande de répéter la manipulation sur toutes les pages de la rubrique. Cette technique a ses limites, surtout si l’on souhaite analyser le contenu de plusieurs dizaines de sites puisque cela impliquerait de lui apprendre à repérer le texte sur toutes les rubriques de tous ces sites (l’exercice devenant inhumain si l’on envisage que la liste des sites évoluent dans le temps).

Plusieurs projets se sont penchés sur la question pour aboutir à des robots scraper qui apprennent d’eux mêmes. Pour être précis, ils n’apprennent pas, ils devinent où se trouve le texte. Pour se faire, ils s’appuient sur différentes heuristiques, le principe étant de repérer les sections de la page qui contiennent le plus de texte (proportionnellement au reste de la page). Le projet le plus connu (et sans doute le plus performant) est Boilerpipe. Même si le projet n’est plus très actif, il a acquis une certaine notoriété qui en fait une référence pour la discipline. Vous pouvez tester l’outil de manière interactive sur la page de démo.
Toutefois, si vous poussez un peu l’expérience avec Boilerpipe, vous arriverez assez vite à en trouver les failles. Selon la complexité de la maquette de la page web que vous lui demandez d’analyser, Boilerpipe peut finalement se prendre les pieds dans le tapis et finir par vous retourner des extraits de texte issus des commentaires, des blocs pour en savoir plus ou carrément du menu.

Notre idée

Nous avons voulu éprouver une autre méthode. Dans la plupart des contextes d’utilisation que nous rencontrons, les pages sont traitées en lot: on voudra scraper plusieurs pages du même site dans le même lot. Pourquoi ne pas tirer parti de cet avantage pour optimiser la technique de scraping? En effet, Boilerpipe s’appuie sur une unique URL pour extraire du texte. Dans notre cas, nous pourrions utiliser le lot d’URLs à traiter pour comparer les pages web les unes avec les autres. Sur un même site, deux articles différents ont tout en commun (menu, maquette de page, blocs de commentaires, …) sauf le texte. Très bien! Procédons alors par différence (en appliquant un masque) pour extraire le texte d’une page.

scraping par différentiel
scraping par différentiel

L’avantage notable est que cette technique est beaucoup moins sensible à la complexité de la charte graphique du site web qu’elle analyse. Boilerpipe s’appuie sur une analyse statistique (poids du texte de chaque branche html du document) et sur des heuristiques précises (le bloc de commentaires a souvent pour id #comment). Ceci fonctionne très bien lorsque le site en face répond aux standards du web et que ses pages sont structurées sans surprise. Mais en 2015, les sites d’actus ne se contentent plus du classique header-2col-footer, les chartes graphiques sont bien plus riches. Le scraping par différentiel est parfaitement insensible à la forme de la maquette graphique.

Le principal inconvénient de cette technique réside dans le fait que pour extraire le texte d’une page, il nous faut d’abord avoir une page de référence. Dans notre exemple, nous nous appuyons sur un flux RSS pour lister les articles à scraper, il est donc très facile de choisir, parmi les autres articles du flux, un article de référence.
Une autre difficulté, plus sournoise, consiste à gérer les blocs de texte sur la page qui ne sont pas identiques et qui pourtant, ne sont pas spécifiques à la page que l’on analyse. Par exemple, les liens de poursuite de lecture, souvent dans un bloc juste après l’article, ne sont pas les mêmes d’une page à l’autre (recommandation basée sur l’article en cours). Pour traiter ce point, on peut par exemple mettre en place une approche en 2 temps:

  1. boilerpipe, pour détourer au mieux le texte,
  2. Scraping par différentiel pour extraire uniquement le texte.

Let’s do it!

Chez Press’Innov, nous avons travaillé sur un prototype de scraper par différentiel. Ce prototype a été développé en NodeJS, en s’appuyant sur un bon paquet de librairies:

var jsdom = require("jsdom"), // parse les pages web
    diff = require('diff'), // calcule les différences
    bodyParser = require('body-parser'), // interprète une requête http
    express = require('express'), // faut-il présenter express...
    log4js = require('log4js'), // logger, logger, logger !
    xmlescape = require('xml-escape') // 
    program = require('commander'), // help()
    seaport = require('seaport'), // load balancing made easy
    NodeCache = require( "node-cache" ), // optimiser en mettant en cache les urls de référence
    md5 = require('MD5'); // pour calculer les index de cache

et en s’appuyant beaucoup sur des exemples.

Le résultat est à la hauteur de nos espérances, tellement satisfaisant que nous allons maintenant industrialiser le projet et, si le besoin se fait sentir, proposer ce service à nos clients.

 

Découvrez nos préstations en régie ou au forfait

Audit, conseil, AMOA, AMOE, bases de données XML, solutions éditoriales, sites Responsive Web Design, ...

Nous consulter !
Découvrir !

Archives

Étiquettes

Mots clés