Python3でHTTP通信をする(Requestsを使う)
以前の記事 「Python3でHTTP通信をする(urllib.requestモジュールを使う)」 では、Pythonの標準モジュールである urllib.request を使って、簡単なHTTPリクエスト処理を書きました。
今回は外部ライブラリである Requests を使ってみようと思います。
Requests とは
Requests はPythonを使った外部通信するためのライブラリです。
Python標準の urllib
モジュールよりも高機能であり、コード量も減り、APIも可読性が良いため、外部通信を伴うアプリケーションでは一般に広く使われています。
公式サイトでは以下がサポートする機能として紹介されているので引用します。
- ドメインとURLの国際化
- Keep-Aliveとコネクションプーリング
- Cookieによるセッションの永続化
- ブラウザのようなSSLによる接続
- ベーシック/ダイジェスト認証
- エレガントなキー/バリューによるCookie
- 圧縮の自動的な展開
- レスポンスの本文のユニコード化
- マルチパートファイルのアップロード
- コネクションのタイムアウト
- .netrc のサポート
- Python 2.6-3.3に対応
- スレッドセーフ
Requestsのインストール
まずは Requests をインストールしましょう。
外部ライブラリなので pip
でインストールします。
1pip install requests
Requestsを使ったHTTP通信
まずは基本のHTTP GETをしてみましょう。
1import requests
2r = requests.get('https://github.com/timeline.json')
とてもシンプルです。最高ですね。
実は同様にして POST
や PUT
など他のHTTP Methodも処理できます。
リクエストボディは data
オプションで指定します。
1import requests
2import json
3r = requests.post('xxxxxxxx', data=json.dumps({'hoge':'huga'}))
4r = requests.put('xxxxxxx', data=json.dumps({'hoge':'huga'}))
レスポンスのハンドリング
レスポンスが JSON
形式であれば、json()
関数を使うとJSONとしてデータを取得できます。
1import requests
2r = requests.get('https://github.com/timeline.json')
3r.json()
ただし、JSONのデコードに失敗すると None
が返却される仕様なので、後段で None
の判定処理は入れた方が良いです。
きちんと例外処理をしたい場合には、単にレスポンスをテキストとして扱うために text
プロパティにアクセスし、json.loads
関数で処理することをオススメします。
以下のようなイメージになります。
1import json
2import requests
3
4try:
5 r = requests.get('https://github.com/timeline.json')
6 res = json.loads(r.text)
7except json.JSONDecodeError as e:
8 print(e)
リダイレクト時のステータスコードの確認
レスポンスオブジェクトの status_code
プロパティにアクセスするとレスポンスのステータスコードが取得できます。
しかし、このステータスコードは リダイレクトがあった場合には、リダイレクト後のページのステータスコード になります。
つまり、3xx
のステータスコードが取れないのです。
その場合、 history
プロパティにアクセスすることで、リダイレクト時のレスポンスの情報にもアクセスができます。
リクエストの古いものから順に配列に挿入されていきます。
1r = requests.get('http://github.com')
2his = r.history
3print(his[0].status_code) # 301
まとめ
今回は Requests を使って、
- HTTP リクエストをする
- リダイレクト時のステータスコードを取得する
を紹介しました。 urllib
よりも機能が多く、APIも使い勝手が良いため、積極的に利用していきたいですね。