Webページから一定の大きさ以上のJPEG画像ファイルをダウンロードする
ビッグデータの時代に
情報が氾濫するこの時代に真に意味のある情報とは何でしょうか。 価値観は人それぞれでしょうが、さしあたりここでは「150キロバイト以上のサイズのJPGイメージファイル」こそ 有意な情報であるという前提とします。
目標
対象とするWebページから有意な情報のみを取り出すことが目標です。 やりたいことは、
- 目的のWebページ(HTML文書)をとってきて
- 該当ページ内のIMGタグのSRC属性およびAタグのHREF属性に記されたJPEG画像のURLを取得し
- サイズが規定値以上ならダウンロードする
となります。
前半
LWP::UserAgentで対象文書の取得を行い、解析はHTML::TreeBuilderで行います。
use HTML::TreeBuilder; use LWP::UserAgent; use URI; # (略) my $target_url = URI->new("http://sanzierogazo.blog129.fc2.com/blog-entry-1489.html"); my $ua = LWP::UserAgent->new(); my $r = $ua->get($target_url); die "Request failed :$!" unless $r->is_success; my $t = HTML::TreeBuilder->new; $t -> parse( $r->decoded_content); $t -> eof(); foreach my $i ($t->find("img") ) { &get_photo($i->attr('src')); } foreach my $a ($t->find("a") ) { &get_photo($a->attr('href')); } $t->delete;
後半
画像のダウンロード部分は再びLWP::UserAgentを使って以下のように書きました。
sub get_photo { my $img = shift; return if not defined $img; my $media_url = URI->new_abs($img, $target_url); return if not $media_url =~ /\.jpg$/; my $res = $ua->head($media_url); return if $res->header("content-length") < 150000; my $filename = $media_url; $filename =~ s/\/+/_/g; $filename = $savedir.$filename; return if -f $filename; $res = $ua->get($media_url, ':content_file' => $filename); }
参考文献
スクリプトを書くにあたっての参考としては 「Perl & LWP」 という書籍が今ではオンラインでフリーに読むことができます。 特にChapter 9のあたり。
さらに直接的には日本人の先人の知恵の ブログ記事 が簡潔で、参考にさせていただきました。