Pupek internetu

Google


Google

 

Navody

Zde je mozno najit me poznamky k ruznym nastavenim.

Perl - práce s webem

Proč pracovat v perlu s webem ?

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í.

Co budeme potřebovat ?

  • Skriptovací jazyk Perl
  • Knihovnu libwww-mechanize-perl

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

První skript

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

Nastavujeme informace o našem "prohlížeči"

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:

  • Agent
    jaký máme typ prohlížeče
  • Referer
    z jaké stránky přicházíme
  • Accept-Language
    jaký jazyk stránky preferujeme.
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.

Následujeme odkazy, hledáme v kódu stránky, měříme čas.

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

Moje sluzby

Kvalitni webhosting
Linux servery
Sprava siti
Tvorba www

Fotogalerie

Pro webmastery

Reklama

Anketa

Nedefinovana anketa !

Autor

Koudis
© 2004 Koudis
Zrozen: 12.3.1982
Pusobiste:
Pardubice, Lomnice n.Pop., Praha

Zkuste..