プログラマでありたい

おっさんになっても、プログラマでありつづけたい

Amazon ECSでISBNの一覧を取得する方法

 ISBNさえあれば、AmazonのWebサービスを使って何でもできるなぁと考えていました。ところが、そもそもそのISBNのリストをどうすれば取得出来るかと頭を捻っていました。Amazon内をクロールして収集しようかなと思ったものの、その場合全てを集めているかの保証はないのでと思っていました。で、先日Amazon ECSのマニュアルをずっと眺めていると、発行年月日で検索する方法が少しだけ記述してありました。これを使ってぐるぐる回せば、行けるはず。ということで試してみました。

参考:Amazon ECSで発行年月日で検索


特定月のISBNリストを取得するperl

#!/usr/bin/perl

use strict;
use warnings;
use encoding "utf-8";

use Net::Amazon;
use Net::Amazon::Request::Power;

my $token = "yourToken";
my $ua = Net::Amazon->new(token => $token,locale => 'jp');
my $pubdate = shift @ARGV;

my $attr;
$attr->{type}  = "Large";
$attr->{power} = "pubdate:during $pubdate";
$attr->{mode}  = "books";
$attr->{page}  = "1";
$attr->{sort}  = "daterank";
    my $req = Net::Amazon::Request::Power->new(%$attr);
    my $resp = $ua->request($req);

my $totalPages = 1;

for (my $thisPage = 1; $thisPage <= $totalPages; $thisPage++) {
    $attr->{page}  = "$thisPage";
    my $req = Net::Amazon::Request::Power->new(%$attr);
    my $resp = $ua->request($req);
    for ($resp->properties) {
        print $_->Asin(),"\n";
    }
    $totalPages = $resp->total_results()/50;

    #sleep 1;
}

 Net::Amazonを使えば、一回に50個の書籍情報を取得出来ます。total_resultsは、その検索条件で何件ヒットするかです。で、ぐるぐる回す数を決定。


作ったperlで、ISBNのリストを月ごとに吐き出すシェル

#!/bin/sh

DATE=`date '+%m-%Y' --date "-1 month"`

i=1
while [ $i -lt 867 ]
do
  DATE=`date '+%m-%Y' --date "-$i month"`
  echo $DATE
  ./amazon.pl $DATE > $DATE
  i=`expr $i + 1`
done

 多重実行とか考えていないので、結構時間かかります。たぶん数日。
今回の場合、ISBNだけ欲しいので、TypeをSmallをした方が良いでしょう。

 ここ10年だと、毎月平均1900冊くらい出版されているんですね。


Amazon ECSの使い方を体系的に知りたいのならば、オライリーです。Blog Hacksに並んでお勧めの一冊です。