Google App Engine Python:スケジュール、キャッシュ、テンプレートによる効率的更新(2)。- memcache

前回は、スクリプトを指定した時間に起動できるスケジュール・タスクを実現するための「cron.yaml」の記述方法について説明した。今回は、そのスケジュールにしたがって実行されるスクリプトで、外部から取得したデータを加工したうえで、キャッシュに保存する方法について説明しよう。

外部から取得するデータには、前々回の「Python:xml.etree.ElementTree, 外部 RDF。」の記事で用いた goo のランキングRDFを今回もサンプルとする。

まず、サンプルとして「daily.py」のソースコードを紹介する。

def updateKeywords():
  from google.appengine.api import urlfetch
  from google.appengine.api import memcache
  import xml.etree.cElementTree as etree

  url='http://ranking.goo.ne.jp/rss/keyword/keyrank_all1/index.rdf'
  xml=urlfetch.fetch(url).content
  rootTree=etree.fromstring(xml)
  titles = rootTree.findall('.//{http://purl.org/rss/1.0/}title')

  if titles:
     frg = '<ul>'
     n=0
     for i in titles:
         if n>0:
            frg += '<li>'+item+ '</li>'
         n=n+1; 
     frg += '</ul>'

     memcache.set("gooRanking",frg)

if __name__ == "__main__":
  updateKeyword()

ここで、updateKeyword()関数を定義しているのは、別のスクリプトでインポートして、この関数を利用できるようにするためである。キャッシュは、何らかの事情で失われる危険性があるので、それに備えて、キャッシュが取得できない場合には、このupdateKeyword()関数を実行できるようにしておく。

cron.yaml で指定した時刻には、このスクリプトファイルが実行される。
その場合には、「if __name__ == "__main__":」の記述にしたがって、updateKeyword() が実行される。

インポートするモジュール

インポートするのは、次の3つのモジュール。
from google.appengine.api import urlfetch

 外部ファイルをフェッチするため。
from google.appengine.api import memcache
   memcache を利用するため。

import xml.etree.cElementTree as etree

   XML からデータを取得するため。

XMLからのデータの取得

これについては、前々回の「Python:xml.etree.ElementTree, 外部 RDF。」の記事で書いた通りである。

HTML断片の生成

取得した title を HTML のリストとした。
なお「n>1:」として、最初の title を排除しているのは、最初の title が channel 要素の title だからだ。キーワード自体は、item 要素内の title なので、最初の title は除いた。

memcache への保存

ご覧の通り、memcache.set()で、キーと値を指定するだけ。
これで、memcache にデータが保存される。

memcache からのデータの取得については、次回触れる。