Pythonの学習の過程とか

学習の記録をつけておきましょう。Python3に少しずつ移行していきます。過去の記事のソースを2から3に、、、と考えましたが、新しいことをやったほうがいいですね。

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に値を設定しますが、そのやり方を説明してくれているわけですね。

  1. 文字列
  2. パーセントエンコーディング
  3. =でつなぐ
  4. &で連結する

と、こんな感じです。

ここでやっと今回のコードを見てみます。

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の加工に入っていけば良いみたいです。

と、長くなってしまったので、続きは次回!

初めてのPython 第3版

初めてのPython 第3版