「Amazon Product Advertising API」を使わずにAmazonの商品リンクを貼る

Amazon ロゴ
このサイトでは商品の紹介のときに自家製のAmazon商品リンクを貼っています。表示にはAmazonが提供している「Amazon Product Advertising API」を使っているんですが、このAPI、30日以上売上実績がない場合利用出来なくなります。今までは僅かながら売上実績があったので(月に1件とか)それで何とか使えていたんですが、ついに30日以上売上実績がなくなる時が来てしまいまして、表示が出来なくなりました。


一応「Amazon Product Advertising API」の利用に失敗した時はAmazonのデフォルトの商品リンクが表示されるようにしていたのですけど、表示のインパクトの差は歴然ですし、その上Amazonのデフォルトのリンクは広告ブロックの対象になります。広告ブロックされるのは仕方がないことですが、記事の一部分として商品画像を掲載するという意義もあったので、それが表示されない真っ白な状態はちょっとまずい。なんとかしないと。


※ 追記:商品ページのスクレイピングが失敗しているようで、現在上手く後いていません。詳細は文末に


APIを使わずに商品情報を整えることにしました

必要な技術は次の2つです。


  1. ASINから商品画像URLを作成する
  2. 商品ページをスクレイピングしてタイトルなどを取得する


商品画像URLについては、こちらのページを参考にしました。

Amazon の商品画像を取得する

将来的に仕様がかわって画像が取得出来なくなる可能性はありますが、今のところは利用出来ています(上記記事が書かれたのは2013年ですから8年も変わっていないようです)。これで商品画像については解決しました。


タイトルなどはページをスクレイピングして取得するようにしています。スクレイピングについてはこちらの記事などで書いている「Goutte」を使用しています。

LaravelでスクレイピングしてAmazonのおすすめ度を取得【#np2020】 – NOBODY:PLACE

商品の種類によってページの構成が変わるため要素を正しく取得出来ない場合もありますが、おおむね、以下の要素を取得出来ています。


  • タイトル
  • 著者
  • 価格

スクレイピングを使用する場合、対象サイトに無用な負荷を掛ける心配がありますが、商品表示はAWSでキャッシュされるようになっているので、表示回数に比べてスクレイピングの実施回数は非常に少なくなります。なので多分大丈夫(なはず)。



しばらくはこのままで

ブログ記事からAmazonの商品が売れて「Amazon Product Advertising API」が再び使用出来るようになるならそれに越したことは無いのですけど、そもそも大した収入にはなっていませんし、商品画像が表示出来ていれば目的はほとんど果たしたようなものなので、売上の多寡によらず当面はこのままで行こうかなと思っています。

ちなみにさっき上げた記事を見返してみて思い出しましたけど、「Amazonのおすすめ度」取得出来なくなってますね。これもなんらかの方法で取得出来るように工夫出来れば。ちょっとなにがしか試してみます。




追記:商品ページのスクレイピングが失敗する

ローカル環境では上手く動いているのですが、本番環境では商品ページのスクレイピングに失敗するようです。現状、タイトル、著者、価格をスクレイピングで取得しようとしているので、失敗すると画像しか表示されません。なんてこった。ログを見ると「503」を返されているようなので、アクセス頻度やアクセスの仕方を見て体よく遮断されている感じかなと予想しています。なかなか厳しいですね。単純に本番環境の設定が間違っているだけなら良いんですけど……スクレイピングはAmazon規約的には濃いグレーのようなので、そのあたりも含めてもう少し研究してみます。