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.

Aucun Trackback

URL de Trackback : http://blog.bjornoya.be/mt-tb.cgi/10

Laisser un commentaire

À propos de cette note

Cette page contient une unique note de manu publiée le 19 septembre 2009 19h37.

OSDCfr 2009 est la note précédente de ce blog.

Donnez-moi vos feuilles ! est la note suivante de ce blog.

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