Hatena::Groupmpk

 | 

 Amazonの売上ランキングを定期的に自動取得する

この文書は

Amazonの売り上げランキングは、時々刻々変化します。仕事上、担当した書誌のランキングをチェックしますが、これを自動化できないかと考えました。

Perlと、Windowsの「タスク」機能を使って実現できたため、その方法をまとめました。

おやくそく

このページの筆者は、ここで解説した方法を使った、または使わなかったことによる損害について、直接、間接を問わずその責任を一切負いません。

前提となる環境

この文書の方法を使ってAmazonの売り上げランキングを定期的に取得するには、以下の環境が必要になります。それぞれについては解説しませんので、各自で調べてください。

Windows

この文書では、処理の自動化のために、Windowsでプログラムを定期的に実行する「タスク」機能を使います。Windows 98、2000、Me、XPなどのOSであれば、「タスク」もしくは「タスクスケジューラ」機能を使えるでしょう。

Windows以外のOSを使っている場合でも、定期的にプログラムを実行する機能があれば、それを用いて処理を自動化できるかもしれません。ただし、ここではWindows XPでの方法のみ解説します。それ以外のOSでの自動化については、ここでは解説しません。

Perlを実行できる環境

この文書では、Amazonから売上ランキングを取得して出力するために、Perlというスクリプト言語を使います。WindowsでPerlを使うには、Perlの実行環境をインストールする必要があります。

ここでは、その方法は解説しません。すでにPerlを実行できる環境があるものとして解説します。

また、スクリプトはLWP::Simpleモジュールを使います。多くのPerl実行環境では、このモジュールがあらかじめインストールされているでしょう。スクリプトがうまく動かなかったら、「@nifty:@homepage:エラー」などを参考にインストールしておいて下さい。

Perlスクリプトを書く

任意のテキストエディタなどを使って、以下のようなPerlスクリプトを、任意の名前で保存します。ここでは、「amazonrankget.pl」というファイル名で保存したものとして解説します。

#!/usr/bin/perl
#2006/09/05版
use LWP::Simple;

foreach ( @ARGV ){ #コマンドラインで指定された複数の引数をすべて処理する

#■HTMLファイルを取得
$text=get ("http://www.amazon.co.jp/exec/obidos/ASIN/".$_);

#■取得したHTMLファイル内、下では「4,891」の部分を取り出す
#<b>Amazon.co.jp ランキング:</b> 本で4,891位 (<a href="/gp/bestsellers/books/ref=pd_dp_ts_b_1/000-0000000-0000000">本のベストセラー</a>を見る)

#▼下の行は随時更新します

$text=~s|.*:</b> [^\d]*([0-9,]+).*<a href="/gp/bestsellers/books.*|$1|s;

#■ランキングを、時刻とともにテキストファイルに上書き出力

#時刻の取得
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$year += 1900;
$mon += 1;
$now = sprintf("%04d/%02d/%02d %02d:%02d:%02d",$year,$mon,$mday,$hour,$min,$sec);

#出力する行(「yyyy/mm/dd hh:mm:ss」というフォーマットの現在時刻+タブ+順位+改行)
$out = $now."\t".$text."\n";

#ファイル出力
open(OUT,">> ".$_.".txt");
print OUT $out;
close(OUT);

}

スクリプトの更新について

「#▼下の行は随時更新します」に該当する行は、Amazonが出力するHTMLの仕様が変わるのに対応するために、随時更新しています。順位をうまく取得できず、ページのHTMLがすべて出力されてしまう場合に、この行が変更されていないかチェックしてみてください。

2005/07/28に更新するまでの内容
$text=~s|.*</b>\n([0-9,]+)\n</font>\n<br>\n<b><a href=/gp/slides/make-money.html>.*|$1|s;
2005/08/21に更新するまでの内容
$text=~s|.*</b> ([0-9,]+)</font>\n<br>.*|$1|s;
2006/09/05に更新するまでの内容
$text=~s|.*<a href=/exec/obidos/tg/new-for-you/top-sellers/-/books/all>[^\d]*([0-9,]+).*|$1|s;
2007/07/02に更新するまでの内容
$text=~s|.*:</b>\n [^\d]*([0-9,]+)[^\d]* \n.*|$1|s;

Perlスクリプトの動作テスト

作成したPerlスクリプトがうまく動くか、テストしてみます。コマンドプロンプトを開き、「perl amazonrankget.pl 4767804183」と実行してみましょう。これは、「ISBNが4767804183の本のAmazonランキングを取得する」ことになります。ちなみにISBN:4767804183は『スペースシャトルの落日』という本です。私が担当しました。よろしくね。

「amazonrankget.pl」と同じフォルダに、「4767804183.txt」といったファイルが作られたでしょうか。もし作られなければ、スクリプトの入力内容が間違っていないか、確かめてみましょう。

「4767804813.txt」が無事作られていたら、それをテキストエディタなどで開いてみます。「2005/04/20 18:00:00  4,891」というように、日付と時刻、スクリプトの実行時のランキングが1行に書かれていれば、スクリプトはきちんと動いていることになります。これで、Perlスクリプトの実行テストは完了です。「4767804183.txt」は編集せず、そのまま閉じます。

もう一度「perl amazonrankget.pl 4767804183」と実行し、改めて「4767804183.txt」を開いてみましょう。次のような内容になっているでしょうか。

2005/04/20 18:00:00  4,891
2005/04/20 18:01:00  4,891

スクリプトの実行時刻と、その時点でのAmazonのランキングが次の行に追記されていれば、スクリプトはきちんと動作していることになります。

バッチファイルを書く

次に、Perlスクリプトをプログラムとして実行するためのバッチファイルを作ります。Perlスクリプト「amazonrankget.pl」と同じフォルダに、次の内容のファイル「amazonrankget.bat」をテキストエディタなどを使って作ります。

perl amazonrankget.pl 4767804183

1行だけですが、これでOKです。

バッチファイルの動作テスト

「amazonrankget.bat」がきちんと動くか確認してみましょう。「amazonrankget.bat」のアイコンをダブルクリックしてみます。先ほどと同じように、「4767804183.txt」を開いてみます。次のような内容であれば、バッチファイルはきちんと動いていることになります。

2005/04/20 18:00:00  4,891
2005/04/20 18:01:00  4,891
2005/04/20 18:05:00  4,891

このように、日付と時刻、その時点でのAmazonのランキングがさらに追記されていればOKです。

複数の本のランキングを取得するには

複数の本のランキングをまとめて取得したいときは、「amazonrankget.bat」の内容を編集します。

perl amazonrankget.pl 4767804183 4767802512

のように、半角スペースで区切って複数のISBNを連ねていきます。「amazonrankget.bat」を実行するたびに、「4767804183.txt」や「4767802512.txt」といったテキストファイルに、それぞれの本の売上ランキングが追記されていきます。

「タスク」の設定

バッチファイルを実行するたびに、実行時点のAmazonランキングがテキストファイルに追記されていくようになりました。最後に、このバッチファイルが定期的に実行されるように設定しましょう。

この設定方法は、Windowsによくあるウィザードです。ある程度慣れた方なら、見れば設定方法がわかるでしょう。

ひとまずここでは、売上ランキングを毎日1時間おきに取得し、またすぐに取得を始める場合の設定方法を解説します。

  1. Windowsのコントロールパネルの「タスク」を開きます。
  2. 「スケジュールされたタスクの追加」をダブルクリックします。
  3. 「タスク ウィザード」ダイアログボックスが表示されます。[次へ]をクリックします。
  4. 「タスク ウィザード」ダイアログボックスに「実行するプログラムを1つ選択してください」と表示されます。[参照]ボタンをクリックします。
  5. 「実行するプログラムを選択してください」というファイル選択ダイアログボックスが表示されます。「amazonrankget.bat」を選択し、[開く]ボタンをクリックします。
  6. 「タスク ウィザード」ダイアログボックスに戻り、「このタスクの名前を入力してください」と表示されます。「amazonrankget」という入力欄には、自分でわかりやすい名前を入れられます。
  7. 「このタスクの実行」では、Amazonの売上ランキングを取得したい間隔を指定します。最短が「日単位」ですが、毎日1時間おきに取得するよう、あとで細かく設定できます。ここは「日単位」を指定して[次へ]をクリックします。
  8. 「このタスクを開始する日時を選択してください」と表示されます。すでに現在の日時が入力され、「このタスクの実行」として「毎日」が指定されています。このまま[次へ]をクリックします。
  9. 「ユーザー名とパスワードを入力してください」と表示されます。[ユーザー名]欄には現在ログオンしているユーザー名が入力されています。このまま、現在のユーザーのパスワードを2個所に入力して、[次へ]をクリックします。(別のユーザー名を入れておくと、タスクをバックグラウンドで実行できるのかもしれません。のちほど試してみます)
  10. 「[完了]をクリックしたときに詳細プロパティを開く」のチェックボックスにチェックを入れて、[完了]をクリックします。
  11. タスクのプロパティのダイアログボックスが表示されます。[スケジュール]タブの[詳細設定]ボタンをクリックします。
  12. [スケジュール オプションの詳細設定]ダイアログボックスが表示されます。[タスクを繰り返し実行]のチェックボックスにチェックを入れます。
  13. [間隔]欄を「1時間」とします。[継続時間]を「23時間59分」としておけば、「amazonrankget.batを実行する」というタスクは毎日、1時間間隔で実行されます。
  14. [OK]ボタンをクリックします。
  15. タスクのプロパティのダイアログボックスに戻ります。「設定日」にタスクの実行間隔が表示されています。正しく設定されているかはここで確認できるでしょう。

タスクのプロパティの設定を変えれば、ランキングの取得ペースを調整できます。

バッチファイルがバックグラウンドで実行される方法(案)

別のアカウントで指定されたタスクは、実行時にウィンドウなどが出ないもようです。

ランキング取得用のアカウントで上記の「タスク」を設定しておけば、バッチファイルはバックグラウンドで処理されるようです。

少なくとも筆者の環境ではそのようにできていますが、検証が不十分なため「案」にとどめておきます。


これで完了です

以上で、Amazonの売上ランキングを毎日、1時間おきに取得する設定ができました。パソコンの電源が入っている間は、1時間おきにバッチファイルがフォアグラウンドで実行されます。


そのほかの方法

ここでは、PerlスクリプトをWindowsの「タスク」機能で自動実行させました。

Amazonからは、より正確に、また詳細な情報を取得する方法として「Amazon Webサービス」も提供されています。ここでは、売上ランキングだけを簡易に取得する方法として紹介しています。

ほかにも、次のような方法で、Amazonの売上ランキングを自動取得できるようです。

Amazon売り上げランキングのWebクエリ習作

ExcelのWebクエリとマクロを使って、Amazonの売り上げランキングを定期的に取得できます。

更新履歴と今後の予定

  • 2005/04/20:作成
  • 2005/04/21:複数のISBN/ASINをまとめて取得できるようにする
  • 2005/07/28:Amazonが出力するHTMLの変更に合わせてソースリストを変更
  • 2005/08/21:Amazonが出力するHTMLの変更に合わせてソースリストを変更
  • 2006/09/05:Amazonが出力するHTMLの変更に合わせてソースリストを変更、バックグラウンドで処理する方法の案を掲載
  • 2007/07/02:Amazonが出力するHTMLの変更に合わせてソースリストを変更
  • 2007/07/04:Amazonが出力するHTMLの変更に合わせてソースリストを変更
 |