はじめに
おはようございます。当ブログにアクセス頂き、ありがとうございます。最近少しずつ体重が減少してきた、たなけんです。
本エントリでは、アマゾンマーケットプレイスに出品されている本の、ランキングの取得について記載します。
ブラウザからアスセス
プログラムからアクセスする前に、まずはブラウザからアクセスしてurlを見てみました。アマゾンのトップ画面から”カテゴリー > 本”を選択し、メニューの詳細をクリック後、条件を入れずに検索すると、左下に状態を選択するリンクが出るので、それをクリックします。さらに右上の並べ替えで『人気度』を選択すると、アマゾンマーケットプレイスに出品されている本のランキングが取得出来ます。さらに下部のリンクから次のページへと移動すると、urlは以下のようなものでした。
http://www.amazon.co.jp/s/ref=sr_pg_2?rh=n%3A465392%2Cp_47%3A2020%2Cp_45%3A0%2Cp_46%3Abefore%2Cp_n_condition-type%3A680579011&page=2&bbn=465392&sort=salesrank&unfiltered=1&ie=UTF8&qid=1349846898このurlをデコードすると、下記のようになります。
http://www.amazon.co.jp/s/ref=sr_pg_2?rh=n:465392,p_47:2020,p_45:0,p_46:before,p_n_condition-type:680579011&page=2&bbn=465392&sort=salesrank&unfiltered=1&ie=UTF8&qid=1349846898このurlからrh=以降のパラメータは検索条件、pageはページ番号、sortは並べ替え順であることが推測できます。
pageパラメータの値を3にしたところ、推測通り3ページ目を読み込むことができました。
プログラムからスクレイピング
上記urlのページを変えてアクセスすることで、1ページから100ページまでプログラムからアクセスすることができることが分かりました。各ページ12冊の本が表示されるため、最大で1200位までの本の取引をモニタすることになります。それでは、ランキングのページからISBNを抽出してみましょう。
ランキングのページのhtmlの構造を解析したところ、div要素の、id=順位 - 1のタグに含まれる事が分かりました。
そこで、スクリプト用ライブラリのenliveを用いて、各ページから順位と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 url-to-resource | |
"" | |
[url opt] | |
(html/html-resource | |
(java.io.StringReader. | |
(org.apache.commons.lang3.StringEscapeUtils/unescapeHtml4 | |
(:body (hc/get url opt)))))) | |
(defn create-used-rank-url | |
"" | |
[page-number] | |
(str "http://www.amazon.co.jp/s/ref=sr_pg_" page-number "?rh=n:465392,p_47:2020,p_45:0,p_46:before,p_n_condition-type:680579011&page=" page-number "&bbn=465392&sort=salesrank&unfiltered=1&ie=UTF8&qid=1349398357")) | |
(defn extract-used-rank | |
":date :isbn :rank" | |
[page-number] | |
(let [source (url-to-resource (create-used-rank-url page-number) {:as "UTF-8"})] | |
(for [i (map #(+ (* 12 (- page-number 1)) %) (range 0 12))] | |
{:date (crc/to-sql-date (time/now)) | |
:isbn (reduce get (first (html/select source [(keyword (str "div#result_" i))])) '(:attrs :name)) :rank (+ 1 i)}))) |
- net.cgrand.enlive-html/html-resource関数: 引数のurlをhtmlとして読み込む
- clj-http.client/get関数: 引数のurlを読み込む。オプション引数は文字コード
- clj-time.coerce/to-sql-date関数: java.sql.Date型に変換
- clj-time.core/now関数: 現在時刻を取得
- net.cgrand.enlive-html/select関数: 指定したタグの値を取得
上記関数で取得したISBNをRDBMSのUSED_RANKテーブル(日付、ISBN、ランキング)に保存し、まずはモニタリング対象となる本を登録することができました。
今回の作業は以上。最後までお読み頂き、ありがとうございました。
たなけん(作業時間1時間)
0 件のコメント:
コメントを投稿