Můžete mít mnoho důvodů. Můj důvod například byl vytvořit simulátor návštěvníků webu, který by vytvořil pro webový server a zejména databázový server stejnou zátěž jako uživatel. K testování výkonu samotných www serverů existuje nespočet utilit. Ovšem tyto programy často nedokáží simulovat stejnou zátěž jako chování uživatele. Mám na mysli zejména postupné volání určitých stránek a tím i různé zatížení webu a databáze. Pokud voláte pouze jednu stránku databáze se často chová jinak než když načítáte různé stránky a třeba i do databáze přidáváte nové hodnoty.
Při takovémto testování můžete snadno zjistit která část webu je nejpomalejší nebo kolik požadavků je web schopen zpracovat za určitý čas. Podle tohoto výsledků testu snadno můžete zaměřit svou pozornost na optimalizaci těch částí kódu, které dopadli nejhůře.
Další možné využití perlu a knihovny pro web je vytvoření robota, který ze stránky/stránek čte vámi požadované údaje nebo například vyplňuje formuláře.
V tomto článku se pokusím nastínit obě možnosti. Simulaci návštěvníka, čtení mnou požadovanýc údajů z webu a měření odezvy daných stránek webu. Celý článek se nese v duchu příklad -> stručné vysvětlení.
Pokud jste v systému Debian linux tak již Perl máte pravděpodobně nainstalovaný a stačí doinstalovat potřebnou knihovnu, která Vám umožní využívat mnohé funkce pro práci s webem. To provedete jednoduše příkazem
aptitude install libwww-mechanize-perl
Soubor getWww.pl:
#!/usr/bin/perl
use WWW::Mechanize;
my $m = new WWW::Mechanize(
autocheck => 1,
);
$m->get("http://koudis.net");
print $m->content;
Hura na první spuštění, napište příkaz
perl getWww.pl
Tento kousek kódu ukazuje asi to nejjednodušší k čemu můžete nově instalovanou knihovnu použít.
Program pouze vytvoří objekt m do kterého posleze uloží zdrojový kód www stránky http://koudis.net a ten vytiskne na standardní výstup.
Pro výstup stránky bez html tagů můžete použít
print $m->content(format => text);Mě se tento výstup nelíbí takže se jím nebudu dále zabývat.
Pokud dostanete po spuštění následující chybovou hlášku znamenáte to že nemáte správně nainstalovanou knihovnu libwww-mechanize-perl
Can't locate WWW/Mechanize.pm in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.8.8 /usr/local/share/perl/5.8.8 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.8 /usr/share/perl/5.8 /usr/local/lib/site_perl .) at getWww.pl line 2. BEGIN failed--compilation aborted at getWww.pl line 2.
A jdeme dál
Jistě se bude hodit pro něktěré servery se tvářit jako standardní prohlížeč. Proto si správně nastavíme následující hodnoty:
Soubor acceptlang.pl
#!/usr/bin/perl
use WWW::Mechanize;
my $m = new WWW::Mechanize(
agent => 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)',
autocheck => 1,
);
my $n = new WWW::Mechanize(
agent => 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)',
autocheck => 1,
);
$m->add_header( Referer => 'http://perlskript.zive.cz' );
$m->add_header('Accept-Language' => 'en');
$m->get("http://kniha-navstev.cz");
print substr($m->content,1887,887);
print "\n====================\n";
$n->add_header( Referer => 'http://perlskript.zive.cz' );
$n->add_header('Accept-Language' => 'cs');
$n->get("http://kniha-navstev.cz");
print substr($n->content,1887,887);
print "\n";
V tomto skriptu jsme objekty vytvořili hned dva a oba volají stejnou stránku s jiným nastavením jazyka. Takže na výstupu byste měli vidět část kódu stránky v češtině a část v angličtině. Pro server se tváří jako prohlížeč uvedené verze a vypadá to že přicházíme ze stránky http://perlskript.zive.cz
Základ máme teď už zkusíme něco složitějšího.
Nyni si ukážeme jak ve stránce vyhledávat odkazy a případně na ně přímo "kliknout" a jak si ve stránce pomocí regulárních výrazu najít text který nás zajímá. Regularní výrazy zde probírat nebudu. To je na mnoho jiných článku.
Zároveň budeme měřit čas na stažení každé z hledaných stránek.
Jelikož výpis na obrazovku už bude značně velký, budeme výsledky zapisovat pouze do log souboru.
Skript je již popisován přímo v ukázce kódu, ukázka je plně funkční takže si ji můžete zkopírovat a vyzkoušet.
Soubor getlink.pl
#!/usr/bin/perl
use WWW::Mechanize;
use Time::HiRes qw(usleep ualarm gettimeofday tv_interval);
my $m = new WWW::Mechanize(
agent => 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0) - Zive.cz',
autocheck => 1,
);
$m->add_header('Accept-Language' => 'cz');
$m->add_header( Referer => 'http://koudis.net' );
sub cas
{
#vypis casu
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time);
return sprintf "\n========= %4d-%02d-%02d %02d:%02d:%02d =============\n",$year+1900,$mon+1,$mday,$hour,$min,$sec;
};
if ( !$ARGV[0] ){ #kontrola parametru
print "Use: $0 http://hostname\n";
}else{
#prvni promenna je adresa webu na kterem chci provest test
$hostname = $ARGV[0];
#ze zvyku pouzivam volani programu date ze shellu
$date=`date +%Y%m%d%H%M`;
#osekam vsechny ridici znaky
chop $date;
#adresar kam chci ukladat logy
$logdir = "/home/koudis/";
open(LOG,">>".$logdir."webtest".$date.".log");
#zapsani casu do logu
print LOG cas;
print LOG "Zaznam z jednoducheho nacteni stranky http://koudis.net nasledovani odkazu s textem Svatky, na cilove strance vyhledani vsech odkazu obsahujicich v popisu pismena 'en',, vypsani jejich plnych nazvu a z cilovych odkazu techto stranek vypsani kdo ma svatek 13.den toho mesice.\n\n";
#zapsani stranky kterou chceme testovat, v tomto pripade pouze http://koudis.net, protoze zde je spravny odkaz pojmenovany Svatky.
print LOG $hostname."\n\n";
print LOG "Stahuji stranku ".$hostname."\n";
$m->get($hostname);
print LOG "Nasleduji odkaz obsahujici v nazvu slovo Svatky, nezalezi na velikosti pismen\n";
$m->follow_link(text_regex => qr/Svatky/i);
#kopiruji si strukturu $m abych si v puvodni mohl ponechat nalezene odkazy
$m2=$m;
print LOG "Hledam vsechny linky ktere obsahuji znaky en, na velikosti nezalezi ;)\n";
@links = $m->find_all_links(text_regex => qr/en/i);
foreach $link (@links){
print LOG "---\nText odkazu: ".$link->text()."\n";
print LOG "Stahuji odkaz\n";
#zacatek mereni casu
$start = [gettimeofday];
$m2->get($link->url());
#namereny cas
$elapsed = tv_interval ($start);
print LOG "Stazeno za ${elapsed} vterin.\n";
#NAJIT V TEXTU KDO MA SVATEK 13.den
print LOG "Hledam kdo ma svatek trinacteho: ";
if ( $m2->content =~ /13.<\/td> ([^<]+)<\/td>/ ){
#zapisuji do logu hledany text
print LOG $1."\n";
#vystup kodu stranky
#print $m2->content;
}
}
#pocet nalezenych linku
$size = @links;
print LOG "\n:::: Nalezeno celkem ${size} odkazu obsahujicich znaky en\n";
@links = $m->find_all_links();
$size = @links;
print LOG "\n:::: Nalezeno celkem ${size} odkazu\n";
};
Místo vyhledavání kdo má svátek můžete v textu hledat například javascriptové odkazy a ty poté také stahovat. Pokud bude zájem je možno sepsat i testování formulářů. Sami si jistě dopíšete několikanásobné opakovaní testu a pruměrování naměřených hodnot atd. Doufám že aspoň toto málo co jsem zde popsal bude pro někoho užitečné.
Poznámka: test vůbec nestahuje obrázky. Byl původně určen pro zatížení databáze skrze web.
Užitečné odkazy
Home
Moje navody
Moje sluzby
Kvalitní webhosting
Správa serverů
- webservery
- mailservery
- vysoce dostupné serverové farmy
Správa sítí
- rozsáhlé vysoce dostupné sítě
- load balancery
- firewally
- vpn sítě
Moje stranky
Fotogalerie
Muj freeware
Reklama
Anketa
Nedefinovana anketa !
Pro dobrou naladu
Autor
© 2012 Koudis
Zrozen: 12.3.1982
Aktuální bydliště
Praha
Kontakt
Milan Koudelka
Karla Capka 1135
Lomnice n.Pop.
Kniha navstev
koudis@koudis.net
http://koudis.net
776 / 313 414
Skype: koudisek
Jabber: koudis@koudis.net
81312519
CSFD: koudis
Facebook: koudis
Libimseti: koudis
Nyx: koudis
Najdise: koudis
Životopis
Curriculum vitae (english)
Linkedin profile
Zkuste..
Pro webmastery