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 requestsRequestsを使った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も使い勝手が良いため、積極的に利用していきたいですね。
