Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: разработка для Web > Качалка файлов


Автор: chaos 27.10.2004, 11:30
Всем ЗДРАСТЕ!!!!

Подскажите: хочу написать скрипт каторый будет выкачивать файл с http сервера, не хтмл а допустим гиф
Пример: есть адрес: http://host.ru/image.gif(пример)
как мне этот файл закачать к себе на машинку, средствами перл

Автор: GoodBoy 27.10.2004, 12:02
что-то наподобе такого...

Код
#!/usr/bin/perl

use Socket;

$file = '/images/pict.gif';
$host = 'www.domain.ru';
$port = 80;
$request="GET $file HTTP/1.0\nHOST: $host:$port\n";

$SIG{ALRM} = sub { die };
$/=undef;
alarm 25;
eval { $text = &http; };
close SOCK;

if ((!$@) and ($text=~/^HTTP\/[^ ]* (\d+)/) and ($1==200)) {
       $text=~/\r?\n\r?\n/s;
       $out = $';
}

open (FL, ">pict.gif");
print FL $out;
close FL;
print "ok\n";

sub http {
       return 'Error 1' if !($addr=gethostbyname($host));
       return 'Error 2' if !(socket(SOCK,PF_INET,SOCK_STREAM,getprotobyname('tcp')));
       return 'Error 3' if !(connect(SOCK,pack('S n a4 x8', PF_INET, 80, $addr)));
       select SOCK;
       $|=1;
       select STDOUT;
       print SOCK $request."\n";
       my @text = <SOCK>;
       return join("", @text);
}

Автор: chaos 27.10.2004, 13:03
одна проблемка возникла!!!
размеры у файлов получаются разные :((

Автор: GoodBoy 27.10.2004, 13:41
попробуй вот так:
Код
open (FL, ">pict.gif");
binmode FL;
print FL $out;
close FL;

Автор: chaos 27.10.2004, 14:09
:yasno Работает !!!!
СПАСИБО

Автор: korob2001 27.10.2004, 20:47
Ещё можно заливать файлы таким способом. Я так делал когда, мне было необходимо залить все модули с www.activestate.com, правда нужно было сначала пропарсить страницу, для того что бы выдернуть оттуда все файлы с разширением .zip. Но сейчас вопрос не в этом.

Вот код:
Код

#!/usr/bin/perl
use strict;
use LWP::Simple;

my $domain = "http://domain.ru";
my $file = "dir/picture.gif";

(my $mirror_file = $file) =~ s/.+\/(\w+\.\w+)$/$1/;

# Далее идёт заливка и проверка того, что файл был успешно залит.
# Она же показывает и размер залитого файла.
if ( mirror("$domain/$file", $mirror_file) ) {
    my $size = sprintf("%.f", ( (stat($mirror_file))[7] / 1024 ));
    print "File $mirror_file successfuly saved. Full size is $size Kb.\n";
} else {
    print "Error\n";
}


Удачи.

Автор: chaos 29.10.2004, 12:09
Блин возникла проблема!!!!
Если я делаю так:
Код


#!/usr/bin/perl

use Socket;

open (F,"$filename");
while (<F>) {
 chomp;
 general($_);
}

sub general {
 $str=$_[0];
 $file = '/images/'.$str;
 $host = 'www.domain.ru';
 $port = 80;
 $request="GET $file HTTP/1.0\nHOST: $host:$port\n";

 $SIG{ALRM} = sub { die };
 $/=undef;
 alarm 25;
 eval { $text = &http; };
 close SOCK;

 if ((!$@) and ($text=~/^HTTP\/[^ ]* (\d+)/) and ($1==200)) {
      $text=~/\r?\n\r?\n/s;
      $out = $';
 }

 open (FL, ">$str");
 print FL $out;
 close FL;
 print "ok\n";
}

sub http {
      return 'Error 1' if !($addr=gethostbyname($host));
      return 'Error 2' if !(socket(SOCK,PF_INET,SOCK_STREAM,getprotobyname('tcp')));
      return 'Error 3' if !(connect(SOCK,pack('S n a4 x8', PF_INET, 80, $addr)));
      select SOCK;
      $|=1;
      select STDOUT;
      print SOCK $request."\n";
      my @text = <SOCK>;
      return join("", @text);
}


Почемуто качает только один файл. В чем может быть проблемма???

Автор: GoodBoy 29.10.2004, 12:12
И наверное только самый последний в списке??? Подумай вот над этой строкой:
Код
open (FL, ">pict.gif");

;-)

Автор: chaos 29.10.2004, 12:18
Цитата(GoodBoy @ 29.10.2004, 12:12)
И наверное только самый последний в списке??? Подумай вот над этой строкой:
Код
open (FL, ">pict.gif");

;-)

не здесь все хорошо, просто забыл исправить

Автор: chaos 1.11.2004, 12:11
блин проблема все продолжается!!!
прога почемуто качает файлы с одним и тем же содержимым если я делаю вот так
Код

foreach  (@str) {
 chomp;
 gener($_);
}

а если я делаю :
Код

gener('filename1');
gener('filename2');
gener('filename3');
gener('filename4');

Все отлично почему так????
Текст проги:
Код

#!/usr/bin/perl
use Socket;

my $lst_file='drweb32.lst';

gener($lst_file);   #качаем лст-файл
$/="\n";

#парсим лст-файл
open(F,"<$lst_file") || die $!;
open (FF,">parse$lst_file") || die $!;
NEX: while (<F>) {
 next NEX if /\[\d+\]/;
 s/(.+)\,.*/$1/;
 s/^.?(.+)/$1/;
 s/<.+>(.+)/$1/;
 s/\|.+//;
 s/(.+)\\(.+\.\w+)/$2/;
 next NEX if /\*/g;
 print FF;
}
close FF;
close F;

#Качаем файлы имена каторых содератся в лст-файле
open (F,"<parse$lst_file");
@str = <F>;
close F;
foreach  (@str) {
 chomp;
 gener($_);
}

############ПРОЦЕДУРЫ ОТВЕЧАЮЩИЕ ЗА СКАЧИВАНИЕ АЙЛОВ#########
sub gener {
 $fn=$_[0];
 $file = '/free/windows/'.$fn;
 $host = 'updates.drweb.ru'; #'10.59.1.40';
 $port = 80;
 $request="GET $file HTTP/1.0\nHOST: $host:$port\n";
 $/=undef;

 eval { $text = &http; };
 close SOCK;

 if ((!$@) and ($text=~/^HTTP\/[^ ]* (\d+)/) and ($1==200)) {
   $text=~/\r?\n\r?\n/s;
   $out = $';
 }

 open (FL, ">$fn");
 binmode FL;
 print FL $out;
 close FL;
 print "$fn ok\n";
}
#---------------------------------------------------------------------------------------------------------------------
sub http {
 return 'Error 1' if !($addr=gethostbyname($host));
 return 'Error 2' if !(socket(SOCK,PF_INET,SOCK_STREAM,getprotobyname('tcp')));
 return 'Error 3' if !(connect(SOCK,pack('S n a4 x8', PF_INET, 80, $addr)));
 select SOCK;
 $|=1;
 select STDOUT;
 print SOCK $request."\n";
 my @text = <SOCK>;
 return join("", @text);
}
#############################################################

Автор: korob2001 1.11.2004, 15:06
Обрати внимание на эту строку из вышеприведённого мной скрипта:
Код

(my $mirror_file = $file) =~ s/.+\/(\w+\.\w+)$/$1/;

Автор: chaos 16.11.2004, 07:34
Кстати попробовал функцию get из LWP, довольно таки не плоха она справляется с закачкой файлов

Автор: korob2001 16.11.2004, 23:41
Пробуй не get, а mirror. Выше, я написал как.

Автор: anest 17.6.2005, 06:10
подскажите плыз
а как пропарсить страницу .html с которой есть ссылки на другие страницы (а с них еще и тд в цикле но страницы только в заданном домене) и собрать с них все ссылки на .zip файлы и скинуть их все в файл list.lst к примеру?
smile

Автор: korob2001 17.6.2005, 06:29
anest - а причём здесь эта тема???
М
 
Один топик, один вопрос

Автор: Sadok 17.6.2005, 12:29
korob2001
Цитата
правда нужно было сначала пропарсить страницу, для того что бы выдернуть оттуда все файлы с разширением .zip. Но сейчас вопрос не в этом.

Накропал как-то парсер, который выдергвает все ссылки со страницы. Прикрутить кнему "гляделку" к .zip - пара пустых smile
Код

use strict;
use LWP::UserAgent;
use HTML::LinkExtor;
use URI::URL;
my ($url, $ua, $res, $base, $p, %links);
$url = "http://gol.mkafisha.ru/"; # Это пример
$ua = LWP::UserAgent -> new;
#$ua -> proxy(http => 'http://vali:2128'); # Это если прокси есть
$p = HTML::LinkExtor -> new(\&callback);
$res = $ua -> request(HTTP::Request -> new(GET => $url));
$res -> is_success() ? {$p -> parse($res -> content), print $res -> status_line ."\n"} : print "Error: " . $res -> status_line ."\n";
$base = $res -> base;
# Далее при печати сортирует ссылки по алфавиту (мне так надо было)
defined %links ? map {print url($_, $base) -> abs,"\n"} sort (keys %links) : print "No items, sorry...";
sub callback {
    my ($tag, %attr) = @_;
    map {$links{$_}++} values %attr;
}

Автор: korob2001 18.6.2005, 00:01
Sadok
Я уже давно закончил эту программу и без участия сторонних модулей.
Но всёравно, спасибо.

Автор: anest 18.6.2005, 06:01
Цитата(Sadok @ 17.6.2005, 12:29)
Накропал как-то парсер, который выдергвает все ссылки со страницы.

а как сделать чтобы парсер выдергивал ссылки со всех страниц на сайте?
smile

Автор: Sadok 18.6.2005, 10:17
anest
Э... м-да. Очень муторно на мой поверхостный взгляд. Может и есть какой модуль на cpan, но я даже не знаю, в какую сторону копать.

Есть скрипт поисковый RiSearch (http://risearch.org/rus/index.html), внутри него есть модуль spider.pl. Можно в нем покопатся, он небольшой.

Автор: korob2001 18.6.2005, 11:38
anest - я же тебе уже написал:
М
 

Один топик - один вопрос и всё, что его касается. Твой вопрос никак не касается темы данного топика. Не поленись создать новый топик и задать там свой вопрос.
Тема закрыта.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)