はじめに
おはようございます。当ブログにアクセス頂き、ありがとうございます。バイト先のレストランからビールを一箱もらってご機嫌の、たなけんです。
本エントリでは、モニタリング対象のランキングの更新について記載します。
ランキング更新の必要性と処理の流れ
取引が成立した理由を探る為には、出品時のランキングだけではなく、実際に売買が成立した時点のランキングも必要だと考えています。(出品後に人気が出て売れたのかどうかを検証するため)そこで、モニタリング対象の本については、たとえそれが1200位(一括で取得できる上限)以下であっても、日々のランキングを取得する必要があります。
そこで、下記の流れで、ランキング情報を管理します。
- 本日のランキング上位1200を取得
- 前日までの累積されたISBN(ISBNマスタに登録済み)と比較
- 本日のランキング上位1200とISBNマスタとの差分を取得
- ISBNマスタに存在せず、本日のランキング上位1200に入ったものは、ISBNマスタに追加
- 本日のランキング上位1200に存在しないが、ISBNマスタに存在するものは、個別にランクを取得する
ソースコードと解説
ソースコードは下記の通りです。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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)))))) |
ランキングは商品詳細ページに含まれるため、まずは商品詳細ページにアクセスします。(詳細ページのurlはhttp://www.amazon.co.jp/dp/商品コード(ISBN))順位を含むタグから値を取得、また順位が含まれない場合はnilを設定します。ただし、18禁のコンテンツは直接商品詳細ページにアクセス出来ないため、仮置として-1を設定しています。
技術的には特に新規要素は無く、ただenliveを用いて必要な情報を取得しているだけです。
取得した情報はRDBMSのランキングテーブルに追加されます。
今日の作業は以上。最後までお読み頂き、ありがとうございました。
たなけん(作業時間1時間)
0 件のコメント:
コメントを投稿