Python3でHTTP通信をする(Requestsを使う)

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

とてもシンプルです。最高ですね。 実は同様にして POSTPUT など他の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も使い勝手が良いため、積極的に利用していきたいですね。

参考にさせていただいたサイト