ブックオフオンラインごにょごにょ
ブックオフオンラインは検索結果をRSS配信していて嬉しいんだけどかなりおしい。ブックオフ店舗では新品で買うほどではないものやお気に入りの作家さんの作品をまとめて買うんだけど、ブックオフオンラインのRSSでチェックしようとすると私の場合2桁では済まないRSSを購読しなくてはならない(たぶん)。うざーい。
ってことで、まとめて取得しよう。
調査
ざっとURLを調べた。たぶん全て網羅できていないが今やりたいことは問題ない。
パラメタ | 意味 | 例 |
---|---|---|
sk | 並び順/sorting kind | 00(売れ筋)、50(中古価格が安い) |
st | 状態/status | u(中古) |
q | 問い合わせ/query | 9784756140067(ISBN13)、%2591%25BA%258F%25E3%258F%2574%258E%25F7(文字:村上春樹) |
bg | ジャンル/b? genre | 310101(CD-Jポップ-ポップス)、1211(書籍-情報・通信・コンピュータ) |
pr | 価格/price | -100、100-500、5000- |
スクリプト
Web::ScraperってXPath使えたのね。
#!/usr/bin/perl use strict; use warnings; use utf8; use Readonly; use Encode qw(encode decode_utf8); use YAML::Syck qw(Dump); use LWP::Simple qw(get); use Web::Scraper; use XML::RSS; Readonly my $URL_FEED => 'http://www.bookoffonline.co.jp/feed/'; Readonly my $QUERY_SEARCH => 'search,sk=50,st=u,q='; my $scraper = scraper { process 'img', 'image' => sub { $URL_FEED . $_->{src} }; process '//ul/li[text() =~ /^著者/]', 'author' => \&get_value; process '//ul/li[text() =~ /^定価/]', 'list_price' => \&get_value; process '//ul/li[text() =~ /^中古販売価格/]', 'price' => \&get_value; process '//ul/li[text() =~ /^発売年月日/]', 'release_date' => \&get_value; result 'image', 'author', 'list_price', 'price', 'release_date'; }; my @books; my $rss = XML::RSS->new; while (my $word = <DATA>) { chomp $word; my $xml = get($URL_FEED . $QUERY_SEARCH . key_encode($word)); $rss->parse($xml); foreach my $items (@{$rss->{items}}) { my $item = $scraper->scrape($items->{description}); $item->{title} = $items->{title}; $item->{link} = $items->{link}; $item->{category} = $items->{category}; $item->{published_date} = $items->{pubDate}; push @books, $item; } }; binmode STDOUT, 'encoding(cp932)'; print decode_utf8(Dump(\@books)); sub url_encode { my $value = shift; $value =~ s/([^\w ])/'%' . unpack('H2', $1)/eg; $value =~ tr/ /+/; $value; } sub key_encode { my $value = shift; url_encode(url_encode(encode('cp932', $value))); # :-) } sub get_value { my $node = shift; my ($value) = $node->as_text =~ /:(.+)/; $value =~ s/\s+$//; $value; }; __DATA__ 9784756140067 古川日出男 伊坂幸太郎
hetappi@violet ~/work $ ./boo.pl --- - author: リップマン,スタンリー・B./ラ category: 書籍 image: http://www.bookoffonline.co.jp/feed/../goodsimages/M/001523/0015231320M.jpg link: http://www.bookoffonline.co.jp/display/011,iscd=0015231320 list_price: ¥8,400 price: ¥2,400 published_date: Sun, 12 Aug 2007 11:40:25 +0900 release_date: 2002/01/11 title: C++ Primer 改訂3版-(ASCII Addison Wesley Programming Series) (単行本) - (省略) - author: 古川日出男 category: 書籍 image: http://www.bookoffonline.co.jp/feed/../images/goods/item_m.gif link: http://www.bookoffonline.co.jp/display/011,iscd=0012969704 list_price: ¥1,800 price: ¥851 published_date: Sun, 12 Aug 2007 11:40:26 +0900 release_date: 2005/04/25 title: ベルカ、吠えないのか? (単行本) - author: 古川日出男 category: 書籍 image: http://www.bookoffonline.co.jp/feed/../goodsimages/M/001257/0012575378M.jpg link: http://www.bookoffonline.co.jp/display/011,iscd=0012575378 list_price: ¥2,835 price: ¥851 published_date: Sun, 12 Aug 2007 11:40:26 +0900 release_date: 2001/12/25 title: アラビアの夜の種族-(文芸シリーズ) (単行本) - author: 伊坂幸太郎 category: 書籍 image: http://www.bookoffonline.co.jp/feed/../goodsimages/M/001282/0012826790M.jpg link: http://www.bookoffonline.co.jp/display/011,iscd=0012826790 list_price: ¥660 price: ¥351 published_date: Sun, 12 Aug 2007 11:40:26 +0900 release_date: 2006/02/20 title: 陽気なギャングが地球を回す-(祥伝社文庫) (文庫) - (省略) - author: 伊坂幸太郎 category: 書籍 image: http://www.bookoffonline.co.jp/feed/../goodsimages/M/001262/0012625049M.jpg link: http://www.bookoffonline.co.jp/display/011,iscd=0012625049 list_price: ¥1,785 price: ¥851 published_date: Sun, 12 Aug 2007 11:40:26 +0900 release_date: 2002/07/30 title: ラッシュライフ-(新潮ミステリー倶楽部) (単行本) hetappi@violet ~/work $
もちろんこのまま使うのではなく、入力ははてなの特定の日付に記述したり、必要な項目(著者、題名、価格、リンクあたり)だけ抽出したり、特定の時刻に実行してメールしたり。