これを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
ターゲットはこちら。
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"ってどういうときに使うんだろう?そのあたりは結局よく分からなかった。
もうちょっと色んなところをスクレイピングしながら練習してみようかな…。