2013/09/12

ライブラリ:Requests

Python の「 Requests 」というライブラリについてご紹介します。

Python Requests

import requests

Requests は「 HTTP for Humans 」のキャッチコピーのとおり、 HTTP リクエストを人間が直感的に行えるように作られたライブラリです。インタフェースが洗練されており、かんたん・シンプルに使えるのが特徴です。

GitHub では 5,000 以上もの Star がつけられており、 Python 用のライブラリとしては Django や Flask に並ぶ最も人気の高いもののひとつかと思います。「 Python の好きなライブラリは?」という質問に対してこの Requests をあげる人も多いようです。

Python の HTTP リクエスト用のライブラリとしては、 Requests が作られる前から urllibhttplib などが存在したのですが、使い方がいまいちわかりづらい、とのことからこの Requests ライブラリが生み出されたようです。

以下、 Requests の基本的な使い方を見ていきます。

インストール


pip が入っていれば pip コマンドでそのままインストールが可能です。

pip install requests


GETリクエスト


import requests

r = requests.get('http://docs.python-requests.org/en/latest/')
print r.status_code  # 200
print r.headers  # ヘッダ情報を辞書型として格納
print r.encoding  # ISO-8859-1
GET リクエストは requests.get() という関数で行えます。 HTTP レスポンスの情報を格納した独自の Response オブジェクトが返ってくるので、その変数のアトリビュートやメソッドにアクセスする形で結果を利用することができます。

Response オブジェクトのアトリビュートのうち、 status_code はステータスコードを、 headers はヘッダ情報を、 encoding は文字コードを格納しています。

レスポンスボディの取得


r = requests.get('http://docs.python-requests.org/en/latest/')
print r.text
print type(r.text).__name__  # unicode

Response オブジェクトの text にはレスポンスのボディ部分が格納されています。ボディは自動的に unicode 化されているので、上述の encoding というのは unicode 化前の原文の文字コードを表します。

bytes データとしてのボディの取得


r = requests.get('http://docs.python-requests.org/en/latest/')
print r.content
print type(r.content).__name  # str

Response オブジェクトの content アトリビュートには、レスポンスボディの bytes 形式でのデータが格納されています。

JSON 形式でのボディの取得


r = requests.get('http://www.lifewithpython.com/feeds/posts/default?alt=json')
print r.json()
print type(r.json()).__name__  # listもしくはdict

JSON を返す URL にアクセスしたときの Response オブジェクトで json() メソッドを呼び出すと、 JSON データを parse
したものを返してくれます。データ型は通常の list 型あるいは dict 型となります。

POST/PUT/DELETE リクエスト


r = requests.post(URL_TO_POST)
r = requests.put(URL_TO_PUT)
r = requests.delete(URL_TO_DELETE)
r = requests.head(URL_TO_HEAD)
r = requests.options(URL_TO_CHECK_REQUEST_OPTIONS)

GET 以外の POST/PUT/DELETE/HEAD などのリクエストは、それぞれその名前の関数で行うことができます。直感的!

GETリクエストクエリの設定


payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.get("http://httpbin.org/get", params=payload)
print r.url  # u'http://httpbin.org/get?key2=value2&key1=value1'

GET リクエストのクエリを指定したい場合は get() 関数の呼び出し時に「 params 」引数に dict を渡します。最終的にどのような
URL が生成されているかは url アトリビュートで確認することができます。

POST リクエストデータの設定


payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.post("http://httpbin.org/post", data=payload)

POST リクエストの際の送信データの指定には post() 関数の引数「 data 」を使用します。こちらも GET クエリの場合と同じく dict を渡します。

以上です。




ここでご紹介したもの以外にもさまざまな機能が用意されていて、高機能でかつわかりやすい、とても pythonic なライブラリとなっています。より詳しく知りたい方は公式のドキュメントをご覧になってみてください。

Requests に興味のある方には次のページも参考になるかもしれません。

Python Tips:Requests ライブラリのレスポンスボディの文字化けを解消したい


参考
Requests: HTTP for Humans
Requests - github

2 件のコメント:

林弘 さんのコメント...

記事、参考になりました。ありがとうございます。
ところで、以下はの#strは誤記だと思います。
>print type(r.content).__name # str

>>> print(type(r.content).__name__)
bytes

ゴトウハヤト さんのコメント...

林弘さん、コメントくださりありがとうございます!

ご指摘くださった箇所、確認してみました。 Python 2 では

>>> print type(r.content).__name # => str

でよいのですが、 Python 3 ではご指摘いただいたとおり

>>> print(type(r.content).__name__) # => bytes

が正しい形のようですね。ご指摘いただきありがとうございます。