楽天市場のAPIを活用し、キーワードに当てはまる商品情報をcsvに出力してみました。
活用したのはこちらの「楽天商品検索API」というものです。
楽天ウェブサービス: 楽天商品検索API(version:2017-07-06) | API一覧
開発環境としてJupyter Notebookを利用しました。
大掛かりなツールや定期的に実行したいツール作成時にはまた別のテキストエディタで作っていく必要があるかもしれませんが、ちょっとした単発のツールを作る際には、Jupyter Notebookなら少しずつ試しながらスクリプトが書けるし、即座に実行できるのでとても便利です。
使用するライブラリはrequest
とpandas
。
APIを叩くためにrequest
を使い、取得したデータ操作とcsv出力のためにpandas
を利用しました。
農産物を販売するための価格調査のために行いました。
取得した情報をもとに、さらに分析して意思決定するところまでを想定しています(今回は情報取得するところまで)。
色々な直販サイトはありますが、楽天市場は馴染みがあり商品数も多く、APIも提供されているので取得しやすいなと考えました。
APIを活用するためには、スクリプトを書き始める前にまずは楽天の開発者向けページからアプリを作成してIDを取得しなければいけません。
こちらのRakuten Developersのサイト
楽天ウェブサービス: API一覧
右上の「+アプリID発行」からアプリを作成しておきます。ここで取得したアプリIDを自分のスクリプトで実行する際に使うことで、楽天市場の情報にアクセスでき流ようになります。
楽天市場だけでなく、楽天の他のサービス(楽天トラベルや楽天レシピなど)のAPIもあるのが良いですね。機会があれば使ってみたいです。
今回は「メークイン」というじゃがいもの品種名をキーワードに含む商品情報を取得することにします。
まずは必要なライブラリのインポート。
import requests
import pandas as pd
次にAPIを叩いて情報を取得するスクリプト。
REQUEST_URL = "https://app.rakuten.co.jp/services/api/IchibaItem/Search/20170706"
APP_ID="<ここに楽天のサイトで取得したアプリIDを入れる>"
serch_keyword = 'メークイン'
serch_params={
"format" : "json",
"keyword" : serch_keyword,
"applicationId" : [APP_ID],
"availability" : 0,
"hits" : 30,
"page" : 1,
"sort" : "-updateTimestamp"
}
response = requests.get(REQUEST_URL, serch_params)
result = response.json()
このスクリプトを実行したのち、result['Items']
とすれば、情報がdict型のlistの形で取得できます。
今回は30商品が取得できています(serch_params
の"hits":30
で指定している数値がこの取得数に当たります)
先ほどのスクリプトをざっと見ておきます。
REQUEST_URL
には楽天ウェブサービス: 楽天商品検索API(version:2017-07-06) | API一覧に載っているリクエストURLを指定。
APP_ID
には先ほど楽天の開発者向けページから取得したアプリIDを記述しておきます。
serch_keyword
で検索したい文字列を指定することで、そのキーワードにマッチする商品が検索されます。例えばここをPythonのinput()
関数でユーザー入力を受け付けても使い勝手が良さそうですね。
次に、serch_params
にはリクエストを送る際のパラメータをdict型で書いておきます。
楽天ウェブサービス: 楽天商品検索API(version:2017-07-06) | API一覧の「入力パラメーター」の項に詳細が載っていますので、詳細はそちらを参照してみてください。
注意点として、この入力パラメーターにはapplicationId
(アプリID)は必須でこれには先ほど記述したAPP_ID
を指定、またkeyword
,shopCode
, itemCode
, genreId
のいずれかの指定が必須のようです。
今回は検索キーワードで商品情報を取得したいので、keyword
に先ほど指定したserch_keyword
を指定しました。
この入力パラメータの"hits":30
というのが取得する商品の件数に当たり、最大値が30のようです(省略してもデフォルトで30が設定されているようですが、今回のスクリプトでは忘れないように明示しておきました)。
また"page":1
というのが取得ページ番号になるので、この数値をfor文などでループを回せば複数ページに渡る大量の商品情報を簡単に取得できそうですね。
さて、先ほどAPIを叩いて取得できたdictには楽天ウェブサービス: 楽天商品検索API(version:2017-07-06) | API一覧の「出力パラメーター」の項に載っている項目がdictのkeyとvalueとして入っています。
例えばresult['Items'][2]['Item']['itemName']
という風にkeyを指定すると、商品名が取得できます。
現段階で取得した情報は、このままだと余計な情報も入っていて扱いが不便なので、必要な情報のみが入っているdictを作ることにします。以下の項目に絞りました。
「itemName」「itemPrice」「itemCaption」「shopName」「shopUrl」「itemUrl」
(後から、送料フラグ「postageFlag」も必要だなと思ったのですが、以下のスクリプトには反映されておりません)。
# for文を回してdictのlistを作る
item_key = ['itemName', 'itemPrice', 'itemCaption', 'shopName', 'shopUrl', 'itemUrl']
item_list = []
for i in range(0, len(result['Items'])):
tmp_item = {}
item = result['Items'][i]['Item']
for key, value in item.items():
if key in item_key:
tmp_item[key] = value
item_list.append(tmp_item)
これで、dict型の商品情報の入ったlistが取得できます。
ここで詰まったのが、item_list.append(tmp_item.copy())
のところでcopy()
メソッドを使う必要があることでした。
このメソッドを使わずitem_list.append(tmp_item)
としてしまったら、1つの商品情報が複数入ったdictができてしまい、首をひねって日を跨ぐことに。
以下の記事に助けられました。
Pythonのリストにdict型の変数をappendすると変数がポインタ的に振る舞うので… · GitHub
この理屈は理解しておいた方が良さそうなので、また別途まとめたいですね。
dict型のlistを作ることができたら、あとは難しいことはなくpandas
の基本操作で事足ります。
データフレームを作り、また活用しやすくするために少し整形しておきます。
# データフレームを作成
item_df = pd.DataFrame(item_list)
# 列の順番を入れ替える
items_df = items_df.reindex(columns=['itemName', 'itemPrice', 'itemCaption', 'itemUrl', 'shopName', 'shopUrl'])
# 列名を日本語語に変更する
items_df.columns = ['商品名', '商品価格', '商品説明文', '商品URL', '店舗名', '店舗URL']
作成したデータフレームをcsvファイルに出力します。
items_df.to_csv('./rakuten_mayqueen.csv')
to_csv()
メソッドの引数には、保存先のパス(ディレクトリとファイル名)を指定します。今回は相対パスで、このスクリプトがあるディレクトリ直下にcsvファイルを作成しました。
さて、出力されたデータをExcelなりSpreadSheetで開いてみましょう。
いい感じに取得することができました!
ひとまず楽天市場から商品情報を取得して、csv出力まですることができました。
今後の方針としては、
(1)データの収集と整形
より目的にあったデータを必要な数だけ集めて、活用できる形に整形します。
単にデータ量を増やすだけでは意味がなくて、余計なデータや極端なデータを省いたデータを集める必要があります。商品情報取得時のソート順なども関係してきそうです。
例えば現状のデータだと、じゃがいもだけではなく包装資材やじゃがいもを使った別商品、謎に洋書まで取得してきている様子で、これらは除外するようにデータを加工しなければいけません。
(2)収集したデータの分析と意思決定
本当ならば別視点で「どの商品が売れ行きが良いのか」もデータを集めて分析できれば面白いのでしょうけど、今回はそこまでは考慮せず、現在の商品価格のみを見てみることにします。
より正確な意思決定にはまた別の学習(プログラミングスキル以外の)が必要になってきますね。
ただ、今回のデータを元に平均値などの統計量を見ることができれば、値決めの判断材料としては役に立つのかなーって思っています。
そんな訳で、次回は少し込み入ったデータ収集と加工をしてみたいと思います。
農家のITマーケティング試行錯誤日記1.楽天商品検索APIを使って商品情報をcsv出力する[Python]
農家のITマーケティング試行錯誤日記2.商品情報の収集とデータ加工を行う[Python]
農家のITマーケティング試行錯誤日記3.商品価格の集計と分析を行う[Python]
Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?
コメント