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

2010-04-12

[][]pixivのお気に入りさんの画像を一括ダウンロードする 11:50 pixivのお気に入りさんの画像を一括ダウンロードする - ishiducaの日記 を含むブックマーク はてなブックマーク - pixivのお気に入りさんの画像を一括ダウンロードする - ishiducaの日記 pixivのお気に入りさんの画像を一括ダウンロードする - ishiducaの日記 のブックマークコメント

2010.08.16【追記】なんかはてブされているようなので、コードを修正しました。pixivのデザイン変更があったのでそれに合わせてスクレイピングのxpathを書き直してる

同じようなスクレイピングが続きます。すみません。

さて、気になったユーザーさんの画像を一括でダウンロードします(pixiv2pl)。

WWW::Mechanizeでコンテンツを保存するのに save_content( filename ) を使ってみました。他には目新しいことしてません。すみません。

ユーザーさんの指定は、ユーザーさんのプロフィールページで確認してください。こんな感じで表示されます。

http://www.pixiv.net/member.php?id=number

numberの部分、実際には4とか5桁の数字で、この数字を使います。

$ perl pixiv2pl 1234

というふうに。

pixiv2pl

#!/usr/bin/perl
use strict;
use warnings;
use WWW::Mechanize;
use Web::Scraper;
use File::Basename;

# 引数にダウンロードするお気に入りさんのID番号を指定します
$ARGV[0] or die "Usage: $0 id_numer\n";
# $ARGV[0] =~ /^[0-9]{4,5}$/
#     or die qq(Warn: Please specify "id_number" by the figure of four digits.\n);
my $id = $ARGV[0];

my $home = 'http://www.pixiv.net/';
my $mech = new WWW::Mechanize( autocheck => 1 );
$mech->get($home);

# my_userid, my_password は自分のを使ってね
$mech->submit_form(
    form_number => 2,
    fields => {
        'mode'     => 'login',
        'pixiv_id' => 'my_userid',
        'pass'     => 'my_password',
    },
);

my $scraper0 = scraper {
    process '//div[@class="two_column_body"]/div[3]/ul[1]/li', 'li[]' => scraper {
        process "a",   'link'    => '@href';
    };
};

my $scraper1 = scraper {
    process '//div[@class="works_display"]/a[1]', "content2" => '@href';
};

my $scraper2 = scraper {
    process '//img[1]', 'img' => '@src';
};

my $c = 1;
while( $mech->get("${home}member_illust.php?id=$id&p=$c") ) {
    my $res = $scraper0->scrape($mech->content);
    for my $li (@{$res->{li}}) {
      # "見つかりませんでした" がでたら終りにする
        $li->{link} or print "Finish!\n" and exit 0;

        $mech->get("${home}$li->{link}");
        my $res = $scraper1->scrape($mech->content);
        $mech->get("${home}$res->{content2}");
        $res = $scraper2->scrape($mech->content);
        $mech->get($res->{img});

      # コンテンツそのものをダウンロードするのに save_content() メソッドを使ってみた
        $mech->save_content( basename($res->{img}) );
        print "save as ", basename($res->{img}), "\n";
    }
    $c++;
}

exit 0;

ScreamingScreaming2013/02/01 23:12That's an expert answer to an inetrsetnig question

MarniMarni2013/02/02 03:32That's going to make things a lot esaeir from here on out.

whswunwhswun2013/02/02 18:35OC6lYI <a href="http://yrozbekqtrfg.com/">yrozbekqtrfg</a>

gltcaqhvvwogltcaqhvvwo2013/02/04 01:40LFYNtp , [url=http://crisujbatyyi.com/]crisujbatyyi[/url], [link=http://xyerhjckbked.com/]xyerhjckbked[/link], http://ocmvfcnvcymm.com/

xzpgskbxzpgskb2013/02/04 12:10t5mHqX <a href="http://czcagiyagdep.com/">czcagiyagdep</a>

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

2010-04-11

[][]Web::Scraperをもう少し 19:17 Web::Scraperをもう少し - ishiducaの日記 を含むブックマーク はてなブックマーク - Web::Scraperをもう少し - ishiducaの日記 Web::Scraperをもう少し - ishiducaの日記 のブックマークコメント

以前ワンライナーで書いた画像収集のコード(オトギリさんのホームページから画像収集)、があるけど、Web::Scraperを使ってやってみる。

ただ、これは別のサイト(というか、ブログ)だけど。

FC2のサイトだと mainEntryBodyクラス内の a タグでひっぱてくればいいので、こんな感じで。

get_img_from_fc2pl

#!/usr/bin/perl
use strict;
use warnings;
use Web::Scraper;
use URI;
use LWP::Simple;
use File::Basename;

@ARGV or die "Usage: $0 uri [...]\n";

# FC2 のサイト用
my $scraper = scraper {
    process ".mainEntryBody a", "link[]" => '@href';
};

foreach my $uri (@ARGV) {
    my $res = $scraper->scrape(URI->new($uri));
    print "$_\n" and mirror($_, basename($_))
        foreach (grep{ /^http:\/\/(.+?)$/i }(@{$res->{link}}));
    print "\n";
}

exit 0;
トラックバック - http://perl.g.hatena.ne.jp/ishiduca/20100411

2009-05-03

[][]オトギリさんのホームページから画像収集 17:32 オトギリさんのホームページから画像収集 - ishiducaの日記 を含むブックマーク はてなブックマーク - オトギリさんのホームページから画像収集 - ishiducaの日記 オトギリさんのホームページから画像収集 - ishiducaの日記 のブックマークコメント

事情というか、経緯は voxの記事 を参照してもらうとして、手順だけ。コードはワンライナーで画像収集/perl-users.jpのパクリ以外の何でもんですけど。

該当するウェブページからリンクの貼られた画像ファイルをダウンロードします。使い回しは結構効くんじゃないのかな?

  1. 画像を集めるディレクトリを作る
  2. 画像ファイルのリストを作る(テスト)
  3. 画像ファイルをダウンロードする

1. 画像を集めるディレクトリ (Otogiri) を作る

$ mkdir Otogiri

作っただけじゃワンライナーを実行してもディレクトリーに保存できないので

$ cd Otorigi

する

2. 正しく画像ファイル(.jpg)がリストにできるかテスト

$ perl -MLWP::Simple -e '$,="\n"; print map{ "$ARGV[0]$_" }get($ARGV[0]) =~ m|<a.*?href="([^"]+\.jpg)"|gi;' http://redsky.sakura.ne.jp/

3. 画像ファイルをダウンロードする

$ perl -MLWP::Simple -MFile::Basename -we 'map{$_="$ARGV[0]$_";mirror($_,basename($_))}get($ARGV[0]) =~ m|<a.*?href="([^"]+\.jpg)"|gi;' http://redsky.sakura.ne.jp/

で画像を集める

スクリプト(dl.pl)にするとこう。

#!/usr/bin/perl -w
use strict;
use LWP::Simple;
use File::Basename;

@ARGV == 1 or die "Usage:$0 URL\n";

my $content = get shift; # get $ARGV[0];
@list = $content =~ m|<a.*?href="([^"]+\.jpg)"|gi;

# 正規表現が正しいかチェックする段階で使う
#{
#   $, = "\n";
#   print @list,"\n";
#}

map{ $_ = "$ARGV[0]$_"; mirror($_,basename($_)) }@list;

exit 0;

実行するときは

$ perl dl.pl http://redsky.sakura.ne.jp
トラックバック - http://perl.g.hatena.ne.jp/ishiduca/20090503