見出し画像

【データの集めかた講座】楽天市場の商品情報を収集する

はじめに


ごあいさつ

ご高覧いただきありがとうございます.
ソフトウェアエンジニアのKitaharaです.
本日から3本立てで楽天市場の商品情報の収集方法を解説します!

  • 一日目:商品価格ナビ製品検索APIで商品情報を収集

  • 二日目:商品価格ナビ製品検索APIを使ってほしい商品の平均価格と市場に存在する数を収集

  • 三日目:PaaSを使って自動値段監視システムを構築

完成物


最終的に商品情報を収集できるようになります.

==============================
product id:  fc01d3ce5675a053b39efe453ea9d6a8
product name: Python実践機械学習システム100本ノック   /秀和システム/下山輝昌
product number: 9784798063416
brand name: 
image url: https://thumbnail.image.rakuten.co.jp/ran/img/2001/0009/784/798/063/416/20010009784798063416_1.jpg?_ex=64x64
genre id: 209118
genre name: プログラミング
==============================
product id:  17de51318a73e84ac3ac46f6da87a40f
product name: スッキリわかるPythonによる機械学習入門   /インプレス/フレアリンク
product number: 9784295009948
brand name: 
image url: https://thumbnail.image.rakuten.co.jp/ran/img/2001/0009/784/295/009/948/20010009784295009948_1.jpg?_ex=64x64
genre id: 209118
genre name: プログラミング
==============================
...
==============================
product id:  fc03df76a1a2709f6eafea87ffbb398e
product name: やさしく学ぶ機械学習を理解するための数学のきほん アヤノ&ミオと一緒に学ぶ 機械学習の理論と数学、実  /マイナビ出版/立石賢吾
product number: 9784839963521
brand name: 
image url: https://thumbnail.image.rakuten.co.jp/ran/img/2001/0009/784/839/963/521/20010009784839963521_1.jpg?_ex=64x64
genre id: 101937
genre name: その他


作るものの確認


作るものを明確にしていきましょう.
今回はキーワードからプロダクトIDと目的のものか確認するためのデータを出力する関数を作ります.

  • キーワードからプロダクトIDを出力する関数

    • INPUT

      • app_id: application id

      • keyword: keywords

    • OUTPUT

      • product_id: Rakuten Product ID => use for searching

      • product_name: product name

      • product_No: version of product

      • product_brand: brand of product

      • product_release_date: date when product was released

      • product_image_url: small image of product

      • product_genre_id: genre id of product

      • product_genre_name: genre name of product

使用するものの確認


  • Python

    • プログラミング言語のひとつです.

    • 型宣言等が無く, 初心者にも扱いやすい言語だと言われています

    • 近年Deep Learningのライブラリが豊富であることから注目を集めている人気の言語です

    • 公式ドキュメント

  • Google Colab

    • Googleが提供するPythonの実行環境です

    • 主要なライブラリがインストールされている状態で使うことができます

    • Chromeでアクセスするだけで利用することができます

      • 環境構築が不要です

      • 無料で使うことができます

環境構築


今回は事前に用意するパッケージはありません.
楽天Webサービスでアプリケーションを作成をして番号だけ控えてください.

プログラムの作成


エンコードの確認

エンコードを確認します.
今回使用するAPIのパラメーターにUTF-8でエンコードすることが必須になっているものがあるからです.

商品価格ナビ検索APIより引用

INPUT

import sys
sys.getdefaultencoding()

OUTPUT

utf-8

今回は気にしないでよさそうです.

リクエスト先のURLを作成

リクエスト用のURLを記述していきます.
変数の部分は直接URLに書いても動くのですが, 後々の利便性と可読性を向上させるために文字列に代入する方式で書いています.

変数 keyword には好きなものを入れてもらって問題ありません.
今回は「機械学習 本」としてみました.

INPUT

id = 'your_app_id'
keyword = '機械学習 本'
url = "https://app.rakuten.co.jp/services/api/Product/Search/20170426?applicationId={}&format=json&keyword={}"
print(url.format(id, keyword))

OUTPUT

https://app.rakuten.co.jp/services/api/Product/Search/20170426?applicationId=your_app_id&format=json&keyword=機械学習 本

リクエストの送信

準備ができたので早速リクエストを送信していきます.

INPUT

response = requests.get(url.format(id, keyword, genre_id))
response

OUTPUT

<Response [200]>

レスポンスが200以外の人は何等かの問題が発生しているのでこれまでのコードや通信環境等を確認してみてください.

結果の表示

INPUT

response.json()

OUTPUT

長くなりますが, この後の説明の時に戻って確認できるようにするために一つ目の製品をすべて表示させています.

{'GenreInformation': {'children': [], 'current': [], 'parent': []},
 'Products': [{'Product': {'ProductDetails': [{'detail': {'name': '書名カナ',
       'value': 'パイソン ジッセン キカイ ガクシュウ システム ヒャッポン ノック'}},
     {'detail': {'name': '著者名', 'value': '下山輝昌、三木孝行'}},
     {'detail': {'name': '著者名カナ', 'value': 'シモヤマ,テルマサ、ミキ,タカユキ'}},
     {'detail': {'name': '発行者', 'value': '秀和システム'}},
     {'detail': {'name': '発行者カナ', 'value': 'シユウワシステム'}},
     {'detail': {'name': 'ページ数', 'value': '316p'}},
     {'detail': {'name': 'サイズ', 'value': '22'}}],
    'affiliateUrl': None,
    'averagePrice': 2523,
    'brandName': '',
    'genreId': '209118',
    'genreName': 'プログラミング',
    'itemCount': 13,
    'makerCode': '2097847980',
    'makerName': '秀和システム',
    'makerNameFormal': '秀和システム',
    'makerNameKana': 'シユウワシステム',
    'makerPageUrlMobile': 'http://m.product.rakuten.co.jp/category/209118/2097847980/',
    'makerPageUrlPC': 'https://product.rakuten.co.jp/category/-/209118/2097847980/',
    'maxPrice': 2640,
    'mediumImageUrl': 'https://thumbnail.image.rakuten.co.jp/ran/img/2001/0009/784/798/063/416/20010009784798063416_1.jpg?_ex=128x128',
    'minPrice': 1660,
    'productCaption': '',
    'productId': 'fc01d3ce5675a053b39efe453ea9d6a8',
    'productName': 'Python実践機械学習システム100本ノック   /秀和システム/下山輝昌',
    'productNo': '9784798063416',
    'productUrlMobile': 'http://m.product.rakuten.co.jp/product/fc01d3ce5675a053b39efe453ea9d6a8/',
    'productUrlPC': 'https://product.rakuten.co.jp/product/-/fc01d3ce5675a053b39efe453ea9d6a8/',
    'rank': 67,
    'rankTargetGenreId': '209118',
    'rankTargetProductCount': 10499,
    'releaseDate': '2020年12月8日',
    'reviewAverage': 4,
    'reviewCount': 1,
    'reviewUrlMobile': 'http://m.product.rakuten.co.jp/product/fc01d3ce5675a053b39efe453ea9d6a8/review/',
    'reviewUrlPC': 'https://product.rakuten.co.jp/product/-/fc01d3ce5675a053b39efe453ea9d6a8/review/',
    'salesItemCount': 10,
    'salesMaxPrice': 2640,
    'salesMinPrice': 2376,
    'smallImageUrl': 'https://thumbnail.image.rakuten.co.jp/ran/img/2001/0009/784/798/063/416/20010009784798063416_1.jpg?_ex=64x64',
    'usedExcludeCount': 10,
    'usedExcludeMaxPrice': 2640,
    'usedExcludeMinPrice': 2376,
    'usedExcludeSalesItemCount': 10,
    'usedExcludeSalesMaxPrice': 2640,
    'usedExcludeSalesMinPrice': 2376}},
...

機械学習本を収集することができました!

欲しい情報の表示

欲しい情報を収集してみます.

INPUT

results = response.json()
items = results['Products']
for i in range(len(items)):
    print('==============================')
    print('product id: ',items[i]['Product']['productId'])
    print('product name:',items[i]['Product']['productName'])
    print('product number:',items[i]['Product']['productNo'])
    print('brand name:',items[i]['Product']['brandName'])
    print('image url:',items[i]['Product']['smallImageUrl'])
    print('genre id:',items[i]['Product']['genreId'])
    print('genre name:',items[i]['Product']['genreName'])

OUTPUT

==============================
product id:  fc01d3ce5675a053b39efe453ea9d6a8
product name: Python実践機械学習システム100本ノック   /秀和システム/下山輝昌
product number: 9784798063416
brand name: 
image url: https://thumbnail.image.rakuten.co.jp/ran/img/2001/0009/784/798/063/416/20010009784798063416_1.jpg?_ex=64x64
genre id: 209118
genre name: プログラミング
==============================
product id:  17de51318a73e84ac3ac46f6da87a40f
product name: スッキリわかるPythonによる機械学習入門   /インプレス/フレアリンク
product number: 9784295009948
brand name: 
image url: https://thumbnail.image.rakuten.co.jp/ran/img/2001/0009/784/295/009/948/20010009784295009948_1.jpg?_ex=64x64
genre id: 209118
genre name: プログラミング
==============================
...
==============================
product id:  fc03df76a1a2709f6eafea87ffbb398e
product name: やさしく学ぶ機械学習を理解するための数学のきほん アヤノ&ミオと一緒に学ぶ 機械学習の理論と数学、実  /マイナビ出版/立石賢吾
product number: 9784839963521
brand name: 
image url: https://thumbnail.image.rakuten.co.jp/ran/img/2001/0009/784/839/963/521/20010009784839963521_1.jpg?_ex=64x64
genre id: 101937
genre name: その他

ここまでくればPandasでデータの保存もできます.

INPUT

import pandas as pd

data = []
for i in range(len(items)):
   data_i = [
             items[i]['Product']['productId'],
             items[i]['Product']['productName'],
             items[i]['Product']['productNo'],
             items[i]['Product']['brandName'],
             items[i]['Product']['smallImageUrl'],
             items[i]['Product']['genreId'],
             items[i]['Product']['genreName']
   ]
   data.append(data_i)
df = pd.DataFrame(data, columns=['product_id','product_name', 'product_no', 'brand_name', 'image_url', 'genre_id', 'genre_name'])
df.to_csv('item_data.csv')

OUTPUT

# NOTHING

データの確認はGoogle Colabの左側の部分からすることができます.

item_data.csvをクリック
データの確認

作成した関数

import requests
import pandas as pd

def search_product(app_id, keyword):
    url = "https://app.rakuten.co.jp/services/api/Product/Search/20170426?applicationId={}&format=json&keyword={}"
    response = requests.get(url.format(app_id, keyword))
    results = response.json()
    items = results['Products']
    data = []
    for i in range(len(items)):
        data_i = [
                    items[i]['Product']['productId'],
                    items[i]['Product']['productName'],
                    items[i]['Product']['productNo'],
                    items[i]['Product']['brandName'],
                    items[i]['Product']['smallImageUrl'],
                    items[i]['Product']['genreId'],
                    items[i]['Product']['genreName']
        ]
        data.append(data_i)
    df = pd.DataFrame(data, columns=['product_id','product_name', 'product_no', 'brand_name', 'image_url', 'genre_id', 'genre_name'])
    df.to_csv('item_data.csv')

おわりに


今回はPythonを使って楽天市場の商品情報を収集する方法を解説しました!
参考になったという方はぜひハートボタンを押していってください!

モチベーションが上がります!

記事内で不明な点等ございましたら気軽にご連絡ください.

Twitter: @kitahara_dev
email: kitahara.main1@gmail.com

この記事が気に入ったらサポートをしてみませんか?