Twitter RSS

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 ($@);
 
# 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 ($@);
 
        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.

Popularity: 7% [?]

Comentarii pentru “Exemplu de crawler in Perl”

  • Meteo Moldova spune:

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

  • Sergiu Tot spune:

    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.

  • Slash spune:

    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! ;)

  • Sergiu Tot spune:

    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 :D

  • Ohana spune:

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

  • Sergiu Tot spune:

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

Ai intrebari?

* Te rog sa postezi pe NetHelp orice intrebare care nu are legatura cu articolul.

Retele sociale
Reclamã
Sharing makes you cool!
Categorii
Apache
Articole si tutoriale legate de serverul web Apache.
/articole-tutoriale-apache/

cPanel
Articole si tutoriale legate de utilizarea si administrarea sistemului de gestiune a serverelor de hosting, cPanel.
/articole-tutoriale-cpanel-whm/

DNS
Vezi toate articolele din categoria DNS
/dns-bind-domain-name-services/

Linux
Articole si tutoriale legate de Linux, sisteme BSD sau alte sisteme de operare din familia UNIX.
/articole-tutoriale-linux/

Mail
Vezi toate articolele din categoria Mail
/mail/

MySQL
Articole si tutoriale despre serverul de baze de date MySQL.
/articole-tutoriale-optimizare-mysql/

Perl
Vezi toate articolele din categoria Perl
/perl-practical-extraction-and-report-language/

PHP
Vezi toate articolele din categoria PHP
/php-language-hypertext-preprocessor/

Retele
Tutoriale despre retele de calculatoare, configurarea interfetelor de retea si rutarea IP-urilor.
/retele-networking/

Virtualizare
Articole si tutoriale despre virtualizare si sistemel virtuale create cu Xen sau OpenVZ.
/virtualizare-xen-openvz/

Web hosting
Articole despre serviciile de gazduire web, dedicate sau in regim shared.
/web-hosting/

Webmin / Virtualmin
Articole si tutoriale legate de sistemul de gestiune gratuit Webmin sau modulul Virtualmin.
/webmin-virtualmin/





Newsletter
LAMP Recomandã
NetHelp
SRV.ro
cpadmin.ro
ABCDomenii