週末には少しPerlを。

Perlスクリプトの学習日記です。

Webページから一定の大きさ以上のJPEG画像ファイルをダウンロードする

ビッグデータの時代に

情報が氾濫するこの時代に真に意味のある情報とは何でしょうか。 価値観は人それぞれでしょうが、さしあたりここでは「150キロバイト以上のサイズのJPGイメージファイル」こそ 有意な情報であるという前提とします。

目標

対象とするWebページから有意な情報のみを取り出すことが目標です。 やりたいことは、

  1. 目的のWebページ(HTML文書)をとってきて
  2. 該当ページ内のIMGタグのSRC属性およびAタグのHREF属性に記されたJPEG画像のURLを取得し
  3. サイズが規定値以上ならダウンロードする

となります。

前半

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のあたり。

さらに直接的には日本人の先人の知恵の ブログ記事 が簡潔で、参考にさせていただきました。