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が返されました。