楽天商品検索APIとは
楽天市場の商品情報を取得できる公式APIです。楽天IDの取得・アプリIDの発行後、無料で利用できます(1日あたりのリクエスト制限あり)。
APIで取得できる主な情報:
- 商品名・価格・在庫状況
- 商品画像URL
- 楽天内の商品URL
- レビュー件数・評価平均
- カテゴリID・タグ情報
公式スクレイピングよりも安定してデータを取得でき、利用規約の範囲内で商用利用も可能です。
アプリIDの取得
- 楽天デベロッパー にアクセス
- 楽天IDでログイン
- 「アプリ ID 発行」からアプリを登録
- アプリIDとシークレットキーを取得
Node.jsでの基本実装
require('dotenv').config();
const axios = require('axios');
const APP_ID = process.env.RAKUTEN_APP_ID;
const BASE_URL = 'https://app.rakuten.co.jp/services/api/IchibaItem/Search/20220601';
/**
* 楽天商品検索
* @param {string} keyword - 検索キーワード
* @param {object} options - 追加オプション
*/
async function searchItems(keyword, options = {}) {
const params = {
applicationId: APP_ID,
keyword: keyword,
hits: options.hits ?? 30, // 1回の取得件数(最大30)
page: options.page ?? 1,
sort: options.sort ?? '-reviewCount', // -reviewCount: レビュー数降順
format: 'json',
formatVersion: 2,
...options,
};
try {
const response = await axios.get(BASE_URL, { params, timeout: 10000 });
return response.data;
} catch (error) {
if (error.response) {
throw new Error(`API Error: ${error.response.status} - ${JSON.stringify(error.response.data)}`);
}
throw error;
}
}
// 実行例
(async () => {
const result = await searchItems('ワイヤレスイヤホン', {
hits: 30,
sort: '-price', // 価格降順
});
console.log(`総件数: ${result.count}`);
console.log(`ページ数: ${result.pageCount}`);
result.Items.forEach((item, i) => {
const i_ = item;
console.log(`${i + 1}. ${i_.itemName}`);
console.log(` 価格: ¥${i_.itemPrice.toLocaleString()}`);
console.log(` レビュー: ${i_.reviewCount}件 (${i_.reviewAverage})`);
console.log(` URL: ${i_.itemUrl}`);
});
})();
複数ページを取得するページネーション
/**
* 複数ページにわたって商品を収集する
* @param {string} keyword - 検索キーワード
* @param {number} maxPages - 最大ページ数
*/
async function collectAllItems(keyword, maxPages = 5) {
const allItems = [];
let page = 1;
while (page <= maxPages) {
const result = await searchItems(keyword, { page, hits: 30 });
if (!result.Items || result.Items.length === 0) break;
allItems.push(...result.Items);
console.log(`ページ ${page}/${result.pageCount} 取得: ${result.Items.length}件`);
if (page >= result.pageCount) break;
page++;
// APIの利用制限を考慮して待機(1秒以上推奨)
await new Promise(r => setTimeout(r, 1200));
}
return allItems;
}
// 使用例
const items = await collectAllItems('bluetooth スピーカー', 10);
console.log(`合計 ${items.length} 件を収集`);
価格比較・最安値検索
/**
* キーワードで最安値商品を検索
*/
async function findCheapest(keyword, maxPrice = null) {
const params = {
sort: '+price', // 価格昇順
hits: 30,
};
if (maxPrice) {
params.maxPrice = maxPrice;
}
const result = await searchItems(keyword, params);
return result.Items
.filter(item => item.itemPrice > 0)
.map(item => ({
name: item.itemName.substring(0, 50),
price: item.itemPrice,
shop: item.shopName,
reviews: item.reviewCount,
score: item.reviewAverage,
url: item.itemUrl,
}));
}
const cheapest = await findCheapest('ワイヤレスマウス', 3000);
cheapest.slice(0, 5).forEach(item => {
console.log(`${item.name}`);
console.log(` ¥${item.price.toLocaleString()} | ${item.shop} | ★${item.score}(${item.reviews}件)`);
});
スプレッドシートへの書き出し
const { GoogleSpreadsheet } = require('google-spreadsheet');
async function saveToSpreadsheet(items, sheetTitle) {
const doc = new GoogleSpreadsheet(process.env.SPREADSHEET_ID);
await doc.useServiceAccountAuth(require('./service-account.json'));
await doc.loadInfo();
const sheet = doc.sheetsByTitle[sheetTitle] || await doc.addSheet({ title: sheetTitle });
await sheet.clearRows();
await sheet.setHeaderRow(['商品名', '価格', 'ショップ', 'レビュー数', '評価', 'URL']);
await sheet.addRows(items.map(item => ({
'商品名': item.name,
'価格': item.price,
'ショップ': item.shop,
'レビュー数': item.reviews,
'評価': item.score,
'URL': item.url,
})));
console.log(`${items.length}件をスプレッドシートに書き出しました`);
}
定期実行で価格を追跡する
const cron = require('node-cron');
// 毎日朝8時に価格データを収集
cron.schedule('0 8 * * *', async () => {
console.log('楽天価格収集開始:', new Date().toLocaleString('ja-JP'));
const keywords = ['ワイヤレスイヤホン', 'Bluetooth スピーカー', '充電器 急速'];
for (const keyword of keywords) {
const items = await collectAllItems(keyword, 3);
await saveToSpreadsheet(items, keyword);
await new Promise(r => setTimeout(r, 2000));
}
}, { timezone: 'Asia/Tokyo' });
まとめ
楽天商品検索APIはシンプルなGETリクエストで豊富な商品データを取得でき、EC分析・価格比較・仕入れリサーチの自動化に活用できます。弊社では楽天API・Amazon SP-APIを組み合わせたEC市場分析ツールの開発実績があります。
EC自動化・データ収集ツールの開発についてはお気軽にご相談ください。