2013-03-15 5 views
1
#!/usr/bin/perl 

use strict; 
use warnings; 
use WWW::Mechanize; 
use FindBin qw($Bin); 
print $Bin; 
my $folder = "$Bin/Resources"; 
mkdir($folder, 0700) unless(-d $folder); 
chdir($folder) or die "can't chdir $folder\n"; 
my $url = 'http://www.ukgamingcomputers.co.uk/images/zalmanz11plus.jpg'; 
my $local_file_name = 'pic.jpg'; 
my $mech = WWW::Mechanize->new; 
$mech->get($url, ":content_file" => $local_file_name); 

Я в настоящее время использую этот код для загрузки .jpg и помещаю его в папку «Ресурсы». Я хочу загрузить все .jpg в каталог http://www.ukgamingcomputers.co.uk/images/. Я совершенно не знаю, как бы я этого добился. Если у вас есть решение для кода, я был бы благодарен!Perl: Загрузка всего .jpg из веб-каталога

+0

Что происходит, если вы используете фрагмент кода, который вы указали выше? – 2013-03-15 17:31:21

+0

В настоящее время я использую код для загрузки pic.jpg и помещаю его в папку Resources. – 2013-03-15 17:57:28

ответ

2

Я боюсь, что вы не можете сделать это. Маловероятно, что владелец веб-сайта захочет вас.

Нет практической проблемы с загрузкой изображения по этому пути, но чтобы получить их все, что вам нужно знать, что они вызывают, и нет способа получить список каталогов, используя HTTP.

Вы могли ползать сайт, принеси все HTML-страницы из него, и найти имена всех файлов изображений эти страницы ссылаются на, но это было бы неудобно делать, и еще менее вероятно, чтобы быть приемлемой для владелец сайта. Это также даст вам только изображения, используемые на сайте, а не все изображения в каталоге.

Некоторые HTTP-серверы настроены так, чтобы возвращать список каталогов в HTML, если в URL-адресе не указан конкретный файл, а файл по умолчанию index.html отсутствует, но это необычно в настоящее время, поскольку оно представляет собой нарушение безопасности.

Если вы считаете, что владелец сайта не против, чтобы вы помогали себе фотографировать, почему бы просто не отправить электронное письмо с просьбой о его копировании?

+0

Мне не нужны фотографии, я просто экспериментирую с perl. Может быть, я должен попробовать другой проект, если это считается неприемлемым? – 2013-03-15 17:58:52

+0

@ LukeSilver Я думаю, вы прекрасно это делаете на более крупных сайтах. Как google, yahoo и т. Д. Я полагал, что это было схоластическое, как – chrsblck

+1

@chrsblck: Это очень плохой совет. Например, Google защищает свои услуги довольно агрессивно, и их условия обслуживания говорят: «Не злоупотребляйте нашими услугами, например, не мешайте нашим услугам или пытайтесь получить к ним доступ, используя метод, отличный от интерфейса, и инструкции, которые мы предоставляем ». * – Borodin

1

Вам нужно использовать WWW::Mechanize?

Вот пример с HTML::LinkExtor и LWP::Simple

EDIT: Это на самом деле тянет все изображения с данного адреса.

#!/usr/bin/perl 

use warnings; 
use strict; 

use LWP::Simple; 
use HTML::LinkExtor; 
use Data::Dumper; 
$Data::Dumper::Indent=1; 

die "usage: $0 url\n" if @ARGV != 1; 
my $url = shift; 
$|++; 

if ($url !~ /^http/) { 
    print "usage: url (http(s)://www.example.com/ )\n"; 
    exit(1); 
} 

my %images =(); 
my $html = get($url) 
    or die "could not get $url\n"; 

my $parser = HTML::LinkExtor->new(undef, $url); 
$parser->parse($html); 

my @all_link_refs = $parser->links(); 

for my $link_ref (@all_link_refs ) { 
    my ($html_tag, $attr_name, $this_url) = @$link_ref; 
    if (($html_tag eq 'img')) { 
    my $image_name = (split("/", $this_url))[-1]; 
    $images{$image_name}++; 

    if ($images{$image_name} == 1 ) { 
     print "Downloading $this_url to $image_name...\n"; 
     open my $PIC, ">", "$image_name"; 
     my $image = get($this_url); 
     print $PIC $image; 
    } 
    } 
} 

Ouput:

$ test.pl http://google.com 
Downloading http://google.com/intl/en_ALL/images/srpr/logo1w.png to logo1w.png... 
+0

Это не делает то, что было задано. Он просто извлекает все файлы, указанные в атрибуте 'src' элемента' img' данной HTML-страницы. – Borodin

+0

@ Бородин Правильно. Я немного интерпретировал этот вопрос. Вопрос OP не имеет смысла, потому что вам нужно будет узнать имя загружаемого файла. Скорее всего, он получает 'view source' с веб-страницы. Это означало бы, что просто просто скачать прямо из браузера. – chrsblck

+0

Тогда вам не кажется, что вы должны что-то сказать о том, что на самом деле делает ваш код, и что он не делает то, что было задано? – Borodin

0

Ниже приведен пример вашего примера, который вытаскивает jpg с указанного вами сайта.

#!/usr/bin/perl 
use strict; 
use warnings; 

use WWW::Mechanize; 
use WWW::Mechanize::Link; 
use Getopt::Long; 

exit int main(parse_args()); 

sub main { 
    my $opts = shift; 

    my $folder = $opts->{folder}; 
    chdir($folder) or die "can't chdir $opts->{folder}\n"; 

    my $mech = WWW::Mechanize->new; 
    $mech->get($opts->{url}); 

    for my $link ($mech->links()) { 
     next unless $link->text() =~ /jpg$/; 
     $mech->get($link->url()); 
     $mech->save_content($link->text()); 
    } 
} 

sub parse_args { 
    my %opts = (
     url => "http://www.ukgamingcomputers.co.uk/images/", 
     folder => "/home/kprice/tmp", 
    ); 

    GetOptions(\%opts, 'url|u=s', 'folder|d=s',) or die $!; 

    return \%opts; 
} 

Если вы на Linux, это будет работать, но вытащить все из этой ссылке:

$ wget -r http://www.ukgamingcomputers.co.uk/images/

EDIT: Я поправил немного после этого быстрого копирования/вставки.

+0

* Пожалуйста, не научите людей злоупотреблять чужого интернет-ресурса. – Borodin

Смежные вопросы