urllib2でWebからデータを取ってくる

急にPythonをいじってみたくなったのでインストールしました。とりあえずECS 4.0からデータを取ってくるスクリプトを書いてみます。

#!python
# vim: fileencoding=utf-8

1行目はPerlと同じです。2行目はソースコード文字コードを指定しています。必要なのはencoding=utf-8の部分だけなんですが、こう書いておくと、Vimソースコードを読み込んだ時に文字コードを認識してくれるそうです。

import urllib
import urllib2

必要なモジュールを読み込みます。

aws_url = "http://webservices.amazon.co.jp/onca/xml?"

Perlと違って変数の頭に $ や @ は付きません。

common_params = {
    "Service"       :"AWSECommerceService",
    "Version"       :"2008-04-07",
    "AWSAccessKeyId":"",
}

共通のパラメータの辞書です。辞書というのはPerlでいうところのハッシュみたいなものです。Perl と違ってキーのクォートを外すことはできません。

params = common_params.copy()
params.update({
    "Operation"     :"ItemSearch",
    "SearchIndex"   :"Books",
    "Keywords"      :"python",
})

共通のパラメータに ItemSearch 固有のパラメータを追加します。辞書に複数のデータを追加するには update() を使います。common_params の方はそのままにしておきたいので、新しい変数に common_params の中身をコピーして、それにデータを追加しています。copy() ではなく代入にすると、一方の中身を変えるともう一方の中身まで変わってしまいます。たぶん Perl でいうところのリファレンス渡しになっているのだと思います。

query = urllib.urlencode(params)

urllib.urlencode() は辞書を引数に取り、データをURLエンコードして "Operation=ItemSearch&Keyword=%83p%83C%83%5C%83%93"というようなクエリ文字列にします。

response = urllib2.urlopen(aws_url + query)
xml = response.read()

urllib2.urlopen で指定したURLにアクセスし、レスポンスオブジェクトを取得します。次にレスポンスオブジェクトから read() で本文を読み込みます。


これまでのを関数にしてみます。

def get_content(access_key, operation, options):
    params = {
        "Service"       :"AWSECommerceService",
        "Version"       :"2008-04-07",
        "AWSAccessKeyId":access_key,
        "Operation"     :operation
    }
    params.update(options)
    query = urllib.urlencode(params)
    url = "http://webservices.amazon.co.jp/onca/xml?" + query
    response = urllib2.urlopen(url)
    return response.read()

xml = get_content(
    "1K6RFH5CWTBQWH0Y6702", 
    "ItemSearch",
    {"SearchIndex":"Books", "Keywords":"Python"}
)

まず引数の渡し方と受け取り方が違います。次に値を返す場合は必ず return が必要です。そして Perl と一番大きく違うのは括弧の代わりにインデントを使うことです。


Perl と比べて自由度は少なく、カッチリした感じです。ただ、できることに差はないようなので、単純に性格に合うかどうかで選んでもいいかもしれません。とりあえず、もう少し触ってみて、合うようなら Python に乗り換えてみます。