2013/09/12

ライブラリ:Requests

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

import requests

「Requests」は、Pythonで手軽にHTTPリクエストを行うためのライブラリです。インタフェースが洗練されており、かんたん・シンプルに使えるのが特徴です。

githubでは5,000以上ものStarがつけられており、Python用のライブラリとしてはDjangoやFlaskに並ぶ最も人気の高いもののひとつかと思います。

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

以下、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レスポンスが返ってくるので、その変数のアトリビュートやメソッドにアクセスすることで結果を利用することができます。

status_codeはステータスコードを、headersはヘッダ情報を、encodingは文字コードを格納しています。

レスポンスボディの取得

r = requests.get('http://docs.python-requests.org/en/latest/')
print r.text
print type(r.text).__name__  # unicode
textで、レスポンスのボディ部分を取得することができます。ボディは自動的にunicodeにエンコードされた形で返ってきます。ですので、上述のencodingに格納されている文字コードは原文の文字コードを指し示しています。

バイナリデータとしてのボディの取得

r = requests.get('http://docs.python-requests.org/en/latest/')
print r.content
print type(r.content).__name  # str
contentというアトリビュートで、レスポンスボディの部分をバイナリデータとして取得することもできます。

json形式でのボディの取得

r = requests.get('http://www.lifewithpython.com/feeds/posts/default?alt=json')
print r.json()
print type(r.json()).__name__  # listもしくはdict
json()メソッドを使うと、jsonを返すURLにアクセスした場合に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」キーワードを使います。最終的にどのようなURLが生成されているかを確認したいときはurlアトリビュートを参照します。

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

payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.post("http://httpbin.org/post", data=payload)
postリクエストの際のデータを設定するには、post()関数で「data」キーワードを使います。

以上です。


ここで挙げた以外にも、もっと突っ込んだ使い方ができるさまざまな機能が用意されていて、高機能でわかりやすい、とてもpythonicなライブラリとなっています。詳しくは公式のドキュメントをごらんください。


インストール
pipが入っていればpipコマンドでそのままインストールが可能です。
pip install 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

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