Récupérer aisément du contenu web avec Perl

Démonstration de la puissance combinée des modules WWW::Mechanize et HTML::TreeBuilder avec l’insertion automatique du nuage de sujets sur la page d’accueil de l’opac Koha.

Je rédige ce billet suite à ma récente découverte de deux modules Perl qui, une fois combinés, s’avèrent étonnamment utiles pour récupérer la plupart des contenus disponibles sur le World Wide Web. WWW::Mechanize (ou Mech pour faire court) est un module Perl utilisé pour automatiser l’interaction avec les sites Web. C’est un module très complet qui supporte, entre autres, les connexions SSL et l’authentification HTTP. HTML::TreeBuilder est quant à lui un parser HTML. Il permet d’extraire facilement un contenu précis depuis une page HTML.

Ces modules sont très complets et les possibilités qu’ils offrent trop nombreuses pour que nous les décrivions dans cet article. C’est pourquoi nous allons en faire la démonstration avec un exemple simple : réaliser un script qui pourra automatiquement remplir la préférence système OpacNavRight avec le nuage de tag.

Prérequis. Ce script devant modifier une préférence système Koha, il sera évidemment mis en place sur le serveur de ce dernier. Les modules WWW::Mechanize (paquet Debian libwww-mechanize-perl) et HTML::TreeBuilder (paquet Debian libhtml-tree-perl) devront également être actifs.

Techniquement. Pour notre exemple, notre script (nommé getopactagssubject.pl) sera placé dans le répertoire ~. Étant donné qu’il est très court et bien commenté, nous vous laissons le soin de l’étudier :

#! /usr/bin/perl
use Modern::Perl;
use C4::Context;# requis pour l'implémentation de Koha
use WWW::Mechanize;# requis pour utiliser WWW::Mechanize
use HTML::TreeBuilder;# requis pour utiliser HTML::TreeBuilder
# on ajoute l'url à parser dans la variable $uri
my $uri='http://opac-koha.com/cgi-bin/koha/opac-tags_subject.pl';
# on ajoute le nombre de sujets à afficher dans la variable $num
my $num=40;
# la variable $content contiendra le résultat à afficher
my $content="";
# nous créons un nouvel objet WWW::Mechanize, nommé $mech
my $mech = WWW::Mechanize->new();
# nous demandons à $mech de récupérer la page html $uri dans la variable $response
my $response = $mech->get( $uri );
# Si nous avons une réponse, nous rappelons l'url de la même manière que si nous avions défini de "Montrer jusqu'à 40 sujets"
if($response->is_success()) {
# Il y a deux champs "input text" sur notre page : celui permettant de faire une recherche catalogue
#
et celui permettant de définir le nombre de sujets à afficher et qui
est identifiable par son attribut name ayant pour valeur "number"

my %fields=("number"=>$num);
$response = $mech->submit_form(
with_fields => \%fields,
);
if($response->is_success()) {
# notre réponse contient maintenant toute la page, nous ne voulons que les sujets
# c'est pour cela que nous avons besoin de HTML::TreeBuilder. Nous créons donc son objet
my $tree = HTML::TreeBuilder->new_from_content( $mech->content );
# les sujets sont dans la balise div ayant l'id : "subjectcloud"
my $divsubjects = $tree->look_down( _tag => 'div', id => qr/subjectcloud/ );
# dans cette div, chaque sujet est une balise "a", on les met dans un array @subjects
my @subjects = $divsubjects->look_down( _tag => 'a' );
# enfin, nous ajoutons chaque sujet, au format html, à notre résultat
foreach my $subject(@subjects) {
$content.=$subject->as_HTML." ";
}
}
}
# il ne reste qu'à ajouter $content dans OpacNavRight
if ($content) {
# il ne faut pas oublier d'échapper les quotes
$content=~s/"/\\"/g;
my $dbh = C4::Context->dbh;
C4::Context->disable_syspref_cache() if ( defined( C4::Context->disable_syspref_cache() ) );
$dbh->do('UPDATE systempreferences SET value="'.$content.'" WHERE variable="OpacNavRight"');
}

Enfin il suffit, dans un terminal, de charger les variables d’environnement KOHA_CONF et PERL5LIB avant d’appeler notre script :
export KOHA_CONF=/home/koha/etc/koha-conf.xml;export PERL5LIB=/home/koha/src; perl ~/getopactagssubject.pl

Enfin vous pourrez mettre cette commande en tâche cron pour automatiser son exécution, par exemple chaque nuit.

Auteur : Stéphane Delaune

Share

A propos Stéphane Delaune

Après avoir cumulé pendant quatre années les postes de vendeur et commercial en Bretagne, il quitte sa région pour devenir rédacteur en chef pour un groupe de presse informatique à Marseille en 2004. Il collabore alors à diverses revues partisanes du logiciel libre comme Freelog ou Planète Linux jusqu’en 2007. Il intègre en 2008 une formation de développeur informatique et développe alors son premier logiciel de gestion budgétaire en C#. Après diverses expériences en tant que développeur Web, il rejoint en 2010 BibLibre où il est en charge des migrations de données.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *