Emacs上からasinを取ってくるためにスクリプトを書いてみた

最近はブログをはてダラ on Emacs with simple-hatena-modeで書いているんですが、本の情報を引っ張ってくるときにいちいちFirefoxに移動してはまぞう開いて…という作業がだるい。Emacsは統合なんたら環境なのだから、すべてをemacsの上で済ませないと気がすまない。ということでスクリプトを書くことにしました。といってもelispを書けるわけじゃないのでperlで。

はまぞうをスクレイプングで取ってきてWeb::Scraperでぶっこぬいてます。出てくる結果はこんな感じ。二行目のasinを日記のところにコピペすればいいだけなので、簡単。

Excelで学ぶ時系列分析と予測
[asin:4274066665:detail]

マクロ金融政策の時系列分析
[asin:4532133157:detail]

現代時系列分析
[asin:4000227610:detail]

金融・証券のための市場予測と回帰モデル・時系列モデル
[asin:4489005962:detail]

金融時系列データのフラクタル分析
[asin:4811563115:detail]

時系列モデル入門
[asin:4130420224:detail]

状態空間モデリングによる時系列分析入門
[asin:4916092457:detail]

応用経済学のための時系列分析 (応用ファイナンス講座 2)
[asin:4254295871:detail]

経済の時系列分析 (創文社現代経済学選書 2)
[asin:4423895021:detail]

経済・経営時系列分析—ファジィ・カオス・フラクタル・ウェーブレット・2
進木解析の応用 (明治大学社会科学研究所叢書) [asin:456196083X:detail]

以下のコードをhamazouとか名前付けといてパス通しといてchmod +xとかした後で、M-! hamazou 経済の時系列分析とかやると引っ張ってこれます。本があるのにはまぞうから引っ張ってこれないという謎の自体がときどき発生するのですが、めんどくさいのでエラー処理とかほったらかしにしてしまった。

追記
失敗すると20行以上のエラーが出て大変うざいですね。amazonでも同時に調べさせて、amazonのほうで出てこなかったら「はまぞうが失敗したよ」ってエラーをはかせるようにするか。あ、でもそれってamazonからスパイダリングしてくればいいんじゃね、って話か。amazonの検索結果のどこにasinの番号が書いてあるのかが分からないんだけどね。

#!/usr/bin/perl
use strict;
use warnings;

use Web::Scraper;
use WWW::Mechanize;
use WWW::Mechanize::DecodedContent;
use Data::Dumper;
use Jcode;

sub url_encode($) {
    my $str = shift;
    $str =~ s/([^\w ])/'%'.unpack('H2', $1)/eg;
    $str =~ tr/ /+/;
    return $str;
}

my @list = @ARGV;
my $search_word = "";

foreach (@list) {
    $search_word = $search_word." ".$_;
}

$search_word = url_encode($search_word);
my $mech = new WWW::Mechanize( autocheck => 1 );

my $url =
  scalar( "http://search.hatena.ne.jp/asinsearch?word="
      . "$search_word"
      . "&type=books-jp" );

$mech->get($url);

my $links = scraper {
    process 'div.asin-item-info>h3', "book[]" => 'TEXT';
    process 'div.asin-item-image>a', "url[]"  => '@href';
    result qw/book url/;
}
->scrape( $mech->decoded_content );

my $asin;

for ( my $i = 0 ; $i < 10 ; $i++ ) {
    print Jcode::convert( $links->{'book'}->[$i], 'euc-jp' ), "\n";
    my $asin = $links->{'url'}->[$i];
    $asin =~ s/(http:\/\/d\.hatena\.ne\.jp\/asin\/)(.*?)/$2/;
    print "[asin:$asin:detail]\n\n";
}

これでemacsで幸せな生活が送れます、やったね!!というわけであさましやっとくか。

新版Perl言語プログラミングレッスン入門編

新版Perl言語プログラミングレッスン入門編