2009年03月20日

pixivで、でかい画像を見るのに3回もクリックするのに疲れたので、でっちあげました。
ついでにWWW::Mechanizeデビュー。

使い方は簡単。
絵師のIDと保存したいディレクトリ名、あとは最大ページ数を指定すればいいよ。
保存したいファイルのエンコード種類も指定できるけどスクリプトに直接書いた方がいいよ!

Usage: pixiv_get.pl [-i] id [-d save_directory] [-p max_page_number] [-e encode]
  • 「タイトル_画像ID.拡張子」の形式で保存
  • すでにファイルが存在していたらSKIP
  • タイトルに機種依存文字があったら「U+XXXX」にする
最新はこっち gist: 95591 - GitHub

pixiv_get.pl

# pixivから指定したidの画像を取得する

use strict;
use warnings;
use utf8;
use Web::Scraper;
use WWW::Mechanize;
use Encode qw/find_encoding decode_utf8/;
use File::Basename qw/basename/;
use File::Spec::Functions qw/catfile/;
use Getopt::Long qw/GetOptions/;

# 自分の環境に合わせてね!
my $default_encoding = 'cp932';
my $username = 'your user name';
my $password = 'password';

my %win32_taboo = (
     '\\' => '¥',
     '/'  => '/',
     ':'  => ':',
     '*'  => '*',
     '?'  => '?',
     '"'  => '″',
     '<'  => '<',
     '>'  => '>',
     '|'  => '|',
);

GetOptions(\my %opt, 'id=i', 'directory=s', 'page=i', 'encode=s');

my $id = shift || $opt{id} || die "Usage: $0 [-i] id [-d save_directory] [-p max_page_number] [-e encode]";
my $dir = $opt{directory} || $id;
my $max_page = $opt{page} || 1;
my $enc = $opt{encode} || $default_encoding;
$enc = find_encoding($enc);

my $mech = WWW::Mechanize->new(autocheck => 1);

$mech->get('http://www.pixiv.net/index.php');
$mech->submit_form(
    fields => {
        pixiv_id => $username,
        pass     => $password,
    },
);

mkdir $dir or die "$dir $!" unless -d $dir;

do { get_pict($mech) } while (--$max_page);

sub get_pict {
    my $mech = shift;
	
    my $url = "http://www.pixiv.net/member_illust.php?id=" . $id;
    if ($max_page) {
        $url .= sprintf("&p=%d", $max_page);
    }
	
    $mech->get($url);
	
    my $scraper = scraper {
        process '//*[@id="illust_c4"]/ul/li', 'list[]' => scraper {
            process 'a', url => [ '@href', sub {
                (my $url = $_->as_string) =~ s/mode=medium/mode=big/;
                return $url;
            } ],
            process 'div', title => 'TEXT',
        },
    };
	
    my $res = $scraper->scrape($mech->content, $mech->uri);
	
    for my $row (@{$res->{list}}) {
        $mech->get($row->{url});
        my $scraper = scraper {
            process '/html/body/div/a/img', image => [ '@src', sub { $_->as_string } ],
        };
        my $res = $scraper->scrape($mech->content, $mech->uri);
		
        my $url = $res->{image};
        $mech->get($url);
		
        my $file = decode_utf8($row->{title});
        $file = &_win32_file_normalize($file) if $^O eq 'MSWin32';
        $file = catfile($dir, $enc->encode($file, sub{ sprintf "U+%04X", shift }) . "_" . basename($url));
        print "skip $file\n" and next if -f $file;
		
        print "Download $file\n";
        open my $fh, '>', $file or die "$file $!";
        binmode $fh;
        print {$fh} $mech->content;
        close $fh;
    }
}

sub _win32_file_normalize {
    my $file_name = shift;
    $file_name =~ s#([\\/:*?"<>|])#$win32_taboo{$1}#ge;
    return $file_name;
}

トラックバックURL

コメント一覧

1. Posted by kata kata cinta romantis   2014年06月11日 03:22
非常に素晴らしいのニュース、インドネシアの国民の成功を読み、挨拶、私たちへの書き込みをありがとうございました
2. Posted by saatnya   2014年06月18日 04:34
良いニュースは、ありがとうございました!
3. Posted by kata kata cinta   2014年06月19日 09:41
非常に興味深い記事、ありがとうございました
4. Posted by Cetak Murah Rawamangun Jakarta Timur   2016年10月18日 04:45
よろしく、私の忠実な読者と再びお会いしましょう!
5. Posted by Kata Kata Remaja   2016年10月21日 23:46
非常に素晴らしいのニュース、インドネシアの国民の成功を読み、挨拶、私たちへの書き込みをありがとうございました
6. Posted by Jasa Percetakan dan Jasa Fotocopy Murah Rawamangun Jakarta   2016年10月22日 02:18
これは非常に多くの時間が、私はいつも訪問し、このブログのすべての最新の記事を読んで私の訪問数です。インドネシアからのご挨拶
7. Posted by Cetak Murah Rawamangun Jakarta Timur   2016年12月27日 04:38
良いニュースは、ありがとうございました!
8. Posted by PERCETAKAN MURAH DI JAKARTA   2017年01月06日 01:45
良いニュースは、ありがとうございました!

コメントする

名前:
URL:
  情報を記憶: 評価:  顔   星
  絵文字
 
 
プロフィール

Perlが少しだけ出来る気になってます。
JavaScriptはよくわかりません。
Rubyもちんぷんかんぷんです。
Pythonは難しいです。
ActionScript勘弁してください。
Javaあばばばばば。
低級言語できません。

github
記事検索
  • ライブドアブログ