Pythonの基礎 WebAPIを使ってみる YahooAPI(ショッピング、カテゴリランキング編)その2 urllib
YahooAPIを使ってみる その2
さて、前回はコードと結果の紹介、それからif __name__ …を考えてみました。
今回も参考にさせてい頂いたサイトはこちら
http://bty.sakura.ne.jp/wp/archives/787
ソースの引用をさせてい頂きますが、どうやらコメントを受けてつけておられないようで、いずれ気づいて頂けたらと思います。
では今回から本格的に中身を見ていきます。
pythonの勉強を続けてきて、JSONも何となく分かるようになってきました。
では続きをいきましょう。
その前に今回のファイルは二つの関数に別れています。
- def yapi_topics():
- def do_json(s):
このうちのyapi_topics()を取り上げたいと思います。
urllibって何??
import sys import urllib import json
いきなり分からないモジュールをimportしています - import sys - import urllib の二つを初めて見ました。
sysの方はとりあえず置いておいて。 urllibを見ていきましょう。
urllibという名前からなんとなく想像はできるのだが
その名の通り、urlについてのライブラリということでしょうか。
日本Pythonユーザ会にはこのように書いてあります。 http://docs.python.jp/2/library/urllib.html?highlight=urllib#module-urllib
このモジュールはワールドワイドウェブ (World Wide Web) を介してデータを取り寄せるための高レベルのインタフェースを提供します。特に、関数 urlopen() は組み込み関数 open() と同様に動作し、ファイル名の代わりにファイルユニバーサルリソースロケータ (URL) を指定することができます。
まあ要するに、web上のアクセス、URLを指定したアクセスに使えるということでしょうね。 引用文にある、open()と同様に動作し、というのがいいですね。
では、それをどうやって使っているのか???
Yahoo APIの使い方を確認してみます
WebAPIの使い方(GETリクエスト)
http://developer.yahoo.co.jp/appendix/request/rest/get.html からの引用です。
Web APIへのパラメーターの渡し方 Web APIは渡されたパラメーターによって出力が変わります。 パラメーターを渡すには、クエリーストリングと呼ばれる形式に変換する必要があります。 クエリーストリングは以下の順序で作ります。
1 Web APIドキュメントをもとに、必要なリクエストパラメーターと、渡したい文字列を書き出します。
sentence 明鏡止水
2 パラメーター名と、パラメーターの値をそれぞれパーセントエンコーディング形式に変換します。
sentence %E6%98%8E%E9%8F%A1%E6%AD%A2%E6%B0%B4
3 変換結果を「=」で連結します。このときに使う「=」は、エンコードしてはいけません。
sentence=%E6%98%8E%E9%8F%A1%E6%AD%A2%E6%B0%B4
4 各パラメーターについて1~3を行い、最後に「&」で連結します。この「&」もエンコードしてはいけません。
appid=YOUR_APPID&sentence=%E6%98%8E%E9%8F%A1%E6%AD%A2%E6%B0%B4
たとえばPHPの場合、http_build_query(外部リンク)という標準関数で簡単にクエリーストリングを作ることができます。GETの場合、URLの末尾にクエリーストリングを「?」で連結することでパラメーターを渡します。
クエリーストリング以外の形式をサポートするケースもありますので、各Web APIのドキュメントもお読みください。
パラメーターの文字コードについて
Web APIのドキュメントに記載がない場合、UTF-8をサポートしています。日本語の文字列などはUTF-8で渡すようにしてください。
難しく考える必要はありません。 GETリクエストはURLに値を設定しますが、そのやり方を説明してくれているわけですね。
- 文字列
- パーセントエンコーディング
- =でつなぐ
- &で連結する
と、こんな感じです。
ここでやっと今回のコードを見てみます。
def yapi_topics(): url = 'http://shopping.yahooapis.jp/ShoppingWebService/V1/json/categoryRanking?' appid = '取得したid' params = urllib.urlencode( {'appid': appid, 'offset':1, 'period':'daily', 'generation':40, 'gender':'male',}) #print url + params response = urllib.urlopen(url + params) return response.read()
ひとつひとつ確認していきましょう。
url
これはYahooデベロッパのページから、ショッピングのカテゴリランキングのページを指定します。
また、今回はJSONでデータを貰うことにしますから、以下のURLを使います。 "http://shopping.yahooapis.jp/ShoppingWebService/V1/json/categoryRanking"
appid
appidですが、事前にyahooから取得しておく必要があります。 クオーテーションの中には、それぞれのidを入れるようにします。
params
ここで、取得したい内容を作ります。 おっと、出ましたね。urllib.urlencode()! ここは何をしているのでしょうか???
どうやら上記のYahooAPIの使い方で見たように、ここで指定したパラメータ、文字列、値などをurlとして使えるようにパーセントエンコードしてくれるようです。 urllibの説明
マップ型オブジェクト、または 2要素のタプルからなるシーケンスを、 “パーセントエンコードされた (percent-encoded)” 文字列に変換して、上述の urlopen() のオプション引数 data に適した形式にします。
マップ型ですが、ここを参照してください。
要するに、辞書型でいいみたいです。
個々ではキーにパラメータ名、値にはyahooAPIが指定する値(または取得を望む値)を設定すればいいですね。
Yahooデベロッパのページより
パラメータ | 値 | 説明 |
---|---|---|
generation | integer | 取得したい年齢の年代を指定。指定無しだと全世代。 |
period | weekly/daily | 週間とデイリーでランキングの期間を指定、指定なしの場合は週間を返す。 |
例えばperiodを指定する時には、weeklyまたはdailyを値として辞書を作ればいいわけです。
urlencodeはkeyと値を=でつなぎ、項目を&でつないでくれる
読んで字のごとしです。
offset=1&period=daily&generation=40&gender=male
みたいな感じにしてくれるんですね。なるほど。
これでGETのためのURLが完成するのでした!
あとはurlopenで「開く」だけ
#urlの部分(最後尾に?がついていることに注意)とparamsを連結させている response = urllib.urlopen(url + params)
先にも書きましたが、
ファイル類似のオブジェクトが返されます
ということなので、responseにはWeb上の情報が入るわけですね。
さて、このresponse、そのまま使う訳ではありません。
このオブジェクトは以下のメソッド: read(), readline(), readlines(), fileno(), close(), info(), getcode(), geturl() をサポートします
ということなので、どうやらread()で読み込んでからJSONの加工に入っていけば良いみたいです。
と、長くなってしまったので、続きは次回!
- 作者: Mark Lutz,夏目大
- 出版社/メーカー: オライリージャパン
- 発売日: 2009/02/26
- メディア: 大型本
- 購入: 12人 クリック: 423回
- この商品を含むブログ (124件) を見る