2012年10月10日水曜日

マーケットモニタリングアプリの開発(4): ランキングの更新

はじめに

おはようございます。当ブログにアクセス頂き、ありがとうございます。
バイト先のレストランからビールを一箱もらってご機嫌の、たなけんです。
本エントリでは、モニタリング対象のランキングの更新について記載します。

ランキング更新の必要性と処理の流れ

取引が成立した理由を探る為には、出品時のランキングだけではなく、実際に売買が成立した時点のランキングも必要だと考えています。(出品後に人気が出て売れたのかどうかを検証するため)
そこで、モニタリング対象の本については、たとえそれが1200位(一括で取得できる上限)以下であっても、日々のランキングを取得する必要があります。
そこで、下記の流れで、ランキング情報を管理します。

  1. 本日のランキング上位1200を取得
  2. 前日までの累積されたISBN(ISBNマスタに登録済み)と比較
  3. 本日のランキング上位1200とISBNマスタとの差分を取得
  4. ISBNマスタに存在せず、本日のランキング上位1200に入ったものは、ISBNマスタに追加
  5. 本日のランキング上位1200に存在しないが、ISBNマスタに存在するものは、個別にランクを取得する


ソースコードと解説

ソースコードは下記の通りです。
(defn get-new-isbn-list
""
[date-str]
(for [line (select-from-h2 (str "SELECT ISBN FROM USED_RANK WHERE DATE = '" (str (crc/to-sql-date (fmt/parse (fmt/formatters :basic-date) date-str))) "' MINUS SELECT ISBN FROM M_ISBN;"))]
(merge {:date (crc/to-sql-date (time/now))} line)))
(defn ins-m-isbn-list
""
[isbn-list]
(jdbc/with-connection h2
(jdbc/transaction
(apply jdbc/insert-records :M_ISBN isbn-list))))
(defn add-new-isbn-list
""
[date-str]
(ins-m-isbn-list (get-new-isbn-list date-str)))
(defn create-tbl-m-isbn
""
[]
(jdbc/with-connection h2
(jdbc/transaction
(jdbc/create-table
:M_ISBN
[:date "DATE"]
[:isbn "VARCHAR(13)"]
))))
(defn get-obs-isbn-list
""
[date-str]
(for [line (select-from-h2 (str "SELECT ISBN FROM M_ISBN MINUS SELECT ISBN FROM USED_RANK WHERE DATE = '" (str (crc/to-sql-date (fmt/parse (fmt/formatters :basic-date) date-str))) "';"))]
line))
(defn create-item-info-url
""
[isbn]
(str "http://www.amazon.co.jp/dp/" isbn))
(defn extract-rank
""
[isbn]
(try
(let [rank-entry (nth (:content (first (html/select (url-to-resource (create-item-info-url isbn) {:as "Shift_JIS"}) [:li#SalesRank]))) 2)]
(if (nil? rank-entry) {:isbn isbn :rank -1}
{:isbn isbn
:rank (try
(Integer/parseInt
(string/replace
(second (re-find #"([\d\,]+)位" rank-entry))
"," ""))
(catch Exception _))}))
(catch Exception e
(println e))))
(defn update-used-rank-list
[date-str]
(ins-used-rank-list
(map #(merge {:date (crc/to-sql-date (time/now))}%) (for [line (get-obs-isbn-list date-str)] (extract-rank (:isbn line))))))
view raw core.clj hosted with ❤ by GitHub

ランキングは商品詳細ページに含まれるため、まずは商品詳細ページにアクセスします。(詳細ページのurlはhttp://www.amazon.co.jp/dp/商品コード(ISBN))順位を含むタグから値を取得、また順位が含まれない場合はnilを設定します。ただし、18禁のコンテンツは直接商品詳細ページにアクセス出来ないため、仮置として-1を設定しています。
技術的には特に新規要素は無く、ただenliveを用いて必要な情報を取得しているだけです。
取得した情報はRDBMSのランキングテーブルに追加されます。

今日の作業は以上。最後までお読み頂き、ありがとうございました。
たなけん(作業時間1時間)

0 件のコメント:

コメントを投稿