映画タイトルを定期的に取得する
今週から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を記述しています。
うーん、いいですね、イージーですね。
次回以降もこの調子で、さくさくっと作っていこうと思います。