2020-12-11に更新

[Python]農家のITマーケティング試行錯誤日記1.楽天商品検索APIを使って商品情報をcsv出力する

はじめに

楽天市場のAPIを活用し、キーワードに当てはまる商品情報をcsvに出力してみました。

活用したのはこちらの「楽天商品検索API」というものです。
楽天ウェブサービス: 楽天商品検索API(version:2017-07-06) | API一覧

開発環境と使用するライブラリ

開発環境としてJupyter Notebookを利用しました。
大掛かりなツールや定期的に実行したいツール作成時にはまた別のテキストエディタで作っていく必要があるかもしれませんが、ちょっとした単発のツールを作る際には、Jupyter Notebookなら少しずつ試しながらスクリプトが書けるし、即座に実行できるのでとても便利です。

使用するライブラリはrequestpandas
APIを叩くためにrequestを使い、取得したデータ操作とcsv出力のためにpandasを利用しました。

目的

農産物を販売するための価格調査のために行いました。
取得した情報をもとに、さらに分析して意思決定するところまでを想定しています(今回は情報取得するところまで)。

色々な直販サイトはありますが、楽天市場は馴染みがあり商品数も多く、APIも提供されているので取得しやすいなと考えました。

楽天APIを扱う準備

APIを活用するためには、スクリプトを書き始める前にまずは楽天の開発者向けページからアプリを作成してIDを取得しなければいけません。

こちらのRakuten Developersのサイト
楽天ウェブサービス: API一覧

右上の「+アプリID発行」からアプリを作成しておきます。ここで取得したアプリIDを自分のスクリプトで実行する際に使うことで、楽天市場の情報にアクセスでき流ようになります。

楽天市場だけでなく、楽天の他のサービス(楽天トラベルや楽天レシピなど)のAPIもあるのが良いですね。機会があれば使ってみたいです。

商品情報を取得するスクリプト

(1)キーワードを入れて商品情報を取得してみる

今回は「メークイン」というじゃがいもの品種名をキーワードに含む商品情報を取得することにします。

まずは必要なライブラリのインポート。

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文などでループを回せば複数ページに渡る大量の商品情報を簡単に取得できそうですね。

(2)必要な商品情報を入れたdict型を作成

さて、先ほど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

この理屈は理解しておいた方が良さそうなので、また別途まとめたいですね。

(3)pandasでデータを整形

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']

(4)csv出力

作成したデータフレームをcsvファイルに出力します。

items_df.to_csv('./rakuten_mayqueen.csv')

to_csv()メソッドの引数には、保存先のパス(ディレクトリとファイル名)を指定します。今回は相対パスで、このスクリプトがあるディレクトリ直下にcsvファイルを作成しました。

さて、出力されたデータをExcelなりSpreadSheetで開いてみましょう。

スクリーンショット 2020-09-01 20.28.15.png

いい感じに取得することができました!

おわりに

ひとまず楽天市場から商品情報を取得して、csv出力まですることができました。
今後の方針としては、

(1)データの収集と整形
より目的にあったデータを必要な数だけ集めて、活用できる形に整形します。

  • 取得する商品数を増やす
  • 余計な商品を除外する
  • 重量(例えば商品名に「10kg」「5kg」などが入っている)を別カラムに切り出す

単にデータ量を増やすだけでは意味がなくて、余計なデータや極端なデータを省いたデータを集める必要があります。商品情報取得時のソート順なども関係してきそうです。
例えば現状のデータだと、じゃがいもだけではなく包装資材やじゃがいもを使った別商品、謎に洋書まで取得してきている様子で、これらは除外するようにデータを加工しなければいけません。

(2)収集したデータの分析と意思決定

  • 平均値、中央値、最小値、最大値などを算出してみる
  • 妥当な値決めを行う(意思決定)

本当ならば別視点で「どの商品が売れ行きが良いのか」もデータを集めて分析できれば面白いのでしょうけど、今回はそこまでは考慮せず、現在の商品価格のみを見てみることにします。

より正確な意思決定にはまた別の学習(プログラミングスキル以外の)が必要になってきますね。
ただ、今回のデータを元に平均値などの統計量を見ることができれば、値決めの判断材料としては役に立つのかなーって思っています。
 
そんな訳で、次回は少し込み入ったデータ収集と加工をしてみたいと思います。

(記事リンク)農家のITマーケティング試行錯誤日記

農家のITマーケティング試行錯誤日記1.楽天商品検索APIを使って商品情報をcsv出力する[Python]
農家のITマーケティング試行錯誤日記2.商品情報の収集とデータ加工を行う[Python]
農家のITマーケティング試行錯誤日記3.商品価格の集計と分析を行う[Python]

ツイッターでシェア
みんなに共有、忘れないようにメモ

Massa

北海道でアプリ制作に取り組んでるノンプログラマな農夫。仕事や日常生活で感じる小さな不便を解消すべく趣味と実益を兼ねて遊んでます ■Python・GAS + LINE bot

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント