Download File - Stažení souboru z internetu

Perl Camel - velbloud PerlTato glosa pomůže všem, kteří hledají nejjednodušší způsob stahování souborů z internetu v jazyce Perl. Konkrétně nám pomůže modul LWP::UserAgent. Postupně budu psát jednotlivé řádky kódu a popisovat jej.

Nejprve potřebujeme připojit všechny potřebné moduly. Jsou to HTTP::Request a již zmíněný LWP::UserAgent.

use HTTP::Request::Common qw(GET HEAD);
use LWP::UserAgent;

Všimněte si, že mohu předem specifikovat, které požadavky na server budu mít. Požadavek typu HEAD není povinný, ale budu na něm demostrovat ještě jednu, hezkou funkci modulu use LWP::UserAgent;, konkrétně získání mime typu stahovaného souboru.
Vytvoříme instanci UserAgenta a nastavíme jej pro naše požadavky. V hlavičce každého požavku je také uvedeno, jaký typ klienta o příslušný soubor žádá. Můžeme server trochu zmást tím, že se budeme tvářit jako bychom byli prohlížeč Mozilla.
my $ua = LWP::UserAgent->new; # vytvoření instance UserAgenta 
$ua->agent("Mozilla/8.0"); # určení, jak se bude UA hlásit serveru

Budeme potřebovat dvě proměnné a to objekt pro HTTP požadavek(request) a objekt pro odpověď od serveru(response).
my $request;
my $response;

Nastavíme objekt požadavku pro stažení HTTP hlavičky souboru umístěného na příslušné webové adrese a pomocí UserAgentovy funkce request hlavičku stáhneme. Výsledek operace se uloží do proměnné response, odkud si knihovní funkcí vytáhneme MIME type. V tomto ukázkovém příkladě MIME jenom vypíšeme, ale prakticky s ním jde dělat cokoli.
$request = HEAD 'http://ukazka.tld/soubor.typ';
$response = $ua->request($request);
print $response->content_type(); # vypíše MIME type

Stejně jednoduše jako typ obsahu stáhneme i celý soubor nebo stránku. Kód maličko pozměníme tak, aby serveru posílal požadavky typu GET a přidáme druhý parametr UserAgentovy funkci request, kterým určíme jméno stahovaného souboru. Nakonec zkontrolujeme úspěšnost stahování souboru.
$request = GET 'http://ukazka.tld/soubor.typ';
$response = $ua->request($request, "soubor.typ");
if ( $response->is_success ) {
  print "Soubor byl úspěšně stažen.\n";
}
else {
  print "Nepodařilo se stáhnout soubor.\n";
}

Pokud se stažení souboru podařilo, najdeme jej (v tomto případě) ve stejném adresáři jako spuštěný skript.
Podívejte se blíže na modul UserAgent. Jedná se o výborného pomocníka při práci s protokolem http.

Fragment kódu

use HTTP::Request::Common qw(GET HEAD);
use LWP::UserAgent;
my $ua = LWP::UserAgent->new;
$ua->agent("Mozilla/8.0");
$request = HEAD 'http://ukazka.tld/soubor.typ';
$response = $ua->request($request);
print $response->content_type();
$request = GET 'http://ukazka.tld/soubor.typ';
$response = $ua->request($request, "soubor.typ");
if ( $response->is_success ) {
  print "Soubor byl úspěšně stažen.\n";
}
else {
  print "Nepodařilo se stáhnout soubor.\n";
}