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

2010-04-10

[][Web::Scraper][Webスクレイピング]pixivのお気に入りリストを抽出するスクリプトを直した 22:41 [Web::Scraper][Webスクレイピング]pixivのお気に入りリストを抽出するスクリプトを直した - ishiducaの日記 を含むブックマーク はてなブックマーク - [Web::Scraper][Webスクレイピング]pixivのお気に入りリストを抽出するスクリプトを直した - ishiducaの日記 [Web::Scraper][Webスクレイピング]pixivのお気に入りリストを抽出するスクリプトを直した - ishiducaの日記 のブックマークコメント

WWW::Mechanizeを使ってpixivへログインして、ごにょごにょする」がうまく作動してなかったようなので直した。変わったといっても

  • 文字コードが euc_jp から utf-8 になってた
  • ログイン時の引数に mode が追加されていた

くらいだけど。

pixiv2pl

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

my $enc_utf8 = find_encoding('utf-8');

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 $scraper = scraper {
    process "#illust_c5", 'lists' => scraper {
        process "li", 'li[]' => scraper {
            process "a",   'link'    => '@href';
            process "img", 'image'   => '@src';
            process "div", 'comment' => 'TEXT';
        };
    };
};

(my $temp =<<"TEMP") =~ tr/\n//d;
<div>
<a href="${home}%%LINK%%">
<img src="%%SRC%%" border="0" /></a>
<div>%%COM%%</div></div>
TEMP
;

if ($ENV{'GATEWAY_INTERFACE'}) {
    require CGI;
    print CGI::header('text/html; charset=utf-8');
}
print <<'HTML';
<!doctype html>
<html>
<head>
<meta charset='utf-8' />
<title>pixiv::myfavorite</title>
<head>
<body>
HTML
;

for (my $i = 1; $i <= 20; $i++) {
    $mech->get("${home}bookmark_new_illust.php?mode=new&p=$i");
    my $res = $scraper->scrape($mech->content);
    for my $li (@{$res->{lists}->{li}}) {
        local $_ = $temp;
        s/%%LINK%%/$li->{link}/;
        s/%%SRC%%/$li->{image}/;
        s/%%COM%%/$li->{comment}/;
        print $enc_utf8->encode("$_\n");
    }
}
print qq(<body>\n</html>\n);

exit 0;

なんかCGI.pm使うのかったるかったので、html部分は手書きにしたけど、最近は別のモジュール使う方がいいのかしらん?

ついでなかんじがあるけど、Web::Scraper 初めて使ってみました。Xpathとか分からんので苦労したな〜。あ、あとリファレンスを多少でも理解してないと難しいのが分かったぞ

参照

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

2009-05-31

[][WWW::Mechanize][Webスクレイピング]WWW::Mechanizeを使ってpixivへログインして、ごにょごにょする 21:39 [WWW::Mechanize][Webスクレイピング]WWW::Mechanizeを使ってpixivへログインして、ごにょごにょする - ishiducaの日記 を含むブックマーク はてなブックマーク - [WWW::Mechanize][Webスクレイピング]WWW::Mechanizeを使ってpixivへログインして、ごにょごにょする - ishiducaの日記 [WWW::Mechanize][Webスクレイピング]WWW::Mechanizeを使ってpixivへログインして、ごにょごにょする - ishiducaの日記 のブックマークコメント

WWW::Mechanize を使ってpixiv(SNS)にログイン-> 「お気に入りユーザー新着イラスト」のページ(1~10頁)のデータを抜き出してリストにする

#!/usr/bin/perl
use strict;
use warnings;
use encoding 'euc-jp', STDOUT => 'utf-8';
use WWW::Mechanize;

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

my $uri  = 'http://www.pixiv.net/';
$mech->get($uri);

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

(my $reg =<<'REG') =~ tr/\n//d;
<a href="(member_illust\.php\?mode=medium&illust_id=[0-9]{7})">
<img src="([^"]+)" border="0" /></a><br />
<div class="pdgTop5">([^<]+)</div>
REG
;

if( $ENV{GATEWAY_INTERFACE} ){
    require CGI;
    print CGI::header('text/plain; charset=utf-8');
}
foreach my $c (1..10){
    $mech->get("http://www.pixiv.net/bookmark_new_illust.php?mode=new&p=$c");
    my $html = $mech->content;
    while( $html =~ /$reg/gis ){
        my $page = "${uri}$1";
        print join("\t", $3, $2, $page), "\n";
    }
}

exit 0;

本当なら Web::Scraper を使えばいいんだろうけど、勉強中なので。

参照

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