Amazonと楽天における商品の最安値を取得する用事があったので、調べたことを備忘録として残しておきます。
ECの情報をどうやって取得するか
まず最初に各ECの情報を取得する手段を調べると、Amazon・楽天ともに許可なしのスクレイピングは規約で禁止していそうでした。AmazonはAmazon.co.jp利用規約「利用許可およびサイトへのアクセス」の欄に、楽天は楽天ショッピングサービスご利用規約「禁止事項」の欄にそれぞれ記載があります。
代替手段としてこの2サイトはWeb APIを提供しているため、このAPIを使うことにしました。
APIのレートリミット
どのくらいの頻度で最安値を取得(更新)できるかや、システムの設計に関わるため、APIのレートリミットは重要です。
Amazonのほうはアソシエイトアカウントに紐づいており、該当のアソシエイトアカウント経由の売上に応じてリミットも変動する仕組みなのでコントロールがしにくいです。初期状態では1リクエスト/1秒で、30日間連続で売上が発生しない場合APIへアクセスできなくなるといった仕様のため売上を上げ続けないといけません。
楽天のほうはapplication_idに紐づいており、基本1リクエスト/1秒ですがAPIによっては個別設定されていて、レートリミットの制限緩和はありません。
これらを踏まえると、ただ1つの商品だけの最安値が取得できればいい場合を除いて、ユーザー起因でつどAPIリクエストを行うようなつくりにすることや、最安値のリアルタイム性を上げることは難しそうでした。
検索のしかた
AmazonはSearchItems、楽天はIchiba Item Searchという商品検索エンドポイントを使いました。それぞれ検索結果を取得でき、レスポンスには出品ごとの価格が含まれるため、最安値の出品を調べることができます。
Amazonも楽天も同条件で検索したときの取得件数に上限があります。これはAPIに指定できる最大ページ数に上限があるためです。なので厳密には全ての検索結果を洗うということは難しいのですが、検索時に価格帯を指定できるため、価格帯を分割しながらそれぞれで最大ページまで検索することでできるだけ多くの検索結果を取得することはできました。
「ブランド名 商品名」などのキーワードでの検索結果から最安値を取得するのがシンプルですが、検索結果にその商品以外のものも含まれることと、ECごとに検索結果にブレが大きいです(Amazonでは漢字で検索するとヒットするがカタカナで検索するとヒットしない、楽天ではその逆みたいな)。これにより商品のわりに安すぎる最安値になったり、ECごとの最安値の差が不自然に大きくなったりしました。そのブランドの公式ショップの出品だけでなく他の出品者や中古品なども含めて最安値を取得したかったので、公式ショップだけに絞るというやり方もできません。
今回のケースでは、特定の品番を指すこともあれば「レゴ」のようにブランドで一括りにすることもあるなど扱う商品の粒度にばらつきがあったため、商品に応じて個別に最安値の閾値を設定するのもアリですし、正確性という点ではJANコードでの検索が有効でした。
Amazon・楽天ともにAPIの検索キーワードとしてJANコードを入力すればそのコードの商品のみ検索できるため、該当商品のJANコードのリスト化が現実的であれば、それぞれのJANコードで検索してその全ての中での最安値を取得することで、商品名などで検索するよりも正確な最安値が取得できます。
おわり
Amazonと楽天における商品の最安値を取得する方法について調べたものを備忘録として残しました。各社提供しているAPIを用いて最安値を取得できますが、レートリミットが厳しいのでリアルタイム性をもたせるのは難しいのと、Amazonは紐づくアソシエイトアカウントの売上を上げ続けないと利用が停止されるため注意が必要です。
間違いがあったりより良い方法があれば教えていただけると幸いです。