クエリ文字列をURLに付け加えるには、urllib.parseモジュールのurlencode関数を使うのが簡単だ。この基本構文を以下に示す(より詳細な構文についてはPythonのドキュメント「urllib.parse.urlencode」を参照のこと)。
urllib.parse.urlencode(queryparam)
queryparamに指定した辞書または2要素のタプルを要素とするシーケンスをパーセントエンコードされた文字列に変換する。
パラメーター | 説明 |
---|---|
queryparam | キー/値を要素とする辞書オブジェクトか、(キー、値)というタプルを要素とするシーケンス(リストなど) |
urllib.parse.urlencode関数のパラメーター |
実際の使用例を以下に示す。
param1 = {'foo': 'フー', 'bar': 'bar'} # 辞書形式
param2 = [('foo', 'foo'), ('bar', 'バー')] # 2要素のタプルを要素とするリスト
print(urllib.parse.urlencode(param1))
print(urllib.parse.urlencode(param2))
実行結果を以下に示す。
このようにクエリ文字列に使える文字列が生成されるので、これをURLに付加することでそのパラメーターを指定したURLをオープンできるようになる(ただし、urlencode関数では「?」は生成されないので、自分で付加する必要がある)。以下に例を示す。
url = 'https://www.example.com'
params = {'foo': 'FOO', 'bar': 'BAR'}
response = urllib.request.urlopen(f'{url}?{urllib.parse.urlencode(params)')
content = response.read()
response.close()
print(response.geturl())
実行結果を以下に示す。geturlメソッドの戻り値にクエリ文字列が含まれていることに注目しよう。
urlopen関数を使って、HTTP POSTメソッドを送信することも可能だ。これには、urlに加えてdataパラメーターを指定する。
urlopen(url, data)
urlに対して、HTTP POSTメソッドを送信する。POSTするデータはdataに指定する。
パラメーター | 説明 |
---|---|
url | オープンしたいURL |
data | サーバに送信する追加のデータ |
urllib.request.urlopen関数のパラメーター(一部) |
このとき、dataは上で作成したクエリ文字列をバイト列化したものである必要がある。
以下に例を示す。
url = 'https://www.example.com'
params = {'foo': 'FOO', 'bar': 'BAR'}
data = urllib.parse.urlencode(params).encode()
response = urllib.request.urlopen(url, data)
content = response.read()
response.close()
print(response.geturl())
このコードでは先ほどと同じパラメーターをurlencode関数でURLエンコードして文字列化し、さらにそれをencodeメソッドでバイト列に変換している。そして、URLと作成したデータをurlopen関数に渡して呼び出している(実行結果は省略する)。
さらに詳細にリクエストを制御したいときには、urllib.request.Requestクラスを使用する。このクラスのインスタンス生成をする際の基本構文を以下に示す(より詳細な構文についてはPythonのドキュメント「class urllib.request.Request」を参照のこと)。
urllib.request.Request(url, data=None, headers={}, method=None)
指定したurl、data、headers、methodを表すリクエストオブジェクトを生成する。
パラメーター | 説明 |
---|---|
url | リクエストの送信先 |
data | サーバに送信する追加のデータ |
headers | リクエストヘッダの値を辞書形式で指定する |
method | HTTPリクエストで使用するメソッドを指定する |
Requestオブジェクト生成時のパラメーター |
例えば、先ほどのPOSTメソッドを実行するリクエストは、Requestクラスを使うと次のように書ける。
url = 'https://www.example.com'
params = {'foo': 'FOO', 'bar': 'BAR'}
data = urllib.parse.urlencode(params).encode()
req = urllib.request.Request(url, data, method='POST')
response = urllib.request.urlopen(req)
content = response.read()
response.close()
print(response.geturl())
PUTメソッドやDELETEメソッドを送信したいときには、Requestクラスを使ってリクエストを組み立てることになるので覚えておこう。
また、標準ライブラリではないが、より使いやすいRequestsパッケージもある。これについては機会を見て紹介したいと思う。
今回はファイルと同様、readメソッドなどを利用してWeb上のリソース(Webページ)を取得可能なurllibモジュールの基本について見た。urllibモジュールは今回紹介しただけではなく、Basic認証やクッキー処理など、より高度な機能も提供しているので、興味のある方はPythonのドキュメントを参照されたい。次回はこれを利用してWebページを取得して、そこからデータをスクレイピングする方法について簡単に見る予定だ。
Copyright© Digital Advantage Corp. All Rights Reserved.