或阿呆のブログ

Pythonを好んで使っているプログラマです。Ruby,Perl,PowerShell,VBAなどでもたまに書いています。最近はスロット放浪記やってます。。

Net::Amazonを使って、Product Advertising API にアクセス。Amazon アソシエイト(アフィリエイト)用の情報を取得する。

AmazonProduct Advertising API を使ってAmazonアソシエイト(アフィリエイト)用の情報を取得しようと試行錯誤してわりとハマったのでメモ。これ系の処理って自前で作ろうとすると必ずしも簡単ではないのだが、CPANにはNet::Amazonという良いモジュールが転がっているので、それを使うことにする。実は、以前使ったことがあって、動作確認済みなので、Amazon側の仕様変更やNet::Amazonの仕様変更が無ければそのまま動くはず。

動作環境

Linux14
#Win環境、特にDOSなんか使っている文字化けすると思われるのでそこは注意。

必要なモジュール

今回は簡単な処理だけなので、これだけ。

サンプルコード

基本的には、CPANの以下のURLのusageに書いてある通りに書けばいいんだけど、ちょっと古い情報のようでそのままだと動かない。
http://search.cpan.org/~boumenot/Net-Amazon-0.62/lib/Net/Amazon.pm

$cat amazon_ranking.pl
#!/usr/bin/perl
use strict;
use warnings;
use Net::Amazon;

my $keyword_ = shift(@ARGV);
print $keyword_,"\n";

my $ua = Net::Amazon->new(
  token      => '###',
  secret_key => '###',
  associate_tag => '###-22',
  locale     => 'jp',
  max_pages  => 1,
);

my $res_rank = $ua->search(
  keyword => $keyword_,
  mode    => 'books',
  browsenode => 465610,
#  sort    => 'salesrank',
);

if ( $res_rank->is_success() ) {
    for ( $res_rank->properties ) {
        print $_->ProductName;
        print "\n";
    }
}
  • tokenとsecret_keyは自分のものを入れて下さい。###のところ。
  • associate_tagは入れないと実行時エラーになる。hogehoge-22みたいな奴。これは入れてください。
  • localeは'jp'を指定する。海外のサービスを使いたい場合はこの限りにあらず。

usage

実は取得結果のほうがなんだか不可解だったりする。そもそもAmazonから返却されるデータだから、いくら正しいコードでも、欲しい情報が手に入るとは限らない。なので、キーワードの指定方法などを考えてチューニングの必要があると思う。

$./amazon_ranking.pl perl
perl
Wide character in print at ./amazon_ranking.pl line 26.
いきなりはじめるPHP~ワクワク・ドキドキの入門教室~
Wide character in print at ./amazon_ranking.pl line 26.
リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)
Wide character in print at ./amazon_ranking.pl line 26.
体系的に学ぶ 安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践
Wide character in print at ./amazon_ranking.pl line 26.
JavaScript 第6版
Wide character in print at ./amazon_ranking.pl line 26.
「プロになるためのWeb技術入門」 ――なぜ、あなたはWebシステムを開発できないのか
Wide character in print at ./amazon_ranking.pl line 26.
Pythonスタートブック
Wide character in print at ./amazon_ranking.pl line 26.
よくわかるPHPの教科書
Wide character in print at ./amazon_ranking.pl line 26.
JavaScript本格入門 〜モダンスタイルによる基礎からAjax・jQueryまで
Wide character in print at ./amazon_ranking.pl line 26.
たのしいRuby 第3版
Wide character in print at ./amazon_ranking.pl line 26.
ゲシュタルト療法―その理論と実際

まず、検索結果がおかしい。Perlに関連のある語句が幅広く抽出されているようだ。

あと、

Wide character in print at ./amazon_ranking.pl line 26.

このエラーがウザいので、標準エラー出力を出さないように実行してやると便利。
こんな感じで。

$(./amazon_ranking.pl perl) 2>/dev/null
perl
いきなりはじめるPHP~ワクワク・ドキドキの入門教室~
リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)
体系的に学ぶ 安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践
JavaScript 第6版
「プロになるためのWeb技術入門」 ――なぜ、あなたはWebシステムを開発できないのか
Pythonスタートブック
よくわかるPHPの教科書
JavaScript本格入門 〜モダンスタイルによる基礎からAjax・jQueryまで
たのしいRuby 第3版
ゲシュタルト療法―その理論と実際

Perlというキーワードを指定したのに、JavaScriptやらPythonやらが出てくるのは、単一キーワードだと精度が低いからだと思われる。複合キーワードにしてやると、もうちょっとましな答えが返却される。

$(./amazon_ranking.pl "perl プログラミング") 2>/dev/null
perl プログラミング
WEB+DB PRESS 総集編 [Vol.1〜60]
JavaScript本格入門 〜モダンスタイルによる基礎からAjax・jQueryまで
初めてのPerl 第6版
JavaによるRESTfulシステム構築
Apache Solr入門 ―オープンソース全文検索エンジン
Spidering hacks―ウェブ情報ラクラク取得テクニック101選
Ruby技術者認定試験 公式ガイド (ITpro BOOKs)
もっと自在にサーバを使い倒す 業務に役立つPerl (Software Design plus)
R言語逆引きハンドブック
初めてのPerl

日本語を入力してもしっかりと動作する。内部処理でエンコーディングしているようなんで。

$(./amazon_ranking.pl "村上 春樹 文庫") 2>/dev/null
村上 春樹 文庫
アンドロイドは電気羊の夢を見るか? (ハヤカワ文庫 SF (229))
ライ麦畑でつかまえて (白水Uブックス)
1Q84 BOOK 3
一九八四年[新訳版] (ハヤカワepi文庫)
1Q84 BOOK3〈10月‐12月〉後編 (新潮文庫)
1Q84 BOOK2〈7月‐9月〉前編 (新潮文庫)
1Q84 BOOK2〈7月‐9月〉後編 (新潮文庫)
1Q84 BOOK3〈10月‐12月〉前編 (新潮文庫)
グレート・ギャツビー (村上春樹翻訳ライブラリー)
1Q84 BOOK 1

それでもまだ変な検索結果が出てくる。そのあたりは本来、キーワードにではなく、著者とか出版社とかに指定してやるべきなんだろう。しっかりとし指定すれば、もっと精度の良い情報が出ると思われる。