![]() ![]() |
Интересные решения Perl. Вопросы и ответыОсуществление HTTP-запросов в PerlДля того, чтобы сделать HTTP-запрос в Perl можно использовать несколько способов. Первый и наименее удобный способ - ручное открытие сокета, формирование заголовков запроса и получение ответа. Здесь возникает много неприятностей в завимости от типа, количества и других особенностей запросов. Вторым и на мой взгляд наиболее правильным способом является использование библиотеки LWP (The World-Wide Web library for Perl). Библиотека позволяет совершать не только HTTP-запросы, но и запросы по протоколам HTTPS, FTP и др. LWP дает два основных варианта совершения запросов: простой и расширенный. Для создания простых запросов используется модуль LWP::Simple, который позволяет совершать GET и HEAD-запросы для указанных URL. Управлять отправляемыми и принимаемыми заголовками почти не получится. Приведенный ниже код предназначен для скачивания графических информеров и складывания их в определенные папки.
#!/usr/bin/perl
use strict;
my @url = ();
my @savePath = ();
$url[0] = 'http://pics.rbc.ru/img/grinf/usd/eur_cb_forex_000066_88x90.gif';
$savePath[0] = '/home/user/WWW/i/eur_cb_forex_000066_88x90.gif';
$url[1] = 'http://informer.gismeteo.ru/27196-6.GIF';
$savePath[1] = '/home/user/WWW/i/27196-6.GIF';
use LWP::Simple;
my $i = 0;
foreach (@url) {
print "$_: " . getstore($_, $savePath[$i++]) . "\n";
}
Для создания расширенных запросов, где каждый заголовок, каждый байт запроса находится в руках программиста используется вся библиотека LWP. Приведенный ниже код делает почти тоже самое.
#!/usr/bin/perl
use strict;
use warnings;
my @url = ();
my @savePath = ();
$url[0] = 'http://pics.rbc.ru/img/grinf/usd/eur_cb_forex_000066_88x90.gif';
$savePath[0] = '/home/user/WWW/i/eur_cb_forex_000066_88x90.gif';
$url[1] = 'http://informer.gismeteo.ru/27196-6.GIF';
$savePath[1] = '/home/user/WWW/i/27196-6.GIF';
use LWP 5.64;
my $browser = LWP::UserAgent->new(
env_proxy => 0,
keep_alive => 1,
timeout => 300,
);
# если нужно использовать прокси
# $browser->proxy('http', 'http://192.168.1.3:8080/');
my @headers = (
'User-Agent' => 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705)',
'Accept' => 'image/png, image/jpeg, image/gif, text/html, text/plain, */*',
'Accept-Charset' => 'windows-1251',
'Accept-Language' => 'ru',
);
my $i = 0;
foreach (@url) {
my $response = $browser->get($_, @headers);
print $response->code . ': ' . $_ . "\n";
if ( $response->is_success ) {
if (open(FILE2, '>' . $savePath[$i])) {
binmode(FILE2);
flock(FILE2, 2);
print FILE2 $response->content;
flock(FILE2, 8);
close(FILE2);
}
}
$i++;
}
Опубликовано: 25 августа 2007 года.
|
|
© Алексей Кощеев, г.Киров, 2001-2023 |
|