COBOL技術者の憂鬱

COBOLプログラマは不在にしています

映画タイトルを定期的に取得する

今週からMovitterの開発に着手しました。
まず、とっかかりは以下の部分ですね。

国内で公開されている映画の一覧を閲覧できるサイトから、定期的に映画タイトルを取得し、結果をデータベースに格納するプログラムを作成し、CRONで回す。


これを3時間ほどかけてさくっと作ってみました。
開発言語にはpythonを、稼働プラットフォームとしてGAEを使用しています。
ソースコードは以下の通りです。とてもコンパクトにまとめることができたと思います。



【get_movie_title.py】

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from google.appengine.ext import db
from google.appengine.api import urlfetch
import re

class Movies(db.Model):
  title = db.StringProperty()
  create_time = db.DateTimeProperty(auto_now_add=True)
  update_time = db.DateTimeProperty(auto_now=True)
  check_time = db.DateTimeProperty()
  tweet_count = db.IntegerProperty()
  score = db.IntegerProperty()

result = urlfetch.fetch('http://movie.nifty.com/cs/movie/list/1.htm')
if result.status_code == 200:
  pattern = re.compile(r'<span class="item"><a href="(.*?)">(.*?)</a>')
  movie_titles = pattern.findall(result.content)
  for movie_title in movie_titles:
    movie_title_u = unicode(movie_title[1],'Shift_JIS')
    query = Movies.gql('WHERE title = :title',title=movie_title_u)
    movie = query.get()
    if not movie:
      movie = Movies()
      movie.title = movie_title_u
    movie.put()

pythonというよりは、GAE特有の機能をフル活用しているので、GAEを全く触ったことのない方には違和感ありまくりだと思います。
簡単に解説してみると…


まず初めに、GAEのデータストアとurlfetchの機能を利用する為に、ライブラリを呼び出しています。
あと、正規表現も使用するのでそのライブラリも宣言しています。

次に、データストア上で使用するMoviesというテーブルを定義しています。
ここで定義している項目は以下の通りです。


title:取得した映画のタイトルが入ります
create_time:タイトルを最初に登録した日付が入ります
update_time:タイトルを取得する度に、ここの日付が更新されます
check_time:後続のプログラムにて、TwitterSearchAPIを呼び出した際に、ここの日付が更新されます
tweet_count:その映画に関する「つぶやき数」をカウントしておいて、保存します
score:その映画に関する評判を保存します。計算方法をどうするかはまだ決めていません。とりあえず暫定で定義しておきます。


そして、さらにその後ろで、映画タイトルを取得する処理を記述しています。
具体的には、このサイトのhtmlを取得し、映画タイトルが記述されている箇所を正規表現で全て抜き出し、Moviesテーブルへ登録しています。
Moviesテーブル登録前に、既にその映画が登録されているかどうかの確認を行い、登録されている場合はupdate_timeだけが更新されるようになっています。



あとは、これをGAE環境で動かすための設定ファイルを書くだけです。
以下の二つです。



【app.yaml

application: movitter
version: 1
runtime: python
api_version: 1

handlers:
- url: /get_movie_title
  script: get_movie_title.py
  login: admin

【cron.yaml

cron:
- description: get_movie_title
  url: /get_movie_title
  schedule: every 24 hours

app.yamlの中では、今回作成したプログラムを/get_movie_titleというurlから管理者権限で実行できるように設定しています。
そして、そのurlを24時間ごとに参照するようにcron.yamlを記述しています。



うーん、いいですね、イージーですね。
次回以降もこの調子で、さくさくっと作っていこうと思います。