こちらの記事は次のようなことを知りたいという方に向けて書いています。
- pythonで自動的に情報をダウンロードする例を見てみたい!
- pythonでAPIを使ってECサイトの商品情報がダウンロードできると聞いたけど、どうやってやるの?
- 楽天市場の商品情報を一覧でダウンロードする方法はある?
今回は、楽天市場のAPIを活用した商品情報のダウンロード方法をご説明しますね。
pythonでAPIを利用した情報ダウンロード
APIの概要
APIとは、Application Programming Interfaceの略です。アプリケーションプログラムのインターフェースということですが、それだけだと意味不明ですね。
簡単に言うと、ユーザー側のアプリケーションプログラムと、サービスを提供しているWebサイト側との接続方法ということになります。
ここで、Webサイトを閲覧するときのユーザーの動きとWebサイトの反応、pythonを活用してスクレイピングをする場合のアプリケーションプログラムとWebサイトの反応を見てみましょう。
どちらの場合も、接続先のアプリケーションプログラムが、Webサイトの情報を表示していますね。その情報を、ユーザーが手動でWeb閲覧する場合は、Webサイトの情報を閲覧するのに対し、スクレイピングの場合は、データを自動でデータ化・出力(ダウンロード)します。
APIを使用する場合は、動きが異なります。
APIは、ユーザー側がアプリケーションプログラムで、サービス提供側のWebサイトに接続する際に、APIを呼び出して、そこでデータの提供をリクエストします。
つまり、楽天市場などのサービス提供側は、いちいちWebサイトで閲覧用の情報を表示する必要はなく、データだけ提供すればOKということになります。
つまり、動作が非常に高速、というメリットがあるんですね。
pythonでのAPIの利用方法
pythonでAPIを利用する場合、難しそうだな、という印象を持たれるかもしれませんが、実際はスクレイピングよりもずっと楽です。
なぜなら、スクレイピングはWebサイトのHTMLタグなどを詳細に分析して、必要なデータがどこにあるかを分析して、取得するためのプログラムを書く必要がありますが、APIを利用する場合は、最初からサービス提供側がどのようにプログラムを書けばデータが取得できるか教えてくれています。
プログラム構築に至るまでの時間がずっと短縮されることになりますので、もしAPIが利用可能であれば、是非利用しましょう。
一方で、APIを提供していない場合はどんなに頑張っても利用できません。
あくまで、サービス提供側がAPIを提供してくれていることが必要です。
それでは、APIの具体的な活用方法を見ていきましょう。
楽天市場でのAPIを利用した商品情報ダウンロード
ここでは、簡単に実装できる楽天APIを利用して、pythonで商品情報をダウンロードしてみましょう。
楽天市場APIの基本情報取得
まずは楽天APIの取得が必要です。楽天APIは特にユーザー登録などもせずに使用可能です。以下のリンクをクリックして、楽天ウェブサービス API一覧
今回は楽天市場商品検索APIを使用します。
テストフォームのボタンをクリックします。
APIテストフォームが表示されます。
ここで、画面の下の方にいって、GETのボタンを押しましょう。
すると、下のウィンドウにデータが表示されます。
これがAPIで取得される情報になります。デフォルトでは取得形式をjsonにしていますので、json形式のデータが出力されています。
pythonプログラムのコード公開
さて、pythonで楽天市場APIを利用したデータの取得ですが、何をやりたいか?によってプログラムの組み方は異なります。
今回は、ひとまずお試しレベルでデータを取得できるプログラムを作成してみました。テレビゲームをジャンル指定して、そのランキングを1000位まで取得します。
商品名、商品ページのURL、商品価格、獲得ポイント(通常+店舗ポイント)、あるものはJANコード、在庫の有無(有=1、無=0)
データ解析用には、pandasライブラリを使用しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | import pandas as pd import requests import pprint import json import time import re now = time.ctime() parsed = time.strptime(now) url = "https://app.rakuten.co.jp/services/api/IchibaItem/Ranking/20170628" api_id = "1012533790108501429" # カテゴリーをテレビゲームに設定、ここではgenre_nameを翻訳名として設定 category_num = [ [ "101205", ] , [ "テレビゲーム", ] ] count = 0 format_num = "2" page_num = "1" result = {} for m in range(len(category_num[0])): rank_count = 1 # 最大取得数が990件のため34<img class="alignnone size-medium wp-image-505" src="http://massu-keiei.com/wp-content/uploads/2021/02/2021-02-21_19h49_49-300x102.png" alt="" width="300" height="102" />に設定 for n in range(34): page_num = str(n+1) response = requests.get(url, params = {'applicationId':api_id, 'genreId':category_num[0][m], 'formatVersion':format_num, 'page':page_num}) json_data = response.json() # 1回の取得で30件取得可能なため30に設定 for rank in range(30): try: genre_id = category_num[0][m] genre_name = category_num[1][m] ItemName_str = json_data['Items'][rank]['itemName'] ItemUrl_str = json_data['Items'][rank]['itemUrl'] ShopName_str = json_data['Items'][rank]['shopName'] ItemPrice_str = json_data['Items'][rank]['itemPrice'] PointRate_str = json_data['Items'][rank]['pointRate'] item_caption = json_data['Items'][rank]['itemCaption'] stock = json_data['Items'][rank]['availability'] #URLにJANコード(13桁の数字)があれば抽出 jan_1 = re.findall('[0-9]{13}',ItemUrl_str) if len(jan_1) == 1: jan = jan_1[0] else: jan_1 = re.findall('[0-9]{13}',item_caption) if len(jan_1) == 1: jan = jan_1[0] else: jan = '' add_data = {} add_data['genre_id'] = genre_id add_data['genre_name'] = genre_name add_data['rank'] = rank_count add_data['ItemName'] = ItemName_str add_data['StoreName'] = ShopName_str add_data['ItemUrl'] = ItemUrl_str add_data['ItemPrice'] = ItemPrice_str add_data['PointRate'] = PointRate_str add_data['jan'] = jan add_data['stock'] = stock result[count] = add_data count += 1 rank_count += 1 except IndexError: break except KeyError: break print(str(count) + '件取得しました') res = pd.DataFrame(result).T res.to_csv('csv/ranking' + time.strftime("%Y%m%d%H%M%S", parsed) + ".csv", encoding='utf_8_sig') |
pythonによるAPIの利用の実践
プログラムの実行
このAPIを利用するpythonプログラムを実行してみます。
990件のデータが取得できました。
スクレイピングであれば、Webサイトの遷移を何回も何回も繰り返して、またサーバー攻撃のような形になってしまわないようある程度の時間をおいてアクセスしなければならないため、相当な時間がかかってしまいますが、APIを利用すると高速でデータの取得が可能です。
すべてのジャンルを指定してデータを取得するとしても、それほどの時間はかからないかもしれませんね。
出力結果確認
csvフォルダに格納された、出力されたcsvファイルを確認してみます。
こんな形でデータを取得できるんですね。
今後の活用方法
今回は検索条件を設定せず、ジャンルの設定のみをおこないランキングをそのまま読み込んでいました。
つまり、そのままデータを持ってきた形になっているため、このデータからわかることはランキング上位に来ている商品がどんなものか、ということがわかります。
上の例ですと、テレビゲームのジャンルだとNintendo Switchが優勢だな、ということがわかります。定価以上の販売データもあるんですね。
楽天APIを活用すれば、検索キーワードを指定したり、価格帯を指定したり、特定の店舗を指定したりすることができます。
それを考えれば以下のような使い方もできそうですね。
- ライバル店の販売価格を取得して値付けの参考にする
- 自社で販売している商品の価格設定の参考として利用する
- ジャンル別の売れ筋商品情報を取得して、仕入れ戦略の立案に活用する
楽天市場だけでは足りないかもしれませんが、AmazonやYahooショッピングの情報なども取得できれば、様々な戦略に活用できそうです。
私も研究してみようと思います。
以上、ここまでお読みいただきましてありがとうございました。