桜ヶ丘日記

技術メモとかとか

Web::Queryでキャッシュ機能を持たせる

開発用に処理内容をちょこちょこ書き換えながらスクレイピングを回しまくると、問い合わせ先のWebサーバーにリクエスト投げまくるんでちょっと迷惑をかけます。
そこでキャッシュを実装してみるんですが一番簡単なのはHTTP::Cache::Transparentです。

手順はこれだけ

  • HTTP::Cache::TransparentをWeb::Queryより後にuseする
  • 実際にWeb::Queryを使う前にHTTP::Cache::Transparentをinitする

実験環境はいつものさくらVPS。

■ 元のコード
さくらVPSでとりあえずWeb::Queryが使えるようにしてみる
http://sakuragaoka.hatenadiary.jp/entry/2013/06/07/201740

■ 参考
http://d.ballade.jp/blog/2008/03/lwpget_1b79.html

■ インストール

$ sudo cpan HTTP::Cache::Transparent

■ 使ってみる

  • BasePath: キャッシュを作る場所
  • NoUpdate: この間(秒)はWebサーバーに再度問い合わせをしない
  • MaxAge: この間(時間)キャッシュファイルを保持する
  • Verbose: 1にすると画面に冗長な出力をする
#!/usr/bin/env perl

use utf8;
use strict;
use warnings;
use Web::Query;
use HTTP::Cache::Transparent;

binmode(STDOUT, ":utf8");

HTTP::Cache::Transparent::init({
	BasePath => '/var/www/XXXXXX/batch/httpcache/wq',
	NoUpdate => 60*60*24*7,	# sec
	MaxAge   => 24*365,		# hour
	Verbose  => 0,
});

wq('http://www.goo-net.com/catalog/')->find('div.box_searchUsedCar ul.line li a')->each(sub{
	$_[1]->each(sub{
		my(undef, $wq) = @_;
		my $name_j = $wq->text();
		my $name = $wq->attr('href');
		$name =~s|^/catalog/(\w+)/index.html$|$1|;
		print qq|$name ($name_j)\n|;
	})
});
exit;

■ 結果
キャッシュ有り無しの違いだけなんで、実行しても改変前のコードと出力は変わらない訳ですがキャッシュが出来てるのは確認出来ます。

$ ls -l /var/www/cardata/batch/httpcache/wq
total 48
-rw-rw-r-- 1 sakuragaoka 49024 Jul 11 13:43 a09f5047f9c2d2e9959587f9ac732c17


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