お得なお買い物を支援するアプリ「カイドク」に関連する小ネタ記事です。
「カイドク」では、商品バーコードのスキャンや、店頭で撮影した値札の文字認識結果から、楽天などのネットショップの商品価格などを比較する機能があります。

本記事では、その機能を支える仕組み、「API」について説明します。
同時に「ヨドバシ.comの価格も表示してほしい!!」「送料も表示してほしい!!」といったご要望にお答えすることができない理由(言い訳)の説明も兼ねております。。。
Amazon、楽天やYahoo!ショッピングの商品検索結果はどこから来る?
アプリなどに表示される商品検索結果は、通常はAmazon、楽天市場、Yahoo!ショッピングなど、それぞれが保有している商品データベースからやってきます。
「カイドク」の場合も含め、一般的には以下の流れです。(商品の検索結果を表示するケース)
- アプリから検索に使う文字等(バーコードの値や商品名など)を各サービス(Amazon、楽天など)に送る
- そのとき、一緒にほしい情報(商品の写真・説明文・価格など)や検索の条件(「安い順に10件」など)も送る
- 各サービスは、送られた条件で商品検索を行い、結果をアプリに返送する
- 結果には要求された情報が含まれる
- アプリは受け取った検索結果を画面に表示する。
実際には、セキュリティー上の都合などから、スマホアプリの場合は、手元のスマホから直接楽天などのサービスとやり取りはせず、間に中継するサーバーが入るケースが多いと思います。
少なくともカイドクではそうしています。
APIってなに?
それでは、上記のアプリとサーバーがリクエストや情報をやり取りするには、決められたルールを守る必要があります。
例えば、多くの日本人は、普段「日本語」というルールに則って会話をしていますよね。
コンピュータの世界でも、お互いの共通言語(やり取りのルール)がないと会話ができません。
本記事で「API」と呼んでいるものは、その「やり取りのルール」のようなものです。
そのAPIは各Webサービス毎に決められたものがあり、商品の検索で使用するAPIはそれぞれ以下のものになります。
- Amazon : Creators API
- 楽天 : 楽天市場商品検索API
- Yahoo!ショッピング : ショッピングAPI
先にも述べましたが「カイドク」の場合はスマホとそれぞれのWebサービスの間に中継サーバーが入るので、スマホアプリとサーバー間のやり取りのルールも決めておく必要があるということになりますね。
実際「カイドク」ではアプリとサーバーのやり取りのために独自のAPIを決めて、やり取りをしています。ち」ではアプリとサーバーのやり取りのために独自のAPIを決めて、やり取りをしています。
APIとは「Application Programming Interface」の略で、ざっくり言うとシステムやプログラム同士が互いの情報をやり取りしたり、互いの機能を使うようにするための決まりごとのようなものをいいます。
つまり、本記事におけるAmazonや楽天のようなWebサービスとやり取りするためのルールというのは、本来の「API」のごく一部の例に過ぎません。
Webサービスを利用するためのAPIという意味で、「Web API」と呼んでいるケースもよく見かけます。
本記事では簡単のため、特に明示しない限りは単にAmazon, 楽天, YahooショッピングのWeb APIを単に「API」と呼びます。
APIではどんな情報を取得できるのか?
それでは、そのAPIを使うと、どんな情報が取得できるのかということになります。
これは、Amazon, 楽天, Yahoo!ショッピングともに、だいたい同じようなものです。
具体的には、商品名、商品画像(を表示するURLリンク)、や商品説明、価格などです。
APIで取得したかったのにできない情報
ここで、「カイドク」を開発するにあたり、ユーザーの利便性を考えるとぜひとも欲しかったのに、APIの仕様上それができなかったものについて説明します。
送料
販売価格は当然先に挙げたAPIで取得できるのですが、残念なことに送料は、ユーザーがそのページを見ないと確認できません。
本来ユーザーが知りたいのは「本体価格」+「送料」であることが多いと思うのですが、残念ながらこういった理由で「カイドク」では本体価格しかユーザーに示すことができていません。
ただし、送料無料(あるいは送料込み)であるかどうかだけはわかるので、「カイドク」でも送料無料の場合はそのように表示しています。
送料については、おそらく送り先の地域や配送の条件などで変わるので、せいぜい無料か有料かの違いくらいしかわからないということなのかもしれませんね。
Amazonのレビュー評価
楽天・Yahoo!ショッピングについては取得できるのですが、Amazonの場合はレビュー評価(星の数)やレビューの数を取得できません。
こちらについても、ユーザーからしてみると一目でわかるようにしたいところなのですが、商品ページ、あるいは商品のレビューページに行って確認するしかありません。
商品ページから直接情報を取得できないのか?
APIから取得できないなら、商品ページから自動的に取得すればいいのではないか?
商品ページを見ればわかる情報なら、アプリで自動的に取得してくれればいいんじゃないかと思いますよね?
実は、技術的には可能です。でも「カイドク」ではそれをしていません。
なぜでしょうか?
Webサイトを自動的に解析して情報を収集する「Webスクレイピング」
「APIで取得できないなら、商品ページをアプリが裏で読み取って取得することはできないの?」
当然の疑問です。
Webサイトの中身をプログラムで自動的に読み取り、必要な情報を抜き出すということは、実は技術的には可能です。
そのような技術は「Webスクレイピング」あるいは単に「スクレイピング」と呼ばれており、さほど難しい技術でもなく、実際にデータ収集などの目的でごく普通に使われているものです。
「スクレイピング」とは、Webページの中身をプログラムで自動的に読み取り、必要な情報だけを抜き出す方法のことです。
たとえば、人間がブラウザで商品ページを開いて、
「商品名はここに書いてある」
「価格はこの部分」
「送料はこのあたり」
「レビュー評価は星4.5」
と目で見て確認する作業を、プログラムに代わりにやらせるようなイメージです。
Webページは、見た目としてはきれいな商品ページに見えますが、裏側ではHTMLという形式のテキスト文章でできています。
スクレイピングでは、そのHTMLを取得して、例えば「評価:」という文字の後にある数字が評価値、などというルールに基づいて情報を得ることができます。
ただ先にも述べたように、「カイドク」ではこの方法を使っていません。
事実上、スクレイピングは使うことができないからなんです。
Amazon, 楽天などは利用規約で事実上スクレイピングを禁止している
Amazon.co.jp利用規約には以下のように示されています。
(抜粋)
この利用許可には、アマゾンサービスまたはそのコンテンツの転売および商業目的での利用、製品リスト、解説、価格などの収集と利用、アマゾンサービスまたはそのコンテンツの二次的利用、第三者のために行うアカウント情報のダウンロードとコピーやその他の利用、データマイニング、ロボットなどのデータ収集・抽出ツールの使用は、一切含まれません。
長くなるので一部抜粋しただけですが、スクレイピングは「ロボットなどのデータ収集・抽出ツールの使用」に該当します。
つまり、スクレイピングをすることは「利用を許可しません」と言っているわけです。
楽天ショッピングサービスご利用規約にも以下のような記載があります。
1. お客様は、本サービスの利用において以下の各号に定める行為をしてはならないものとします。
<略>
(7) 当社の事前の許可を得ることなく、自動化された手段(自動購入ツール・ロボットなどこれらに準ずる手段)を用いて商品を購入すること(商品ページ上の情報取得等を含む)
スクレイピングは「自動化された手段」に該当します。そして、そのスクレイピングによる商品ページ上の情報取得は禁止されているということになります。
「カイドク」ではAPIを使用しているということは、Amazonや楽天などの規約には同意済みです。
個人的にも筆者はAmazon, 楽天, Yahoo!ショッピングの会員ですので、当然それらの規約には同意済みです。
そういうわけで、少なくとも明確に規約で禁止されている以上、Amazonや楽天などでスクレイピングによる情報収集はできないというわけです。
著作権を侵害してしまうリスクがある
Webサイトのコンテンツは、通常はそのサイトの運営者やそのサイトを利用している第三者が著作権を持っています。
例えば、ヨドバシ.comの規約では、以下のように明記されています。
特に他の説明が無い限り、本ホームページ上にディスプレイされる内容は全て著作権法上の保護対象になっています。本条件や本ホームページ上の断り書きで許可される場合を除いて、ヨドバシカメラおよび著作権法上のその他の著作権者から書面による許可を得ずにこれらの著作物を非商業的かつ個人的な目的以外で、使用、複製またはダウンロード(以下「使用」といいます)をしないで下さい。
(抜粋)
商品の情報が著作物になるかどうかは議論が分かれるところかもしれませんが、少なくともヨドバシ.comの規約では、ホームページ上に表示される内容をスクレイピングで取得し、(不特定多数が閲覧可能な)Webサイトやアプリの画面に表示することは許されていません。
「カイドク」では、Webサービスから取得した情報をアプリの画面上に表示するという性質から、ほとんどのWebサイトでこの制限にひっかかります。
以上の2点が、「カイドク」でスクレイピングを使わない主な理由となります。
ヨドバシ.comやメルカリなどはAPIを公開していない
「カイドク」を開発するにあたり、妥協せざるを得なかった機能の1つが「検索できるネットショップはAmazon, 楽天, Yahoo!ショッピングだけ」ということです。
その理由はシンプルに、筆者の知る限り、日本国内の大手のネットショップでAPIを公開しているのはこの3社だけだからです。
ここまで述べてきたように「カイドク」ではAPIによる情報収集しか行いません。
そのため、必然的にAPIを公開していないネットショップには非対応となってしまっています。
例えば価格.comみたいな大手の比較サイトなどは、様々なネットショップの商品データを表示していますよね?
おそらく、あのような大手では、各ショップ・メーカーと個別な契約をして(非公開の)APIやその他なんらかの手段で情報をもらえることになっているのだと思います。筆者の勝手な推測ですが。
ちなみに、筆者(= 「カイドク」開発者)は個人事業の週末エンジニアであり、そのような契約を結ぶようなことはちょっと考えられないです。。。
まとめ
ここまで、「カイドク」でAmazon・楽天・Yahoo!ショッピングの商品情報をどのように取得しているのか、そして取得できる情報・できない情報がある理由について説明してきました。
ざっくりまとめると、以下のようになります。
– 商品検索結果は、各サービスが提供しているAPIを使って取得している
– APIで取得できる情報には限りがある
– 送料やAmazonのレビュー評価など、APIでは取得できない情報もある
– ヨドバシ.comやメルカリなどは、利用できる公式APIがないため対応が難しい
「ヨドバシ.comの価格も見たい」「送料込みで比較したい」「レビュー評価も見たい」といったご要望は、開発者としても非常によくわかりますし、できることなら実現したい機能です。
ただ、アプリとして公開している以上、各サービスのルールを守りながら、継続して安全に使える形で提供する必要があります。そのため、各サービスの公式のAPIで取得できる範囲の情報に限定して表示しています。
少し言い訳っぽい記事になってしまいましたが、「なぜ表示できない情報があるのか」「なぜ対応できないショップがあるのか」について、少しでも伝われば幸いです。
今後、各サービスのAPIで取得できる情報が増えたり、新たに利用可能なAPIが公開されたりした場合には、「カイドク」でも対応を検討していきたいと思います。

これが「カイドク」でAmazonの商品表示にレビュー評価の星を表示できない理由です。
つまり、APIで取得できない情報は、ほかに取得する手段がないので表示もできないということになります。