昆布大好き!

主にプログラミングの技メモ

HTTPConnectionを使ってGETリクエスト

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