HTTPConnectionを使ってGETリクエスト
Pythonには豊富な標準ライブラリが付属しています。 今回はHTTPConnection (HTTPSConnection)を使ってhttp(https)サーバからレスポンスを取得 してみます。
httpでは主にPOSTコマンドとGETコマンドが使われますが、ここではGETコマンドでリク エストします。 GETコマンドではURLの後ろにパラメータ引数を追加して一緒にサーバへ渡します。
出来ること
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'))