おいちゃんと呼ばれています

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

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

なんか Perlスクレイピングする記事が話題になっているようでして。 -簡単!たった13行のコードでHTML取得&解析をするPerlスクリプト - DQNEO起業日記 簡単!たった13行のコードでHTML取得&解析をするPerlスクリプト - DQNEO起業日記

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

**本日の教材 ただ、短く○○行で書くとかは得意分野ではないので、おたのしみ画像を手に入れる方向にもっていってみました。次のサイトを教材に。 -なんでもちゃんねる : 胸がきゅんとする女の子の画像 - ライブドアブログ

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

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

|perl|

! /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 の解説については、次の記事がわかりやすいかと思います。 -use Web::Scraper; - 今日のCPANモジュール

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

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

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

|perl| 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

**このエントリーのつづき -下心で覚えるエッチな Perl - 若妻サイト「舞ワイフ」をスクレイピングしてみた 下心で覚えるエッチな Perl - 若妻サイト「舞ワイフ」をスクレイピングしてみた - 彼女からは、おいちゃんと呼ばれています

**関連エントリー 実は、前にも同じようなエントリーを書きました。画像だけを較べたら、個人的にはこっち(↓)のほうが好きかなと。 -とんでもない美少女ソムリエが現れたので、Web::Scraper で萌え画像をぶっこ抜いてみる とんでもない美少女ソムリエが現れたので、Web::Scraper で萌え画像をぶっこ抜いてみる - 彼女からは、おいちゃんと呼ばれています