エンジニアリングとお金の話

都内で働くエンジニアの日記です。投資と技術の話題がメインです。

【技術】楽天のランキングサイトを作ってみた

【SPONSORED LINK】

以前、楽天市場の全てのジャンルを全て取得する事に成功したが、そのデータを用いてランキングサイトを作成する事にした。
(以前の記事はこちら:【技術】楽天の全てのジャンルを取得してみた - はたけアーカイブ

どの様なサイトかと言うと、楽天市場のジャンル毎ランキングを毎日確認し、ある一定期間(例:10日間、100日間等)ランキングの上位に入っている商品を取り上げて紹介するサイトである。各ジャンル毎にサイトを立ち上げる予定であり、現在10サイト程立ち上げた。最終的には300サイト程立ち上げる予定である。

ちなみに、作成したサイトはこんな感じである。
失敗しない為の定番アイテム紹介 DVD編

当サイトを作成するにあたり、以下の手順にて開発を行った。あまりサイトを作成した事が無く、今回色々と勉強になったのでまとめていく。

  1. イメージ図を描く
  2. 開発方針を決める
  3. wordpressのテーマを決める
  4. プログラムを作成する
  5. サイトを公開する

1.イメージ図を描く

サイトを作成するにあたり、まずは大まかなイメージ図を作成する事とした。ちなみにこんな感じである。
f:id:hatakazu93:20120726065005p:plain

2.開発方針を決める

開発を行うにあたり、以下の方針を決めた

・開発言語はpythonにて行う
・ランキングのデータはsqlite3にて保持する
・サイトの作成はwordpressを使用し、xmlrpcにてデータ投稿を行う。

開発言語にpythonを選んだ理由は、xmlrpcとsqlite3を標準でサポートしているからである。また、サイト作成については、あまり開発に時間を掛けたくなかったので、wordpressにて作成を行う事とした。

3.wordpressのテーマを決める

デザインや操作性をポイントにwordpressのテーマを選定した。なお、今回は『itheme2』を使用した。
iTheme2
『itheme2』は、管理画面でフォントの変更やレイアウトの変更を容易に行う事が出来る。細かい部分にまで手が届くので便利である。デザインに自信が無い自分としては、お洒落で操作性が良いテーマを活用する事で弱点をカバーする様にしている。

4.プログラムを作成する

今回の必要な処理は以下の通りである。
・楽天のジャンル毎のランキングを取得する
・取得したランキング情報をDBに格納し、ランキング日数をカウントする
wordpressに投稿する(本文、カテゴリ)

ほぼpythonの標準モジュールのみで開発を行う事が出来た。作成したプログラムはこんな感じである。この作成したプログラムをサーバに配置しcronにて一日1回処理を実施する様にした。

#-*- coding:utf-8 -*-
import urllib
import json
import sqlite3
import os
import xmlrpclib
import datetime
import ConfigParser
from pit import Pit

url="http://api.rakuten.co.jp/rws/3.0/json?developerId=%s&affiliateId=%s&operation=ItemRanking&version=2010-08-05&genreId=%s"
con1=ConfigParser.SafeConfigParser()
con1.read(os.path.join(os.path.dirname(__file__),"genreid.ini"))
con2=ConfigParser.SafeConfigParser()
con2.read(os.path.join(os.path.dirname(__file__),"posturl.ini"))
userconf=Pit.get("userconf")

def main():
    for topGenre in con1.sections():
        for subGenre in con1.options(topGenre):
            for rankHash in rankDataGet(subGenre):
                itemCount=itemCountGet(rankHash)              
                if itemCount:
                    itemCountAdd = itemCount[0] + 1
                    blogPostDiscern(con1.get(topGenre,subGenre),rankHash,itemCountAdd,topGenre)
                    rankDataUpdate(rankHash,itemCountAdd)
                else:
                    rankDataInsert(rankHash)

def rankDataGet(subGenre):
    pyjson=json.loads(urllib.urlopen(url % (userconf["rakuten_dev"],userconf["rakuten_af"],subGenre)).read().decode("utf_8","ignore"))
    return pyjson["Body"]["ItemRanking"]["Items"]["Item"]

def itemCountGet(rankHash):
    con=sqlite3.connect(os.path.join(os.path.dirname(__file__),"ranking.db"))
    cur=con.execute("select itemcount from ranking where itemcode = %s" % rankHash["itemCode"].split(":")[1])
    itemcount=cur.fetchone()
    return itemcount

def rankDataInsert(rankHash):
    con=sqlite3.connect(os.path.join(os.path.dirname(__file__),"ranking.db"))
    con.execute("insert into ranking(itemcode,itemcount) values(%s,%d)" % (rankHash["itemCode"].split(":")[1],1))
    con.commit()
    con.close()

def rankDataUpdate(rankHash,itemCount):
    con=sqlite3.connect(os.path.join(os.path.dirname(__file__),"ranking.db"))
    con.execute("update ranking set itemcount = '%d' where itemcode = '%s'" % (itemCount,rankHash["itemCode"].split(":")[1].encode("utf_8","ignore")))
    con.commit()
    con.close()

def blogPostDiscern(genreName,rankHash,itemCount,topGenre):
    if itemCount in [10,20,30,40,50,60,70,80,90,100,200,300,400,500]:
        categoryArray=blogCategoryCreate(genreName,itemCount,topGenre)
        blogNewPost(categoryArray,rankHash,itemCount,topGenre)

def blogNewPost(categoryArray,rankHash,itemCount,topGenre):
    server_url="%s/xmlrpc.php" % con2.get("posturl",topGenre)
    blog_id="myblog"
    username=userconf["login"]
    password=userconf["passwd"]
    server=xmlrpclib.ServerProxy(server_url)
    entry_id=server.metaWeblog.newPost( 
            blog_id, 
            username, 
            password, { 
                'title':rankHash["itemName"].encode("utf_8","ignore"), 
                'description':postDataCreate(rankHash,itemCount),
                'categories':categoryArray
            },xmlrpclib.True
    )
    return entry_id

def postDataCreate(rankHash,itemCount):
    postdata="""
                <a href='%s' target='_blank'><img src ='%s' border='0'></a></br>
                %s日間ランクイン!!</br>
                レビュー平均:%s点</br>
                商品価格  :%s円</br>
                <a href="%s">詳細はこちらをクリック</a>
             """
    return postdata % (rankHash["affiliateUrl"].encode("utf_8","ignore"),rankHash["mediumImageUrl"].encode("utf_8","ignore"),itemCount,rankHash["reviewAverage"],rankHash["itemPrice"],rankHash["affiliateUrl"].encode("utf_8","ignore"))

def blogCategoryCreate(*categories):
    categoryArray=[]
    server_url="%s/xmlrpc.php" % con2.get("posturl",categories[2])
    blog_id="myblog"
    username=userconf["login"]
    password=userconf["passwd"]
    server=xmlrpclib.ServerProxy(server_url)
    for count,category in enumerate(categories[:-1]):
        name = category if count==0 else "%s日間ランクイン" % category
        categoryArray.append(name)
        try:
            entry_id=server.wp.newTerm(
                blog_id,
                username,
                password,{
                    'name':name,
                    'taxonomy':'category',
                }
            )
        except:
            pass
    return categoryArray

if __name__ == '__main__':
    main()

4.サイトを公開する

レンタルサーバwordpressをインストールし、独自ドメインを設定しサイトを公開した。なお、レンタルサーバにはさくらインターネットを使用し、ドメイン取得はお名前.comを使用した。取得したドメインを『WordPress アドレス』、『サイトアドレス』に設定すれば公開完了である。
f:id:hatakazu93:20120726073033p:plain

開発に掛かった時間だが、構想に2日間、wordpressのテーマ選定に1週間、プログラムの開発に3日間と言った感じである。今回色々なwordpressの無料テーマを探したがその中でも『itheme2』は飛び抜けて操作性が良かった。本当に痒い所に手が届く感じである。今回の開発で、pythonwordpressについて色々と詳しくなったので、次の開発に繋げる様にして行きたい。