読者です 読者をやめる 読者になる 読者になる

彼女からは、おいちゃんと呼ばれています

ウェブ技術や日々考えたことなどを綴っていきます

Perl が覚えられて胸もキュンとなるコードを書いてみた

Perl 画像

なんか Perlスクレイピングする記事が話題になっているようでして。


このブログの著者の人、いいな。と思う、ほんとに。僕も素直でありたいな、と。で、ちょっと遅くなってしまいましたが、便乗してみます。

本日の教材

ただ、短く○○行で書くとかは得意分野ではないので、おたのしみ画像を手に入れる方向にもっていってみました。次のサイトを教材に。


好みが合わなければ、サンプルコードの URL のところだけ変えてもらっても構いませんし。

サンプルコード

下記のコードで胸キュン画像を GET できます。

#! /usr/bin/perl

use strict;
use warnings;

use Web::Scraper;
use URI;
use LWP::Simple qw/mirror/;
use File::Basename qw/basename/;

# なんでもちゃんねる : 胸がきゅんとする女の子の画像 - ライブドアブログ
my $url = URI->new('http://blog.livedoor.jp/taison1224/archives/1369203.html');

# 全リンクを取得してから後で必要な分を抜き出すよりも、
# はじめから必要なリンクだけ取得するほうがスマートではないかと
my $scraper = scraper {
    process 'a[href=~/\.jpe?g$/]', 'urls[]' => '@href';

    # result でキー名を指定しておくと、ハッシュではなくそのものが返ってくる
    result 'urls';
};

# リファレンスには _ref サフィックスを付けておいたほうが良いと
# オライリー『Perl ベストプラクティス』にも書いていたし
my $results_ref = $scraper->scrape($url);

foreach my $link (@{$results_ref}) {
    my $filename = basename($link);

    # あらかじめ「MuneKyun」フォルダを作っておく
    mirror($link, './MuneKyun/' .$filename);

    # サーバに負荷をかけすぎないように
    sleep 1;
};

print "ダウンロードが完了しました\n";

解説

Web::Scraper の解説については、次の記事がわかりやすいかと思います。


1点だけ自前で解説を加えるとしたら、ここ(↓)のところ。

my $scraper = scraper {
    process 'a[href=~/\.jpe?g$/]', 'urls[]' => '@href';
    result 'urls';
};


これを、下記のように全リンクを取得してから条件分岐するよりも、はじめから必要なリンクだけ取得しておけばよいのではないか、と。

my $scraper = scraper {
    process 'a', 'urls[]' => '@href';
    result 'urls';
};

my $results_ref = $scraper->scrape($url);

foreach my $link (@{$results_ref}) {
    if ($link=~/\.jpe?g$/) {
        my $filename = basename($link);
        mirror($link, './Pictures/100610MuneKyun/' .$filename);
        sleep 1;
    }
};


あと、コードレイアウトや変数名等については、オライリーの『Perl ベストプラクティス』にしたがってみました。

Perlベストプラクティス

Perlベストプラクティス

おわりに

サンプルコードをご覧になって分かるように、短いスクレイピングのコードでも、その中にループやら正規表現やらリファレンスやら様々な要素が入っています。


分からないところを調べながら、サンプルコードを自分なりにアレンジしていったら、そーとー勉強になるはず。と思って紹介してみました。サーバに負荷をかけすぎないよう気をつけつつ、いろいろと試してみてください。


ではでは。


参考書籍

Spidering hacks―ウェブ情報ラクラク取得テクニック101選

Spidering hacks―ウェブ情報ラクラク取得テクニック101選


スクレイピングの作法から何から一通り載っています。ただ少し古い本なので、Web::Scraper については触れられていません。

参考サイト

そもそも Web::Scraper の位置づけがわからないっていうか、LWP やら HTML::TreeBuilder やら、どこがどう繋がっているんじゃい!って方には次のサイトがオススメです。系譜図がわかりやすくて感動した。


PerlのWebクライアントライブラリ - Vox

関連エントリー

実は、前にも同じようなエントリーを書きました。画像だけを較べたら、個人的にはこっち(↓)のほうが好きかなと。