[Python入門]urllib.requestモジュールによるWebページの取得Python入門(2/2 ページ)

» 2019年10月15日 05時00分 公開
[かわさきしんじDeep Insider編集部]
前のページへ 1|2       

urlencode関数によるクエリ文字列の作成

 クエリ文字列をURLに付け加えるには、urllib.parseモジュールのurlencode関数を使うのが簡単だ。この基本構文を以下に示す(より詳細な構文についてはPythonのドキュメント「urllib.parse.urlencode」を参照のこと)。

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))

urlencode関数によるクエリ文字列の作成

 実行結果を以下に示す。

実行結果 実行結果

 このようにクエリ文字列に使える文字列が生成されるので、これを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())

クエリ文字列を含んだURLをオープンする

 実行結果を以下に示す。geturlメソッドの戻り値にクエリ文字列が含まれていることに注目しよう。

実行結果 実行結果

POSTメソッドの送信

 urlopen関数を使って、HTTP POSTメソッドを送信することも可能だ。これには、urlに加えてdataパラメーターを指定する。

urllib.request.urlopen関数(その2)

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())

urlopen関数を使ってHTTP POSTメソッドを送信する

 このコードでは先ほどと同じパラメーターをurlencode関数でURLエンコードして文字列化し、さらにそれをencodeメソッドでバイト列に変換している。そして、URLと作成したデータをurlopen関数に渡して呼び出している(実行結果は省略する)。

Requestクラス

 さらに詳細にリクエストを制御したいときには、urllib.request.Requestクラスを使用する。このクラスのインスタンス生成をする際の基本構文を以下に示す(より詳細な構文についてはPythonのドキュメント「class urllib.request.Request」を参照のこと)。

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())

Requestクラスの使用例

 PUTメソッドやDELETEメソッドを送信したいときには、Requestクラスを使ってリクエストを組み立てることになるので覚えておこう。

 また、標準ライブラリではないが、より使いやすいRequestsパッケージもある。これについては機会を見て紹介したいと思う。

まとめ

 今回はファイルと同様、readメソッドなどを利用してWeb上のリソース(Webページ)を取得可能なurllibモジュールの基本について見た。urllibモジュールは今回紹介しただけではなく、Basic認証やクッキー処理など、より高度な機能も提供しているので、興味のある方はPythonのドキュメントを参照されたい。次回はこれを利用してWebページを取得して、そこからデータをスクレイピングする方法について簡単に見る予定だ。

今回のまとめ

  • Pythonの標準ライブラリにはURLをオープンするために使えるurllibモジュールがある
  • urllibモジュールには幾つかのモジュールが含まれている
  • urllib.requestモジュールには、特定のURLをオープンするために使用するurlopen関数が定義されている
  • urllib.request.urlopen関数にURLを渡すと、そのURLにリクエストを行い、その結果として得られるレスポンスが戻り値と返される
  • レスポンスの実行結果はgetcodeメソッドで、取得したリソースの実際のURLはgeturlメソッドで、ヘッダなどの関連情報はinfoメソッドで取得できる
  • レスポンスのボディーを読み込むには、readメソッド、readlineメソッド、readlinesメソッドなどが使える
  • urlopen関数のdataパラメーターを指定することでPOSTメソッドを送信できる
  • リクエストを詳細に制御するにはurllib.request.Requestクラスを使用できる

前のページへ 1|2       

Copyright© Digital Advantage Corp. All Rights Reserved.

スポンサーからのお知らせPR

注目のテーマ

4AI by @IT - AIを作り、動かし、守り、生かす
Microsoft & Windows最前線2025
AI for エンジニアリング
ローコード/ノーコード セントラル by @IT - ITエンジニアがビジネスの中心で活躍する組織へ
Cloud Native Central by @IT - スケーラブルな能力を組織に
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。