Archives septembre 2009

Le collectionneur de liens

| Aucun Commentaire | Aucun Trackback

Parfois, au détour d'une page web, je tombe sur une mine d'informations que je veux récupérer en local. Prenons par exemple ce site répertoriant des diapositives sur un sujet que ne cesse de me passionner : l'information retrieval. Comme vous pouvez le voir, il y a pas mal de ressources à télécharger, et je dois avouer que la perspective de récupérer ces fichiers en cliquant sur tout les liens ne me tente guère. Il existe une extension pour Mozilla Firefox qui permet d'automatiser ce genre d'opérations, il s'agit de DownThemAll!, une extension incontournable … pour les utilisateurs de Mozilla Firefox, mais depuis plusieurs semaine, je dois avouer que Chromium emporte mes faveurs. Que faire ? Et bien, voyons voir ce que Perl peut faire pour nous !

Pour la partie récupération d'une page HTML, Perl met à notre disposition LWP::UserAgent. Sur base de cette page HTML, nous devrons collecter les liens qui s'y trouvent. Un module se consacre justement à cette tâche : HTML::LinkExtractor. Certains des liens pouvant être relatifs, aussi nous devrons traiter le HTML avant de collecter le lien. Ici aussi, un module se charge de transformer tous les liens relatifs en liens absolus, il s'agit de HTML::ResolveLink.

A partir de ces outils, nous allons donc pouvoir réfléchir à la manière dont nous voudrions utiliser l'outil. En ce qui me concerne, j'aimerais pouvoir récupérer les liens provenant d'une page précise, et ces liens, je les sélectionnerai avec une expression rationnelle, par exemple : \.pdf$ pour sélectionner tous les liens se terminant par .pdf. L'interface de mon outil se fera en ligne de commande (comme d'habitude). Un appel se faisant de la manière suivante : links_gatherer.pl -u http://nlp.stanford.edu/IR-book/newslides.html -r '\.pdf$', ce qui m'affichera la liste des fichiers satisfaisant mon expression rationnelle. Si je redirige la sortie de ce programme vers un fichier, je peux ensuite appeler wget à la rescousse pour télécharger ces fichiers (wget -i mesliens.txt). Evidemment, je pourrais modifier mon script pour qu'il s'occupe également du téléchargement, mais j'essaye de rester fidèle à la philosophie Unix de l'outil spécialisé dans une et une seule tâche, qu'il essaye de faire du mieux possible.

Voici le script final :

#!/usr/bin/env perl

use strict;
use warnings;

use HTML::LinkExtractor;
use LWP::UserAgent;
use Getopt::Long;
use Data::Dump;
use HTML::ResolveLink;

use feature 'say';

my $config = {
    regexp => '\.(rar|zip|pdf|ppt|odt)$',
};

my $ua = LWP::UserAgent->new();
$ua->agent( 'Mozilla/5.0' );

GetOptions($config, 'url=s', 'regexp=s');

if (exists $config->{url}) {
    my $response = $ua->get( $config->{url} );
    my $resolver = HTML::ResolveLink->new(
        base => $config->{url},
    );
    
    if ($response->is_success) {
        my $parser = HTML::LinkExtractor->new();
        $parser->parse(\$resolver->resolve($response->decoded_content));
        
        my $re = qr/$config->{regexp}/isx;        
        foreach my $link ( @{$parser->links} ) {
            if (exists $link->{href}) {
                say $link->{href} if $link->{href} =~ /$re/;
            }
        }
    } else {
        die "HTML error: ", $response->status_line, $/;
    }
} else {
    die "Usage: $0 --url http://www.webpage.com --regexp '\.pdf$'\n";
}

Bon, évidemment, mon outil est loin d'égaler tout ce que DownThemAll! est capable de faire, mais mon usage habituel de cette extension est satisfait par le script ci-dessus.

OSDCfr 2009

| Aucun Commentaire | Aucun Trackback

Ces deux et trois octobre 2009 se déroulera l'Open Source Developers Conference / France. Cela se passera au Carrefour numérique de la Cité des Sciences, à Paris.

On y parlera de Perl, de Python et de Ruby, entre autres. Bref, une excellente occasion de socialiser un peu !

À propos de cette archive

Cette page est une archive des notes de septembre 2009 listées de la plus récente à la plus ancienne.

août 2009 est l'archive précédente.

octobre 2009 est l'archive suivante.

Retrouvez le contenu récent sur l'index principal ou allez dans les archives pour retrouver tout le contenu.

Pages

Powered by Movable Type 4.261