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 に乗り換えてみます。