Pythonでfeedparserを使ってRSSを読む

簡単にfeedからエントリを取得できます。

import feedparser
rss_url = "http://d.hatena.ne.jp/yuheiomori0718/rss"
feed = feedparser.parse(rss_url)
for e in feed.entries:
    print e.title

実行結果

[python][ruby]pythonで10進数からn進数に基数変換
[python][memo]datetimeをLast-ModifiedやIf-Modified-Sinceの書式に変換
[python]pythonでNクイーン問題
[django][memo]DjangoでアップロードファイルをS3に置くときの設定メモ
[django][memo][snippet]Djangoのunique_together制約のエラーメッセージをカスタマイズする

ただ何も指定しないと、フィードに変更がなくても最新のn件を取得してしまいます。
変更がない場合は304(Not Modified)を返してもらうために、キーワード引数のetagやmodifiedを指定します。

feedparser.parseが返すオブジェクトは、HTTPヘッダに付与されていたetagやlast-modifiedの値を保持していますのでこれを使います。

# http ヘッダのetag
etag = feed.get('etag')
print etag

# http ヘッダのlast-modified
last_modified = feed.get('updated')
print last_modified

#last-modifiedをparseしたもの
updated_parsed = feed.get('updated_parsed')
print updated_parsed

実行結果

None
Thu, 25 Oct 2012 14:26:30 GMT
time.struct_time(tm_year=2012, tm_mon=10, tm_mday=25, tm_hour=14, tm_min=26, tm_sec=30, tm_wday=3, tm_yday=299, tm_isdst=0)

はてなダイアリーrssはetagは返さずlast-modifiedを返すようです。
feed.get('updated_parsed')で、last-modifiedをparseした結果を得ることができます。


取得したupdated_parsedを渡してもう一度feedを取得してみます。

feed = feedparser.parse(rss_url, modified=updated_parsed)
print feed.status
print feed.entries

実行結果

304
[]

ちゃんと304が返されました。