株式会社WR

株式会社WR

WEB TOTAL CONSULTING

楽天商品検索APIの使い方——Node.jsでの実装例
ブログ一覧へ
技術ブログ

楽天商品検索APIの使い方——Node.jsでの実装例

楽天市場の商品検索APIを使って、プログラムから商品情報を取得する方法を解説します。APIキーの取得から、Node.jsでの実装、データ保存まで。

楽天商品検索APIとは

楽天市場の商品情報を取得できる公式APIです。楽天IDの取得・アプリIDの発行後、無料で利用できます(1日あたりのリクエスト制限あり)。

APIで取得できる主な情報:

  • 商品名・価格・在庫状況
  • 商品画像URL
  • 楽天内の商品URL
  • レビュー件数・評価平均
  • カテゴリID・タグ情報

公式スクレイピングよりも安定してデータを取得でき、利用規約の範囲内で商用利用も可能です。


アプリIDの取得

  1. 楽天デベロッパー にアクセス
  2. 楽天IDでログイン
  3. 「アプリ ID 発行」からアプリを登録
  4. アプリ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自動化・データ収集ツールの開発についてはお気軽にご相談ください。

Category 技術ブログ

Related Posts

関連記事

開発・技術のご相談はお気軽に

お見積りは無料です。まずはお気軽にご相談ください。

お問い合わせ →