Subscribed unsubscribe Subscribe Subscribe

アジア美人のか〜わいいポーズの画像をひたすら集めまくってみるワンライナー

Perl OneLiner

これを1行と呼んでいいのかどうか、はともかくとして。

perl -MWeb::Scraper -MURI -le'do{map{print}@{($r=scraper{process"#home_left img","i[]","\@src";process"span.pages",p,TEXT}->scrape(URI->new("http://asianposes.com/category/pose/".($n?"page/$n/":""))))->{i}}}while$r->{p}=~/(\d+) of (\d+)/&&($n=$1+1)<=$2'|wget


突然そそのかされたので。
SATO Yozo on Twitter: ""【速報】ものすごい勢いで@sugyanがワンライナーを書き始めたようです。" - アジア美人のか~わいいポーズをひたすら集めまくっているブログw『Asian Poses』 - IDEA*IDEA ~... http://tumblr.com/xwc21r7os"


ターゲットはこちら。
Asian Poses
IDEA*IDEAでも紹介されていて、ご存知の方も多いかと。
アジア美人のか~わいいポーズをひたすら集めまくっているブログw『Asian Poses』 | IDEA*IDEA


ホームから辿ると色々な記事が混じっていて邪魔なので、"pose"カテゴリに目標を定める。
http://asianposes.com/category/pose/
htmlからimgタグを正規表現で抜くことも考えたけど、そうするとお目当てとなる画像以外も余計に取れてしまう。

ということで初めてWeb::Scraperを使ってみた。
色々試してみながら、まずは出来るだけ丁寧にPerlスクリプトを。

#!/opt/local/bin/perl
use strict;
use warnings;

use Web::Scraper;
use URI;

# 取得する要素
my $scraper = scraper {
    process '#home_left img',
      'images[]' => '@src';
    process 'span.pages',
      'page' => 'TEXT';
};

# 取得先URI
my $base_uri = 'http://asianposes.com/category/pose/';
my $uri = URI->new($base_uri);

PAGE:
while (1) {
    # スクレイピング
    my $result = $scraper->scrape($uri);

    # 取得した画像URIを出力
    for my $image (@{$result->{images}}) {
        print "$image\n";
    }

    # ページの判定
    my ($current, $total);
    if ($result->{page} =~ m{(\d+) \s* of \s* (\d+)}xms) {
        ($current, $total) = ($1, $2);
    }
    # 最終ページだったら終了
    last PAGE if ($current == $total);

    # 次のページを探しに行く
    $uri = URI->new($base_uri . 'page/' . ($current + 1) . '/');
}


これを実行すれば、アジア美人のか〜わいいポーズの画像URIを取得できる。

$ ./asian.pl
http://asianposes.com/img/posts/okay%20seo%20you%20jin.jpg
http://asianposes.com/wp-content/uploads/2009/06/okay-chinese-model-01-160x224.jpg
http://asianposes.com/wp-content/uploads/2009/06/okay-gu-ji-sung-01-160x224.jpg
http://asianposes.com/wp-content/uploads/2009/06/okay-moko-chilli-01-160x224.jpg
http://asianposes.com/wp-content/uploads/2009/06/okay-seo-you-jin-01-160x224.jpg
...

あとはその出力を使って、好きなように保存すればよいのでは、と。

$ ./asian.pl | xargs wget


このスクリプトを頑張って縮めた結果が冒頭のワンライナー。さすがに苦しいかw


初めて使ってみた、Web::Scraperは最初は何が何だかサッパリ分からなかったけど、使用例とかググりながら色々試してみてようやく雰囲気が掴めた気がする。
scraper{}内で"result"ってどういうときに使うんだろう?そのあたりは結局よく分からなかった。
もうちょっと色んなところをスクレイピングしながら練習してみようかな…。