ブログを作る※無料・簡単アフィリ    ブログトップ | 楽天市場
907706 ランダム
フィードデータのキャッシング (fe… (パソコン・家電)楽天ブログ 【ケータイで見る】 【ログイン】

傀儡師の館.Python
ホーム 日記 プロフィール オークション 掲示板 ブックマーク お買い物一覧

PR

Calendar

November 2011
SMTWTFS
  12345
6789101112
13141516171819
20212223242526
27282930   
<一覧へthis monthnext>

Keyword Search

Category

Archives

Mobile

>>ケータイに
このブログの
URLを送信!

 

傀儡師の日記

<< 前へ次へ >>一覧コメントを書く

2008.05.24 楽天プロフィール Add to Google XML

フィードデータのキャッシング (feedparser + feedcache) プログラミング言語 Python を使う(199)」
[ Python ]    

Doug Hellmann さんの Caching RSS Feeds With feedcache を読む。この文書は feedcache がどうやって作られたか書かれていて、とてもおもしろい。コンセプトから始まって UnitTest の話、テスト用の HTTP サーバを作る話、等々、順を追って書かれているので Python でちょっとしたツールを作るときのとってもよい教材になっている。

ちなみに Doug Hellmann さんの、PyMOTW Python Module of the Week は要チェック。とってもよい学習リソースになる。

feedcache Wrapper for the Universal Feed Parser which caches the results は、CastSampler 用に作られたらしい(CastSampler Custom Podcast Feed Aggregato)。CastSampler は、podcast の feed の全部が欲しいわけでなく、実際に購読したいのはその一部のエピソードだけのとき、それを取り出すようなツール。このツールの一部が feedcache として独立したパッケージになっている。

Mark Pilgrimさんの Universal Feed Parser は RSS や Atom の feed をダウンロード、解析して、どちらの feed であっても単一の API からデータを利用できるようにしてくれるライブラリ。けっこう頻繁にあちこちで使われている。

ここで問題なのは、feedparser は feed をキャッシュしていないこと。実行の度にダウンロードが行われる。あまり頻繁にアクセスすると制限がかけられてしまうようなサイトもある。また、購読していないデータを保存すると保存されたデータの大部分が不要なデータになる。よい具合にフィードデータをキャッシュすれば、あちらにとっても、こちらにとっても効率がよいではないかと。

作りとして Cache はメモリを使いたい場合もあるし、ディスク上に格納する何かを使いたい場合もあるだろうし、どちらにでも対応できるように作る必要がある。その点考慮しましょと。当然、キャッシュは生存時間も指定できなきゃダメね。最新のフィードかどうかを確認するのは、ETag と If-Modified-Since を使っている。

永続的なストレージの例では shelve モジュールを使っている。複数のスレッドからのアクセスがあったときにどうなるか明確ではないので、ロックをかけて同時にアクセスできるのは一つのスレッドだけにして壊れないようにする。このあたりのコードは Python 2.6 から正式採用になる With 文を使っているので、__future__ を使って Python 2.5 で動くようにしている。shelve は標準モジュールだからいつでも使えるけど、複数のプロセスがキャッシュを更新するような用途まで考えると、いろいろなバックエンドのストレージを使える L. C. Rees さんの shove を使うとよいのね。

ちなみに、shove を easy_install shove でインストールすると、boto もインストールされた。Amazon S3 等の Amazon Web Servicesを使えるようにするためね。うーん、shove は要チェックだなぁ。ディクショナリ形式のアクセス用のフロントエンドで、バックエンドはいろいろ選べる。キャッシングも対応している。これ試してみるかなぁ。

ちなみに、こういうアプリケーションはシングルスレッドで書くと、ネットワーク経由でフィードをダウンロードするときに、とっても反応が遅いとかあるし、マルチスレッドで複数のサイトにアクセスするように書かないと効率が悪いので、そういう対応もしましょねと。ということで、Python でマルチスレッドのプログラムを書くときの教材にもなっている。

この記事とってもよい記事なので、原文とサンプルを通して見てみるとよいと思う。

で、もって、そういう理屈抜きに feedcache を使うなら、easy_install feedcache でインストールして、

import shelve
import feedcache

url = 'http://api.plaza.rakuten.ne.jp/kugutsushi/rss/'
storage = shelve.open('.feedcache')

try:
fc = cache.Cache(storage)
data = fc.fetch(url)
print data.feed.title
for entry in data.entries:
print '\t', entry.title
finally:
storage.close()

ちなみに feedcache を使わなければ、

import feedparser

url = 'http://api.plaza.rakuten.ne.jp/kugutsushi/rss/'

data = feedparser.parse(url)
print data.feed.title
for entry in data.entries:
print '\t', entry.title

ちょっとだけコードを付け足せば、キャッシュ対応にできるのだから、なかなかいいかもね。

時間を計ってみると、上記の例であれば shelve をオープンクローズする時間で新たなデータを取って来られるぐらいなのでキャッシュしていない方が速い。でも、キャッシュファイルを開いた状態から時間を計れば、キャッシュしている方が速くなる。まあ、それでなければ困るが。沢山のフィードをチェックする場合も同じことになるので有効に使えそう。ちなみに、キャッシュの時間は (timeToLiveSeconds=300) なので、cache.Cache(storage, timeToLiveSeconds=600) とかすると キャッシュの生存時間を10分間に指定できる(デフォルト 5分)。


なかのひと




Last updated  2008.05.25 00:10:42
コメント(0) | コメントを書く





■コメント

お名前
タイトル
メッセージ

画像認証
別の画像を表示
上の画像で表示されている数字を入力して下さい。


※管理者の設定により、スパムコメントを防ぐため、コメント投稿時に画像認証が必要です。

・メッセージ本文は全角で800文字までです。
・書き込みに際しては楽天ブログ規約の禁止事項や免責事項をご確認ください
・ページの設定によっては、プルダウンで「顔選択」を行っても、アイコンが表示されません。ご了承ください。


<< 前へ次へ >>一覧コメントを書く一番上に戻る


Powered By 楽天ブログは国内最大級の無料ブログサービスです。楽天・Infoseekと連動した豊富なコンテンツや簡単アフィリエイト機能、フォトアルバムも使えます。デザインも豊富・簡単カスタマイズが可能!

Copyright (c) 1997-2012 Rakuten, Inc. All Rights Reserved.