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

Perlでキャッシュファイルを扱ってみた

Perlでのキャッシュファイルを扱うメモ。
WebAPIやスクレイピングしたりと、毎回それにアクセスするよりもキャッシュファイルにアクセスするほうが当然パフォーマンスはよくなります。

ということで今回はファイル(ディスク)キャッシュにアクセスする方法を試してみました。


CPANモジュールは、Cache::FileCache です。

Cache::FileCache - search.cpan.org


使い方は、newの際にオプションで、cache_root(保存先ディレクトリ)、name_space(cache_rootのサブディレクトリ名)、default_expires_in(保存期間)を指定します。

use Cache::FileCache;

my $cache = Cache::FileCache->new({
  cache_root => '/tmp',
  name_space => 'test',
  default_expires_in => 1h, # 1hとすると1時間
});

my $uri = 'http://yahoo.co.jp/';
my $data = $cache->get($uri); # getでデータ取得


getでデータを取得すると、以下のようにキャッシュファイルが作成されます。

/tmp/test/0/d/9/0d93d44d69589fe18ec48c437ff3eb100df73f38


これを踏まえて、Amazonのベストセラーページからスクレイピングする処理を書いてみました。

  • キャッシュファイルがあれば、キャッシュファイルを見にいく
  • キャッシュファイルがなければ、LWP::Simple::getでページ情報を取得する
#!/usr/bin/env perl

use strict;
use warnings;
use utf8;
use Encode;
use Web::Scraper;
use Cache::FileCache;
use LWP::Simple;

my $cache = Cache::FileCache->new({
  cache_root => '/tmp',
  namespace => 'test',
  default_expires_in  => '1h',
});

my $uri = 'http://www.amazon.co.jp/gp/new-releases/books';
my $data = $cache->get($uri);

my $scraper = scraper {
  process 'div.zg_itemInfo div.zg_title', 'btitles[]' => 'TEXT';
};

if (defined($data)){
  my $res = $scraper->scrape($data);
  for (@{ $res->{btitles} }){
    print encode_utf8($_). "\n";
  }
} else {
  my $content = get($uri);
  $cache->set($uri, $content);
  $cache->Purge();
}

車輪の再発明はするなといわれたりするけど、既にあるものでも自分なりに書いてみることがコード力アップにつながるかなとおもう。
Rubyもいいけど、Perl書くのやっぱり楽しいよ(・∀・)


環境

MacOS 10.6.8。Linuxは試してないです。
Perl 5.12.3