Administrare server open source

Platforma de hosting cu software liber, gratuit, open source.

Unul din motivele pentru care Perl este un limbaj preferat in randul administratorilor de sistem este usurinta cu care putem crea diferite aplicatii complexe. O astfel de aplicatie este un crawler pentru siteuri web. Folosind modulul WWW::Mechanize putem crea un crawler simplu, dar care se poate dovedi eficient in majoritatea cazurilor.

Pentru simplitate am preferat un crawler care foloseste un fisier text pentru salvarea linkurilor.

Pentru a pune in functiune cralwerul am creat un script cu patru subrutine:

  • getHostname – pentru preluarea hostului din URL-ul de pornire;
  • save – salveaza un link in fisierul care tine evidenta linkurilor catre paginile parsate;
  • saved – verifica daca linkul citit este deja salvat;
  • getLinks – citeste URL-ul primit ca parametru, parseaza pagina iar apoi in mod recursiv parseaza toate linkurile gasite pe pagina citita.

Codul pentru crawler este urmatorul:

#!/usr/bin/perl
 
use strict;
use warnings;
 
use Getopt::Long;
use WWW::Mechanize;
 
my $tmpFile = "/tmp/crawl.$$";
my $delay   = 1;
my $hostname;
my $start;
 
GetOptions( "start=s" => \$start );
 
$hostname = &getHostname($start) or die("Invalid URL.\n");
 
open( LINKS,   "+>", $tmpFile );
die("Cannot create links file.\n") if ([email protected]);
 
# Start crawling
&getLinks($start);
 
close(LINKS);
# unlink($tmpFile);
 
# Subrutines
# Get the hostname for the given URL
sub getHostname {
        my $url = shift;
        return 0 if ( $url !~ /^http:\/\/([^\/]+)\/?/ );
        return $1;
}
 
# Get links recursively
sub getLinks {
        my $url = shift;
 
        no warnings 'recursion';
 
        my $mech = WWW::Mechanize->new( agent => 'Pinochio 1.33.7' );
        eval { $mech->get($url); };
 
        next if ([email protected]);
 
        my @links = $mech->links();
 
        foreach my $link (@links) {
                my $url = $link->url();
                $url = "http://$hostname" . $link->url() if ( $url =~ /^\// );
 
                # Blacklist
                next if( $url =~ /\.(avi|mp3|mpg|mpeg|swf|png|gif|jpg|jpeg|bmp|wav)/ );
                next if( $url !~ /^http:\/\/$hostname/ );
                next if( &saved( $url ) );
 
                &save( $url );
                &getLinks($url);
        }
 
        sleep($delay);
 
}
 
# Check to see if an insite URL is saved
sub saved {
        my $url = shift;
        chomp $url;
 
        seek( LINKS, 0, 0 );
        while (<links>) {
                chomp;
                return 1 if ( $url eq $_ );
        }
 
        return 0;
}
 
# Adds to LINKS file the URL passed as an argument
sub save {
        my $url = lc shift;
 
        seek( LINKS, 0, 2 );
        return 1 if ( print LINKS "$url\n" );
        return 0;
}
</links>

Pentru a nu supraincarca serverul web putem modifica variabila $delay care pastreaza numarul de secunde dintre doua parsari. Pentru a parsa un intreg site vom lansa in executie scriptul folosind urmatoarea sintaxa:

[root@lamp ~/crawl]# ./crawl.pl --start=http://www.regex.ro

Bineinteles, cu putina imaginatie crawlerul se poate existind adaugandu-i-se foarte multe functionalitati.

Perl

6 Responses so far.

  1. Meteo Moldova says:

    nu prea am inteles, crowler pentru pe internet, gen search engines sau cum?

  2. Sergiu Tot says:

    Da, ceva de genul asta. Si motoarele de cautare folosesc crawlere, dar sunt mai multe situatii in care un crawler poate fi de folos – ex. la crearea unui sitemap.

  3. Slash says:

    Si eu folosesc Perl, sunt foarte multumit de el, insa mi-a luat o perioada da-l inteleg. Insa rabdarea mea, m-a ajutat! Learn Perl! 😉

  4. Sergiu Tot says:

    E diferit de alte limbaje, motiv pentru care e putin derutant. Totusi, odata ce te-ai obisnuit sa programezi in Perl nu prea te mai satisface alt limbaj cand vine vorba de taskuri mici si medii 😀

  5. Ohana says:

    se poate sa faci un tutorial despre cum faci un crawler ce face update la xml map la un interval de o zi?

  6. Sergiu Tot says:

    Ohana, folosind cronuri poti face un crawler rapid pornind de la exemplul de mai sus.