ブックオフオンラインごにょごにょ

ブックオフオンラインは検索結果をRSS配信していて嬉しいんだけどかなりおしい。ブックオフ店舗では新品で買うほどではないものやお気に入りの作家さんの作品をまとめて買うんだけど、ブックオフオンラインのRSSでチェックしようとすると私の場合2桁では済まないRSSを購読しなくてはならない(たぶん)。うざーい。
ってことで、まとめて取得しよう。

調査

ざっとURLを調べた。たぶん全て網羅できていないが今やりたいことは問題ない。

機能 URL例
検索 http://www.bookoffonline.co.jp/feed/search,st=u,q=%2591%25BA%258F%25E3%258F%2574%258E%25F7
新品ランキング http://www.bookoffonline.co.jp/feed/ranking,bg=12
中古ランキング http://www.bookoffonline.co.jp/feed/ranking,bg=12,st=u
パラメタ 意味
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
$

もちろんこのまま使うのではなく、入力ははてなの特定の日付に記述したり、必要な項目(著者、題名、価格、リンクあたり)だけ抽出したり、特定の時刻に実行してメールしたり。