ISBNさえあれば、AmazonのWebサービスを使って何でもできるなぁと考えていました。ところが、そもそもそのISBNのリストをどうすれば取得出来るかと頭を捻っていました。Amazon内をクロールして収集しようかなと思ったものの、その場合全てを集めているかの保証はないのでと思っていました。で、先日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に並んでお勧めの一冊です。
Amazon Hacks 世界最大のショッピングサイト完全活用テクニック100選
- 作者:ポール・ボシュ
- 発売日: 2004/04/24
- メディア: 単行本