Pythonには豊富な標準ライブラリが付属しています。 今回はHTTPConnection (HTTPSConnection)を使ってhttp(https)サーバからレスポンスを取得 してみます。

httpでは主にPOSTコマンドとGETコマンドが使われますが、ここではGETコマンドでリク エストします。 GETコマンドではURLの後ろにパラメータ引数を追加して一緒にサーバへ渡します。

出来ること

  • HTML(ソース)のリクエスト
  • パラメータを指定したリクエスト
  • REST APIの使用

httpsプロトコルで接続する場合は、HTTPSconnectionを使います。 オブジェクトの生成の時に使い分けるだけでよいです。

# conn =  HTTPConnection('www.google.co.jp')
conn =  HTTPSConnection('www.google.co.jp')

それでは、ソースコードを見ていきます。

from http.client import HTTPSConnection, HTTPConnection
from urllib.parse import urlencode
# オブジェクトを生成します。サーバのホスト名を指定します
conn =  HTTPSConnection(www.google.co.jp)
# GETリクエストと一緒指定するヘッダです
getHeader = {
    User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.90 Safari/537.36 Vivaldi/1.91.867.38,
    }
# コマンド、パス、ヘッダを指定してサーバへリクエストを送信します
# 検索ワードにオオサンショウウオを指定しています
conn.request(GET, /search? + urlencode({q:オオサンショウウオ}), headers=getHeader)
# レスポンスを取得します。バイナリデータです。
res = conn.getresponse()
bs = res.read()
res = bs
# バイナリデータをエンコードしてテキストを取得します
print(response:, res.decode(utf-8))
conn.close()

conn.requestのheadersに指定しているヘッダ情報は指定していなくても相手のサーバ によっては問題なくレスポンスが取得できます。 上記の値(‘Mozilla/5.0…’)は手元のブラウザのGETリクエストで指定されていた値を ものですので常にこれで正しいという値ではないかもしれません。

urlencodeでパラメータをURLエンコードしています。

>>> print(urlencode({q:オオサンショウウオ}))
>>> q=%E3%83%A9%E3%82%A4%E3%83%B3%E3%83%90%E3%83%AC%E3%83%AB

パスの後の?‘にこれを繋いでリクエストを生成します。

付録

ヘッダにAccept-Encodingを指定するとサーバは圧縮エンコードされたデータを返す場合があります。 この場合gzipライブラリでデコードしてからテキストにします。

getHeader = {
    User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.90 Safari/537.36 Vivaldi/1.91.867.38,
    Accept-Encoding: gzip, deflate,
    }
# ....
res = conn.getresponse()
bs = res.read()
# バイナリデータを展開します
res = gzip.decompress(bs)
# バイナリデータをエンコードしてテキストを取得します
print(response:, res.decode(utf-8))