ishiducaの日記 このページをアンテナに追加 RSSフィード

2011-06-06

[][Parallel::ForkManager][Clone]Pixiv 漫画コンテンツの非同期DL 12:29 [Parallel::ForkManager][Clone]Pixiv 漫画コンテンツの非同期DL - ishiducaの日記 を含むブックマーク はてなブックマーク - [Parallel::ForkManager][Clone]Pixiv 漫画コンテンツの非同期DL - ishiducaの日記 [Parallel::ForkManager][Clone]Pixiv 漫画コンテンツの非同期DL - ishiducaの日記 のブックマークコメント

WWW::Pixiv::Downloadで漫画コンテンツをDLするには

$client->download($illust_id);

とやることで可能です。この場合、漫画を構成する画像を同期ダウンロードするため、画像数が多い場合は時間がかかります。(ちなみに、漫画コンテンツの任意のページをDLするには

$client->download($illust_id, {
    manga_pages => [ 0, 2, ... ]
});

とやれば良いです。この場合も同期ダウンロードです)

「七宮姉妹【本編】」/「はいてくりん」の漫画 は49枚のコンテンツです。(唐突に)

同期DLしてると時間がかかって仕方ない!ってなるか。時間切れ(504 Gateway Time-out)で、ハイソコマデデヨ!!ってなるかで、ヤッテラレイヨ!! ってなることは必然。

なので、僕は非同期DLすることにしました。

parallel.pl こっち(gist: 1009645)にも

#!/usr/bin/env perl
use strict;
use warnings;
use WWW::Pixiv::Download;
use Config::Pit qw(pit_get);
use Parallel::ForkManager;
use Path::Class;
use Clone;

my $illust_id = '17373419';
my $dir_home  = "$ENV{HOME}/Desktop/test_image";

my $config = pit_get('www.pixiv.net', require => {
    pixiv_id => '', pass => '',
});
die qq(! failed: "pit_get"\n) if ! %$config;

my $client = WWW::Pixiv::Download->new(
    pixiv_id   => $config->{pixiv_id},
    pass       => $config->{pass},
    # over_write => 1,
    look       => 1,
);
my $info = $client->prepare_download($illust_id);
$info->{author}->{name} =~ s:/::g;
$info->{title} =~ s:/::g;

my $dir = join '/', $dir_home, $info->{author}->{name}, $info->{title};

unless (-e $dir) {
    warn qq(! "${dir}" not found.\n);
    dir($dir)->mkpath or die qq(! failed: can not mkpath "${dir}" $!\n);
    warn qq( mkpath "${dir}" success.\n);
}

my $urls = $info->{contents}->{img_srcs};
die qq(! failed: image srcs not found.\n) unless $urls;

my $pm = Parallel::ForkManager->new(scalar @$urls);
for my $url (@$urls) {
    my $pid = $pm->start and next;
    my $clone_c = Clone::clone($client);
    $clone_c->_save_content($url, {
        path_name => $dir,
    });

    $pm->finish;
}

$pm->wait_all_children;

exit 0;
__END__

はいてくりん/七宮姉妹【本編】の漫画コンテツ 49枚 をフォークプロセスでDL

流れとしては

  • ログイン && RefererURLの取得
  • prepare_downloadメソッドの返り値から漫画コンテンツの画像のurlを配列で取得
  • 画像url分のフォークプロセスをParallel::ForkManagerで
  • $clientのクローンを作って、クローンでDLする(_save_content_メソッドはドキュメントにないけど、$client->_save_content($img_src, \%option)でピクチャーを保存します。

Parallel::ForkManager++

トラックバック - http://perl.g.hatena.ne.jp/ishiduca/20110606