PythonでAmazonの商品ページをパースしてasinから書籍名を取得する

とある理由でPythonでASIN→書籍名変換をしたいと思います。

前はAmazon APIとかいうのがあって楽に取得できた記憶があるんですが、今はどうやら認証の手続きが必要になったらしく、名前も変わっていました。

Product Advertising API

認証にシークレットトークンやらsha256のhmacやらなんやらめんどくさい。これ通常の商品ページに正規表現かける方が楽なんじゃないかと思ったのでやってみました。

metaタグのtitleコンテンツにそれっぽい情報が含まれていたのでそれを取得しました。その内容は以下のようなフォーマットになっていそうです。

Amazon.co.jp: (タイトル): (カンマ区切りの著者リスト): (分類)

(タイトル)や(分類)はそれぞれunicodeの数値参照形式(&#xXXXX;)になっているのでそれを実際のunicode文字列に変換する処理をしています。

やってみてから気が付きましたが、amazonの商品ページは1ページあたりの容量が60KBぐらいあって意外にでかいので、速度がほしい場合はAPIを叩いた方が良いかもしれません。

ページのHTMLの構造が変更された場合動かなくなる可能性があるので注意してください。

#! /usr/bin/python.26
# coding: utf-8

import urllib
import re

def searchBookFromAmazon(asin):
    try:
        conn = urllib.urlopen('http://amazon.jp/dp/' + str(asin))
        
        regexp = re.compile(r'<meta name="title" content="(.*?)".*')
        line = regexp.findall(conn.read())[0]
        
        def ref2uni(s):
            s = s.replace(';', '').replace('&#x', '\u')
            s = eval('u"' + s + '"')
            return s
        
        line = line.split('&#xFF1A; ')[1]
        # 著者名リストに': 'が含まれていると意図どおりに動かない
        # 含まれているケースがあるのかどうかは知らない
        sepindex = line.rindex(': ')
        lst = line[:sepindex], line[sepindex + 2:]
        sepindex = lst[0].rindex(': ')
        lst = lst[0][:sepindex], lst[0][sepindex + 2:], lst[1]
        lst = map(ref2uni, lst)
        return dict(zip(['title', 'author'], lst[:-1]))
    except Exception, e:
        raise e

def main():
    import sys
    if len(sys.argv) < 2:
        print 'usage: %s asin' % __file__
        return
    data = searchBookFromAmazon(sys.argv[1])
    print 'title=%(title)s, author=%(author)s' % data


if __name__ == '__main__':
    main()

実行結果

以下のテストデータでテストしました。うまく行かない例もあるかも。

$ cat Dropbox/dat.txt
4873114616
4893116487
4873113725
1430227907
4839928258
4413003012
4152091312
4022645237
459406194X
4048688782
$ for n in $(cat Dropbox/dat.txt); do python amabook.py $n; sleep 3; done
title=iPhoneアプリケーション開発ガイド ―HTML+CSS+JavaScript による開発手法, author=Jonathan Stark, 増井 俊之, 牧野 聡
title=よくわかるゼロからはじめるJavaScript (よくわかるトレーニングテキスト), author=富士通オフィス機器株式会社
title=Prototype &amp script.aculo.us ―JavaScriptライブラリによるAjaxアプリケーション開発, author=Christophe Porteneuve, 栗山 淳(監訳), 吉田 遼二
title=Pro HTML5 Programming: Powerful APIs for Richer Internet Application Development, author=Peter Lubbers, Brian Albers, Ric Smith, Frank Salim
title=実践!Ajaxフレームワーク Prototype.js/Script.aculo.us, author=沖林 正紀
title=試験にでる英単語―耳から覚える, author=森 一郎
title=これからの「正義」の話をしよう――いまを生き延びるための哲学, author=マイケル・サンデル, Michael J. Sandel, 鬼澤 忍
title=悪人(上) (朝日文庫), author=吉田 修一
title=モムチャンダイエット プレミアム (DVD付き), author=チョン・ダヨン
title=ゴールデンタイム〈1〉春にしてブラックアウト (電撃文庫), author=竹宮 ゆゆこ

エキスパートPythonプログラミング

エキスパートPythonプログラミング