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