Beautiful Soupを使ってAmazon Web Service
#!/usr/bin/env python # -*- coding: utf-8 -*- import urllib2 from BeautifulSoup import BeautifulStoneSoup class AmazonClient(): """ タイトルで検索 """ TITLE = "Title" """ 著者名で検索 """ AUTHOR = "Author" """ ISBNで検索 """ ISBN = "ISBN" # amazon URL __amazonUrl = "http://webservices.amazon.co.jp/onca/xml" # request default params __request_params = ("Service=AWSECommerceService", "AWSAccessKeyId=ACCESS_KEY_ID", "Operation=ItemSearch", "SearchIndex=Books", "ResponseGroup=Large", "ReviewPage=1") def __init__(self, searchParameters = {TITLE: "python"}): """ 初期化 """ self.request = self.__amazonUrl + "?" + "&".join(self.__request_params) if searchParameters: for key in searchParameters.keys(): self.request += "&" + "%s=%s" % (key, searchParameters[key]) def doRequest(self): """ リクエストする """ xml = urllib2.urlopen(self.request).read() soup = BeautifulStoneSoup(xml) items = soup.find("items") bookList = [] for item in items: if item.itemattributes: book = self.__createBookData(item) bookList.append(book) return bookList def __createBookData(self, item): if not item or not item.itemattributes: return else: book = BookData() if item.smallimage and item.smallimage.url: book.smallimageUrl = item.smallimage.url.contents[0] if item.mediumimage and item.mediumimage.url: book.mediumimageUrl = item.mediumimage.url.contents[0] if item.itemattributes.largeimage and item.largeimage.url: book.largeimage = item.largeimage.url.contents[0] book.title = item.itemattributes.title.contents[0] if item.itemattributes.findAll("author"): nameList = [] for name in item.itemattributes.findAll("author"): nameList.append(name.contents[0]) if len(nameList) > 0: book.author = ",".join(nameList) if item.itemattributes.isbn: book.isbn = item.itemattributes.isbn.contents[0] if item.customerreviews and item.customerreviews.averagerating: book.averagerating = item.customerreviews.averagerating.contents[0] if item.customerreviews: reviewList = [] for review in item.customerreviews.findAll("review"): reviewData = ReviewData() reviewData.rating = review.rating.contents[0] reviewData.summary = review.summary.contents[0] content = review.content.contents[0] reviewData.content = content.replace("<br />", "") reviewList.append(reviewData) book.reviewList = reviewList return book """ 本データ """ class BookData(): __to_str = "[タイトル: %s \r\n 著者: %s \r\n ISBN: %s]" def __init__(self): self.smallimageUrl = "" self.mediumimageUrl = "" self.largeimageUrl = "" self.title = "" self.author = "" self.isbn = "" self.price = 0 self.averagerating = 0.0 self.reviewList = [] def __str__(self): return BookData.__to_str % (self.title, self.author, self.isbn) """ レビューデータ """ class ReviewData(): __to_str = "[評価: %s \r\n タイトル: %s \r\n 本文: %s]" def __init__(self): self.rating = 0.0 self.summary = "" self.content = "" def __str__(self): return ReviewData.__to_str % (self.rating, self.summary, self.content) if __name__ == "__main__": params = {AmazonClient.AUTHOR: "東野圭吾"} client = AmazonClient(params) bookList = client.doRequest() for book in bookList: print book print
ACCESS_KEY_IDを自分のに変えるとちゃんと検索できる。
レビューもちゃんととれるし、日本語でも検索できる。
すばらしい、こんなに簡単にできる。
__request_paramsのパラメータを変えれば本以外や出版社等色々な条件できる。
[参考]
Amazon Web サービス入門
http://www.ajaxtower.jp/ecs/
http://d.hatena.ne.jp/aidiary/20081220/1229787394
cgiでhello worldを出力してみる。
#!/usr/local/bin/python # -*- coding: utf-8 -*- import cgi import cgitb; cgitb.enable() print "Content-Type: text/html" print print "hello world."
cgitb.enable()でエラー詳細を表示してくれるらしい。
動かしてみる。
http://www13.atpages.jp/makarohiraki/cgi/sample_cgi.cgi
XMLも表示してみる。
#!/usr/local/bin/python # -*- coding: utf-8 -*- import cgi import cgitb; cgitb.enable() form = cgi.FieldStorage() param = form.getvalue("key", "default_value") print "Content-Type: text/xml" print print "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" print "<list>" print " <item>" print " <name>%s</name>" % param print " </item>" print "</list>"
cgi.FieldStorage()で取ったformからパラメータ取得可能。
getvalue(キー, キーが存在しない場合のデフォルト値)
動かしてみる。
key指定
http://www13.atpages.jp/makarohiraki/cgi/sample_cgi2.cgi?key=hello_world
key指定なし
http://www13.atpages.jp/makarohiraki/cgi/sample_cgi2.cgi
簡単すぎる。
すごすぎるBeautiful Soup
pythonでxml,htmlの解析をする。
・Beautiful Soup
http://www.crummy.com/software/BeautifulSoup/
ダウンロードした「BeautifulSoup.py」をソースが読める場所に置く。
site-packagesに置くのが一般的?
使い方は公式サイトにあるドキュメント
http://www.crummy.com/software/BeautifulSoup/documentation.html
試しにyahoo newsのrssをパースする。
#!/usr/bin/env python # -*- coding: utf-8 -*- import urllib2 from BeautifulSoup import BeautifulStoneSoup url = "http://headlines.yahoo.co.jp/rss/spnavi.xml" xml = urllib2.urlopen(url).read() soup = BeautifulStoneSoup(xml) channel = soup.find("channel") items = channel.findAll("item") for item in items: print "---------------------" print item print "title: " + item.title.contents[0] print "---------------------" print
タグを含めないで値だけを取得したい場合はxxx.contents[0]をする。