傀儡師の館.Python

傀儡師の館.Python

PR

×

Calendar

Keyword Search

▼キーワード検索

Archives

2026.06
2026.05
2026.04
2026.03
2026.02
2026.01
2025.12
2025.11
2025.10
2025.09

Profile

kugutsushi

kugutsushi

Free Space

設定されていません。
2008.05.24
XML
カテゴリ: 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 からデータを利用できるようにしてくれるライブラリ。けっこう頻繁にあちこちで使われている。



作りとして 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 を使わなければ、



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

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




なかのひと






お気に入りの記事を「いいね!」で応援しよう

Last updated  2008.05.25 00:10:42 コメントを書く


【毎日開催】
15記事にいいね!で1ポイント
10秒滞在
いいね! -- / --
おめでとうございます!
ミッションを達成しました。
※「ポイントを獲得する」ボタンを押すと広告が表示されます。
x
X

© Rakuten Group, Inc.
X
Design a Mobile Site
スマートフォン版を閲覧 | PC版を閲覧
Share by: