お疲れ様です。RPA事業部です。
今回は楽天apiを使用して、楽天市場の商品の最安値情報を取得する作業を自動化してみました。
Pythonのコード内容も公開していますので、良かったらご覧ください。
事前準備
楽天APIを使用するためには、楽天会員への登録とアプリIDを発行する必要があります。
まだお済みでない方は、以下のリンクの「アプリID発行」から登録・発行して頂ければと思います。
https://webservice.rakuten.co.jp/
概要
プログラムがすること
テキストファイルに記載されたキーワード(商品名やJANコードなど)に該当する商品の最安値情報を取得し、キーワードごとにcsv形式で保存していきます。
なお、取得したい情報の数は後述する定数で変更可能です。
処理の流れ
1.csvファイルの保存先フォルダ生成
2.楽天市場商品検索APIを使用して、最安値情報を取得
3.csv形式で保存
4.上記手順2-3を指定したキーワードの数だけ繰り返す
動作結果
コードについて
コード内容を大まかに説明していきます。
ファイル構成
ファイル構成は以下になります。
.
┗output
┗config.py
┗list_keyword.txt
┗get_ItemInfo.py
「output」フォルダにcsvファイルを保存していきます。
なお、「list_keyword.txt」に取得したい最小値の商品情報のキーワードを記載しています。
検索したいキーワードが複数ある場合は改行で区切って指定しています。下記のような感じです。
シャーペン 黒
4902370542912
4902370542905
4902370542943
イヤホン
ちなみに、今回指定したJANコードはNintendo Switch(及びlite)本体です。
次に「config.py」についてですが、こちらには取得したAPIの情報を記載しています。
'''
api使用に必要な下記要素をそれぞれ記述してください
・アプリID/デベロッパーID
・application_secret
・アフィリエイトID
'''
CLIENT_ME = {
'APPLICATION_ID':'******',
'APPLICATION_SECRET':'******',
'AFF_ID':'******'
}
コード内容紹介
コードは下記になります。
上述した処理の流れを見ながら、コードの内容を大まかに説明していきます。
from ast import keyword
import pandas as pd
import requests,json,datetime,os,re
from time import sleep
from config import CLIENT_ME
MAX_PAGE = 5
HITS_PER_PAGE = 30
REQ_URL = 'https://app.rakuten.co.jp/'\
'services/api/IchibaItem/Search/20170706'
WANT_ITEMS = [
'genreId','itemCode',
'itemName','itemPrice','catchcopy',
'itemCaption','reviewAverage','reviewCount',
'shopCode','shopName','itemUrl','shopUrl','postageFlag'
]
sta_time = datetime.datetime.today()
this_date = format(sta_time,'%Y%m%d')
path_output_dir = f'./output/{this_date}'
req_params = {
'applicationId':CLIENT_ME['APPLICATION_ID'],
'format':'json',
'formatVersion':'2',
'keyword':'',
'hits':HITS_PER_PAGE,
'sort':'+itemPrice',
'page':0,
'minPrice':100
}
#'postageFlag':1 #送料フラグ 0->全て,1->送料込み
def main():
#本日日付フォルダ作成
if not os.path.isdir(path_output_dir):
os.mkdir(path_output_dir)
#キーワード記載テキストファイルからキーワード配列作成
with open('.\list_keyword.txt','r',encoding='utf-8') as f:
keywords = list(map(str,f.read().split('\n')))
create_output_data(keywords)
print(f"{'#'*10}")
def create_output_data(arg_keywords):
#キーワードループ
for keyword in arg_keywords:
#初期設定
cnt = 1
keyword = keyword.replace('\u3000',' ')
req_params['keyword'] = keyword
path_file = f'{path_output_dir}/{keyword}.csv'
df = pd.DataFrame(columns=WANT_ITEMS)
print(f"{'#'*10}\nNowKeyword --> {keyword}")
#ページループ
while True:
req_params['page'] = cnt
res = requests.get(REQ_URL,req_params)
res_code = res.status_code
res = json.loads(res.text)
if res_code != 200:
print(f"ErrorCode --> {res_code}\nError --> {res['error']}\nPage --> {cnt}")
else:
#返ってきた商品数の数が0の場合はループ終了
if res['hits'] == 0:
break
tmp_df = pd.DataFrame(res['Items'])[WANT_ITEMS]
df = pd.concat([df,tmp_df],ignore_index=True)
if cnt == MAX_PAGE:
break
cnt += 1
#リクエスト制限回避
sleep(1)
df.to_csv(path_file,index=False,encoding="utf_8_sig",sep=",")
print(f"Finished!!")
if __name__ == '__main__':
main()
1.csvファイルの保存先フォルダ生成
outputフォルダ内に本プログラムの起動日日付のフォルダを作成します。
そこへ各キーワードのcsvファイルを格納していきます。
2.楽天市場商品検索APIを使用して、最安値情報を取得
キーワードが記載されているテキストファイルから、各キーワードをリスト形式で取得します。
各キーワードに対して、取得したい情報量を調節したい場合は、7,8行目の定数を事前に設定してください。上記コードの場合、5*30(MAX_PAGE*HITS_PER_PAGE)で最大150件のデータを取得するようにしています。
レスポンスに対して11行目の「WANT_ITEMS」で欲しい情報(出力パラメータ)を指定しています。
また、入力パラメータは21行目の「req_params」で設定しています。欲しい情報をこちらで予め絞ったり、ソートをかけたりできるので、用途に応じて編集して下さい。
各パラメータに関しては下記公式リファレンスを参照してください。
楽天ウェブサービス: 楽天商品検索API(version:2017-07-06)
50行目以降では、キーワード及びページごとにリクエストを送り、指定されたページ分のデータを取得していきます。
リクエストに失敗した場合は、エラーコードと内容をコマンドプロンプトへ出力します。
リクエストに成功した場合は、取得したデータはDataFrameへ格納していきます。指定されたページ分のデータを取得後、CSV形式で出力します。
なお、出力パラメーターの「hits(ヒット件数番)」の値が0の場合、そのページ以降はデータがないことを示すので、ページループを終了、DataFrameのCSV出力を行い、次のキーワードの情報取得に進みます。
指定したページ分の取得が終了した場合も同様です。
1リクエスト毎に、1秒間処理を停止させてます。
基本的に各API共通で1秒に1回以下の利用制限があるためです。(下記リンク参照)
実行結果
実行結果は以下になります。
ちなみにリクエストエラー時はこんな感じです。
さいごに
いかがだったでしょうか?
今回は楽天APIとPythonを使用して、楽天市場の商品の最安値情報を取得する作業を自動化する内容でした。
楽天APIは他にもあるので、それを使用してまた何かしらの作業を自動化していきたいと思います。
完成したらまた紹介したいと思います。
なお、弊社ではこのように業務改善の一環として自動化に関するソリューションを提供しています。
「こんな作業を自動化したい・できるのか?」等、業務効率化に関するご相談があれば、お問い合わせからお気軽にご連絡下さい。