Traffine I/O

日本語

2022-08-10

requests

requestsライブラリ

requestsライブラリは、Pythonでもっとも人気のある広く使用されているライブラリの1つであり、HTTPリクエストを行うために使用されます。このライブラリは、リクエストを行うための複雑さを美しくシンプルなAPIの背後に抽象化し、HTTP/1.1リクエストをシームレスに送信できるようにします。これにより、シンプルなPythonライブラリを使用して、ヘッダー、フォームデータ、マルチパートファイル、およびパラメータなどのコンテンツをHTTPリクエストに追加できます。

requestsライブラリのインストール

requestsをインストールするには、次のpipコマンドを実行します。

bash
$ pip instal requests

GETリクエスト

GETリクエストはもっとも一般的なHTTPメソッドの1つです。これはリソースからデータを取得または読み取るために使用されます。Pythonのrequestsライブラリでは、GETリクエストを非常に簡単に行うことができます。

python
import requests

response = requests.get('https://api.github.com')

# Now we have a Response object called 'response'.
print(response.status_code)
200

POSTリクエスト

POSTリクエストは、新しいリソースを作成するためにデータをサーバーに送信するために使用されます。POSTでサーバーに送信されるデータは、リクエストボディに保存されます。requestsを使用したPOSTリクエストの例を以下に示します。

python
import requests

data = {
    'name': 'John',
    'age': '30'
}

response = requests.post('https://httpbin.org/post', data=data)

print(response.status_code)
print(response.json())

この例では、データとして辞書を送信していますが、requestsは送信前にそれをフォームエンコードします。

PUTリクエスト

PUTリクエストはPOSTリクエストと似ており、データをサーバーに送信します。違いは、PUTリクエストが冪等であるということです。つまり、同じPUTリクエストを複数回URLに対して行っても、常に同じ結果になります。以下にPUTリクエストの例を示します。

python
import requests

data = {
    'name': 'John',
    'age': '30'
}

response = requests.put('https://httpbin.org/put', data=data)

print(response.status_code)
print(response.json())

DELETEリクエスト

DELETEリクエストは、サーバーからリソースを削除するために使用されます。以下にDELETEリクエストの例を示します。

python
import requests

response = requests.delete('https://httpbin.org/delete')

print(response.status_code)
print(response.json())

HEADリクエスト

HEADリクエストは、GETリクエストに似ていますが、レスポンスヘッダーのみをサーバーに要求し、実際のリソース(つまり、メッセージボディ)は返されません。これは、リソースの可用性をチェックしたり、実際のコンテンツをダウンロードせずにレスポンスヘッダーをチェックする場合に便利です。以下にHEADリクエストの例を示します。

python
import requests

response = requests.head('https://httpbin.org/get')

print(response.status_code)
print(response.headers)

PATCHリクエスト

PATCHリクエストは、PUTリクエストとは異なり、リソース全体を置き換えるのではなく、リソースに部分的な変更を適用するために使用されます。以下にPATCHリクエストの例を示します。

python
import requests

data = {
    'name': 'John'
}

response = requests.patch('https://httpbin.org/patch', data=data)

print(response.status_code)
print(response.json())

タイムアウト

デフォルトでは、リクエストはタイムアウトしません。タイムアウトの期間を設定すると、リクエストが無期限に待機することがないようにするのは一般的なベストプラクティスです。タイムアウトを設定する方法を以下に示します。

python
import requests

try:
    response = requests.get('https://httpbin.org/delay/5', timeout=3)
except requests.exceptions.Timeout:
    print("The request timed out")

この例では、リクエストが3秒以内に完了しなかった場合、requests.exceptions.Timeout例外が発生します。

リダイレクト

デフォルトでは、URLへのGET、OPTIONS、POST、PUT、PATCH、DELETEリクエストは、レスポンスステータスコードが301、302、303、307、または308の場合に自動的に新しい場所にリダイレクトされます。この動作を無効にする場合は、次のように自動リダイレクトを無効にすることができます。

python
import requests

response = requests.get('http://github.com', allow_redirects=False)
print(response.status_code)

この例では、http://github.comへのGETリクエストは301ステータスコードを返しますが、allow_redirects=Falseを設定したため、自動的なリダイレクトは行われません。

ヘッダー

ヘッダーは、リクエストまたはレスポンスに関する追加情報を提供します。リクエストにヘッダーを追加するには、headersパラメータに辞書を渡します。以下にその方法を示します。

python
import requests

headers = {'user-agent': 'my-app/0.0.1'}

response = requests.get('https://httpbin.org/get', headers=headers)

print(response.json())

JSONデータの送信

JSON(JavaScript Object Notation)は、ウェブサービスを含むデータ交換において多様な用途で使用される一般的なデータ形式です。多くのAPIがJSONデータと連携します。

以下にJSONデータを送信する例を示します。

python
import requests
import json

data = {
    'name': 'John',
    'age': 30
}

headers = {'Content-type': 'application/json'}

response = requests.post('https://httpbin.org/post', data=json.dumps(data), headers=headers)

print(response.json())

この例では、最初にjsonモジュールをインポートし、json.dumps()を使用してPythonの辞書をJSON文字列に変換します。また、Content-typeヘッダーをapplication/jsonに設定して、JSONデータを送信していることをサーバーに伝えています。

フォームデータの送信

フォームデータは通常、HTMLフォームからサーバーにデータを送信するために使用されます。データはキーと値のペアのシリーズとして送信され、各ペアはフォームフィールドとその値を表します。Requestsライブラリを使用すると、フォーマットを手動で行うことなく簡単にフォームデータを送信できます。

送信できるフォームデータには、application/x-www-form-urlencodedmultipart/form-dataの2種類があります。前者はデフォルトであり、ほとんどの場合に適していますが、ファイルを送信する必要がある場合はmultipart/form-dataを使用する必要があります。

以下にmultipart/form-dataを送信する例を示します。

python
import requests

data = {
    'name': 'John',
    'age': 30
}

files = {
    'file': open('file.txt', 'rb')
}

response = requests.post('https://httpbin.org/post', data=data, files=files)

print(response.json())

この例では、バイナリモードでファイルを開き、files辞書に含めています。POSTリクエストを行う際に、requestsは自動的にContent-Typeヘッダーをmultipart/form-dataに設定し、データとファイルを適切にフォーマットします。

ファイルを使用した後は、必ずファイルを正しく閉じるためにリソースを解放するため、ファイルを閉じるようにします。ファイルを正しく閉じるための良い方法は、withステートメントを使用することです。

python
with open('file.txt', 'rb') as f:
    files = {'file': f}
    response = requests.post('https://httpbin.org/post', data=data, files=files)

参考

https://requests.readthedocs.io/en/latest/

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!