前回のブログ”『10日でおぼえるPython入門教室』の第3日 メモ“で、「Amazon API仕様変更してて、サンプルコードがエラー(ーー;)使えません。。。調べるの面倒なので、今日は寝ます。。。」と書いたんですけど、AmazonのAPIが8月から仕様変更で、「第3日 1限目」がまったく使えないということで、Amazonの現在のAPI仕様調べるの面倒だし、Amazonって普段まったく使わないんで、よく使っている楽天の楽天ウェブサービスでやってみることにしました(^_^)v
第3日 1限目「Amazon APIを使って書籍情報を取得しよう」改め、
楽天ウェブサービスを使って商品情報を取得しよう
楽天ウェブサービスを使う準備
楽天ウェブサービスにいって、デベロッパーIDを取得します。
ソースコードのお約束、で知らなかったこと
if __name__ == "__main__":
このファイルが外部からインポートされて使われる時には「偽」。このファイルのみを直接実行する時は「真」。
そういうことだったのかぁ~。なんでかなって思ってたんですよね(笑)
楽天ウェブサービスのデータをリクエストする
—「デベロッパーID」と検索語句「VQ1015 ENTRY」を入力した場合のURL
http://api.rakuten.co.jp/rws/2.0/rest?developerId=デベロッパーID&operation=ItemSearch&version=2009-04-15&keyword=VQ1015%20ENTRY"
上記コードに、取得した「デベロッパーID」と、「検索したい語句」(keyword=のところ、今回は「VQ1015 ENTRY」)を記述し、このURLをブラウザで開くと、楽天で「VQ1015 ENTRY」を検索した結果がXMLが表示されます。
※「VQ1015%20ENTRY」の「%20」は「スペース」のURLエンコーディング。
—「デベロッパーID」と検索語句「VQ1015 ENTRY」を入力した場合のURLをPythonコード化
「rakuten.py」などで保存して、実行。
※「rakuten_developerId = “0123456789″」の「”0123456789″」は取得したデベロッパーIDに置き換えてください。
#! /usr/bin/env python
# coding: utf-8
import urllib
def main(url):
xmlfile = urllib.urlopen(url)
return xmlfile
if __name__ == "__main__":
rakuten_api_url = "http://api.rakuten.co.jp/rws/2.0/rest?"
rakuten_developerId = "0123456789"
Keywords = "VQ1015%20ENTRY"
url = rakuten_api_url + "developerId=" + rakuten_developerId + "&operation=ItemSearch&version=2009-04-15&keyword=" + Keywords
m = main(url)
print m.read()
楽天ウェブサービスのデータから必要なものを抜き取る
『10日でおぼえるPython入門教室』のサンプルでは、検索結果のヒット件数と商品識別番号をAmazonから抜き取るでしたが、楽天で「VQ1015 ENTRY」の検索結果のヒット件数と商品名ということでやってみました。
Aが検索結果のヒット件数、Bが商品名。
「node+数字」は「root」から、たどった階層です。
#! /usr/bin/env python
# coding: utf-8
import urllib
from xml.etree.ElementTree import ElementTree
def main(url):
xmlfile = urllib.urlopen(url)
tree = ElementTree(file=xmlfile)
root = tree.getroot()
for node1 in root.getchildren():
if node1.tag == "Body":
for node2 in node1.getchildren():
if node2.tag == "{http://api.rakuten.co.jp/rws/rest/ItemSearch/2009-04-15}ItemSearch":
for node3 in node2.getchildren():
if node3.tag == "hits":
print node3.text
elif node3.tag == "Items":
for node4 in node3.getchildren():
if node4.tag == "Item":
for node5 in node4.getchildren():
if node5.tag == "itemName":
print node5.text
if __name__ == "__main__":
rakuten_api_url = "http://api.rakuten.co.jp/rws/2.0/rest?"
rakuten_developerId = "0123456789"
Keywords = "VQ1015%20ENTRY"
url = rakuten_api_url + "developerId=" + rakuten_developerId + "&operation=ItemSearch&version=2009-04-15&keyword=" + Keywords
m = main(url)
※「rakuten_developerId = “0123456789″」の「”0123456789″」は取得したデベロッパーIDに置き換えてください。
実行結果
ファイルを実行すると、以下の検索結果のヒット件数と商品名が抜き出せます。
3 Vista Quest(ビスタクエスト) VQ1015 ENTRY トイデジカメ ブラック Vista Quest(ビスタクエスト) VQ1015 ENTRY トイデジカメ イエロー Vista Quest(ビスタクエスト) VQ1015 ENTRY トイデジカメ ブルー
ここまでくるのに、結構時間かかっちゃいました。。。

ピンバック: 『10日でおぼえるPython入門教室』第3日 2限目メモ » ぐるらん
ピンバック: 正誤表『10日でおぼえるPython入門教室』公式正誤表に載ってない正誤表 » ぐるらん
Python 3.1で勉強中です.このページのおかげで挫折せず,大変役立っています.
3での文法の変更により,
import urllib を
from urllib.request import urlopen
にして,
xmlfile = urllib.urlopen(url)を
xmlfile = urlopen(url)
に替えて,
print … はprint(…)にすることで動きました.
最近はGoogleAppEngineやってるので、3はまだやってないですねぇ~
コメントいただけると、ホント嬉しいです。
これからも気軽にコメントお願いします!!
ピンバック: Ruby1.9でリファクタリングする!楽天ウェブサービスを使って商品情報を取得しよう『10日でおぼえるPython入門教室』第3日 1限目メモ | ぐるらん