この総合ガイドでは次のトピックについて説明します:
requests
の概要、インストール方法、なぜ最も人気のあるPython HTTPクライアントライブラリなのか。- RequestsをさまざまなHTTPメソッドで使用する方法。
- サーバーのレスポンスを処理するためにRequestsが提供するもの。
- どのRequestsカスタマイズがサポートされているか。
- Python
requests
ライブラリでカバーされている高度なシナリオ
さっそく始めましょう!
Requestsライブラリの紹介
Requestsの概要、インストール方法、使用タイミング、提供内容をご覧ください。
定義
Requests
はPython用のエレガントでシンプルなHTTPライブラリです。具体的には、HTTPリクエストの作成とレスポンスの処理を、簡単かつ人間が読める方法で行うための直感的なAPIが提供されています。GitHubでは5万個以上のスターが付いており、毎日何百万回もダウンロードされているRequestsは、Pythonで最も人気のあるHTTPクライアントです。
このライブラリが提供する主な機能には、すべてのHTTPメソッド、応答処理、要求のカスタマイズ、認証、SSL 証明書管理などを網羅する包括的なAPIがあります。さらに、Python RequestsモジュールはHTTP/1.1を初期状態でサポートしています。
セットアップ
Requestsをインストールする最も簡単でお勧めの方法はpip
を使用することです。特に、Requestsライブラリに関連付けられているpip
パッケージはrequests
です。そのため、次のコマンドでHTTPクライアントをインストールできます:
pip install requests
Pythonスクリプトでrequests
を使用するには、以下の行でインポートしてください:
import requests
完了です!これでRequestsパッケージがインストールされ、使用できる状態になりました。
ユースケース
Python requests
ライブラリの主な使用例は次のとおりです。
- WebサーバーへのHTTPリクエストの実行:GETリクエストを送信してWebサーバーからデータを取得します。
- APIの利用:APIエンドポイントにリクエストを送信してそのレスポンスを処理し、さまざまなWebサービスとやり取りし、それらのデータにアクセスします。
- Webスクレイピング:Webページに関連付けられたHTMLドキュメントを取得します。これらのドキュメントは、
BeautifulSoup
などのライブラリを使用して解析し、特定の情報を抽出できます。詳細については、「PythonのWebスクレイピングガイド」をご覧ください。 - Webアプリケーションのテスト:HTTPリクエストをシミュレートしてレスポンスを検証し、テストプロセスを自動化してWebサービスが適切に機能することを確認します。
- ファイルのダウンロード:HTTP
GET
リクエストを各URLに送信して、画像、ドキュメント、その他のメディアファイルなどのファイルをWebサーバーから取得します。
メソッド
次の表のrequests
ライブラリによって公開されているパブリックメソッドをご覧ください:
メソッド | 説明 |
requests.request() |
指定されたメソッドで、カスタムHTTPリクエストを指定されたURLに送信します |
requests.get() |
GET リクエストを指定されたURLに送信します |
requests.post() |
POST リクエストを指定されたURLに送信します |
requests.put() |
PUT リクエストを指定されたURLに送信します |
requests.patch() |
PATCH リクエストを指定されたURLに送信します |
requests.delete() |
DELETE リクエストを指定されたURLに送信します |
requests.head() |
HEAD リクエストを指定されたURLに送信します |
ご覧のとおり、これらは最も有用なHTTPリクエストメソッドを網羅しています。使用方法の詳細については、「公式APIドキュメント」を参照してください。
これらの実際の仕事ぶりを見てみましょう!
HTTPメソッド
HTTPのGET
、POST
、PUT
、DELETE
、およびHEAD
メソッドを扱いながら、Python requests
ライブラリの実際の動作を見てみましょう。
GET
HTTPでは、GET
メソッドを使用してサーバーから特定のリソースをリクエストします。これは、requests.get()
を使用してHTTP GET
リクエストを作成する方法です:
import requests
# send a GET request to the specified URL
response = requests.get('https://api.example.com/data')
同様に、requests.request()
を使用しても、以下のように同じ結果を得られます:
import requests
response = requests.request('GET', 'https://api.example.com/data')
この場合、使用するHTTPメソッドを、追加の文字列変数で手動で指定する必要があります。
POST
HTTP POST
メソッドは、データをサーバーに送信してさらに処理するために使用されます。requests.post()
を使用してPOST
リクエストを作成する方法は次の通りです:
import requests
# data to be sent in the POST request
product = {
'name': 'Limitor 500',
'description': 'The Limitor 500 is a high-performance electronic device designed to regulate power consumption in industrial settings. It offers advanced features such as real-time monitoring, adjustable settings, and remote access for efficient energy management.',
'price': 199.99,
'manufacturer': 'TechCorp Inc.',
'category': 'Electronics',
'availability': 'In Stock'
}
# send a POST request to the specified URL
response = requests.post('https://api.example.com/product', data=product)
GET
リクエストのときとは異なり、この場合はサーバーに送信するデータをdata
オプションを使用して指定することも必要です。requests
は、このデータをHTTPリクエストのボディに追加します。
JSONボディの場合は、データオブジェクトをdata
の代わりにjson
オプションに渡してください:
response = requests.post('https://api.example.com/product', json=product)
同様に、次のようにrequest.request()
を使用して同じリクエストを実行できます:
import requests
product = {
'name': 'Limitor 500',
'description': 'The Limitor 500 is a high-performance electronic device designed to regulate power consumption in industrial settings. It offers advanced features such as real-time monitoring, adjustable settings, and remote access for efficient energy management.',
'price': 199.99,
'manufacturer': 'TechCorp Inc.',
'category': 'Electronics',
'availability': 'In Stock'
}
response = requests.request('POST', 'https://api.example.com/product', data=product)
PUT
PUT
メソッドは、サーバー上のリソースの更新または置換に使用されます。Python requests
モジュールでPUT
リクエストを送信するのは簡単で、POSTリクエストと同様のパターンに従います。変更点は、使用するメソッドがrequests.put()
であることです。また、requests.request()
内のHTTPメソッド文字列は'PUT'
になります。
PATCH
PATCH
メソッドは、オンラインリソースに部分的な変更を適用するために使用されます。PUT
リクエストの場合と同様、Python requests
ライブラリでのPATCH
リクエストの送信プロセスはPOSTリクエストに似ています。変更点は、使用するメソッドがrequests.patch()
で、requests.request()
内のHTTPメソッド文字列が'PATCH'
であることです。
DELETE
DELETE
メソッドは、指定されたURIにより識別されるリソースを削除するために使われます。delete()
メソッドを使用してrequests
でHTTPDELETE
リクエストを作成する方法は次の通りです:
import requests
# send a DELETE request for the product with id = 75
response = requests.delete('https://api.example.com/products/75')
同様に、requests.request()
を使用してDELETEリクエストを実行できます:
import requests
response = requests.request('DELETE', 'https://api.example.com/products/75')
HEAD
HEAD
メソッドはGET
と似ていますが、実際のボディコンテンツはリクエストせず、レスポンスのヘッダーのみをリクエストします。そのため、HEAD
リクエストに対してサーバーから返されるレスポンスはGET
リクエストのレスポンスと同格ですが、ボディデータはありません。
requests.head()
を使用してPythonでHTTP HEAD
リクエストを実行してください:
import requests
# send a HEAD request to the specified URL
response = requests.head('https://api.example.com/resource')
同じ方法で、requests.request()
を使用してHEAD
リクエストを実行できます:
import requests
response = requests.request('HEAD', 'https://api.example.com/resource')
Requestsからのレスポンスオブジェクトの分解
requests
を使ってHTTPリクエストを行う方法がわかったところで、今度はレスポンスオブジェクトの処理方法を見てみましょう。
レスポンスオブジェクト
HTTPリクエストを行った後、requests
はサーバーからレスポンスを受け取り、それを特別なレスポンスオブジェクトにマッピングします。
以下のPython requests
の例をご覧ください:
import requests
response = requests.get('http://lumtest.com/myip.json')
print(response)
これにより、以下が返されます:
<Response [200]>
response
はレスポンス
オブジェクトで、いくつかの便利なメソッドとプロパティを公開しています。次のセクションで最も重要なものについて説明します。
警告:requests
は常にレスポンスを返すとは限りません。エラー(URLが無効であるなど)が発生した場合は、RequestException
が発生します。以下のロジックでこの例外を防止してください:
try:
response = requests.get('http://lumtest.com/myip.json')
# handle the response
except requests.exceptions.RequestException as e:
print('An error occurred during the request:', e)
ステータスコード
HTTPの場合、レスポンスステータスコードは、リクエストの成功、失敗、またはその他の状態を示すためにサーバーから返される標準化された値です。これらのステータスコードは、リクエストが成功したか、失敗した場合は何が問題だったかを即座にフィードバックしてくれるので、非常に重要です。
これらは特にエラー処理に役立ち、クライアントがさまざまなタイプのエラーを適切に識別して処理できるようになります。たとえば、4xx
ステータスコードはクライアント側のエラー(無効なリクエストなど)を示し、5xx
ステータスコードはサーバー側のエラーを示します。
requests
ライブラリを使用してPythonでレスポンスを処理するには、通常、ステータスコードの制御が最初のステップです。リクエストを行った後は、必ずレスポンスのステータスコードを確認して、リクエストが成功したかどうかを判断する必要があります。レスポンスオブジェクトのstatus_code
属性を使用してステータスコードにアクセスします:
response.status_code # 200
受け取ったステータスコードに応じて、条件付き命令を使用してさまざまなシナリオを適切に処理する必要があります:
import requests
response = requests.get('http://lumtest.com/myip.json')
# check if the request was successful (status code 200)
if response.status_code == 200:
print('Successful request!')
# handle the response...
elif response.status_code == 404:
print('Resource not found!')
else:
print(f'Request failed with status code: {response.status_code}')
ほとんどのシナリオでは、成功したリクエストとエラーレスポンスを区別するだけで済みます。カスタム__bool()__
オーバーロードのおかげで、requests
はそのプロセスを簡略化できます。具体的には、レスポンス
オブジェクトを条件式で直接使用できます。ステータスコードが200
と399
の間の場合はTrue
と評価され、それ以外の場合はFalse
と評価されます。
言い換えれば、成功したリクエストの結果は次のロジックで確認できます:
if response:
print('Successful request!')
# handle the response...
else:
print(f'Request failed with status code: {response.status_code}')
レスポンスヘッダー
headers
属性を使用してサーバーレスポンスのヘッダーにアクセスします:
import requests
response = requests.get('http://lumtest.com/myip.json')
response_headers = response.headers
print(response_headers)
これは次のように出力されます:
{'Server': 'nginx', 'Date': 'Thu, 09 May 2024 12:51:08 GMT', 'Content-Type': 'application/json; charset=utf-8', 'Content-Length': '279', 'Connection': 'keep-alive', 'Cache-Control': 'no-store', 'Access-Control-Allow-Origin': '*'}
ご覧のとおり、response.headers
はディクショナリに似たオブジェクトを返します。つまり、ヘッダー値にはキーでアクセスできます。たとえば、レスポンスのContent-Type
ヘッダーにアクセスしたいとします。以下がその方法です:
response_headers['Content-Type'] # 'application/json; charset=utf-8'
HTTPの仕様ではヘッダーは大文字と小文字を区別しないため、requests
を使用すれば、ヘッダーの大文字と小文字を気にせずにアクセスできます:
response_headers['content-type'] # 'application/json; charset=utf-8'
レスポンスコンテンツ
requests
には、レスポンスのペイロードにアクセスするためのさまざまな属性とメソッドが用意されています。
response.content
:レスポンスの内容をバイト単位で返します。response.text
:レスポンスの内容をUnicodeの文字列として返します。response.json()
:JSONエンコードされたレスポンスのコンテンツをディクショナリに返します。
次の例で実際の動作を確認してください:
import requests
response = requests.get('http://lumtest.com/myip.json')
# access the response as bytes
response_bytes = response.content
print(type(response_bytes))
print(response_bytes)
print()
# retrieve the response as text
response_text = response.text
print(type(response_text))
print(response_text)
print()
# retrieve the response as a JSON-encoded dictionary
response_json = response.json()
print(type(response_json))
print(response_json)
print()
http://lumtest.com/myip.json
は呼び出し元のIPに関する情報を返す特別なエンドポイントです。上記のスニペットの結果は次のようになります:
<class 'bytes'>
b'{"ip":"45.85.135.110","country":"US","asn":{"asnum":62240,"org_name":"Clouvider Limited"},"geo":{"city":"Ashburn","region":"VA","region_name":"Virginia","postal_code":"20149","latitude":39.0469,"longitude":-77.4903,"tz":"America/New_York","lum_city":"ashburn","lum_region":"va"}}'
<class 'str'>
{"ip":"45.85.135.110","country":"US","asn":{"asnum":62240,"org_name":"Clouvider Limited"},"geo":{"city":"Ashburn","region":"VA","region_name":"Virginia","postal_code":"20149","latitude":39.0469,"longitude":-77.4903,"tz":"America/New_York","lum_city":"ashburn","lum_region":"va"}}
<class 'dict'>
{'ip': '45.85.135.110', 'country': 'US', 'asn': {'asnum': 62240, 'org_name': 'Clouvider Limited'}, 'geo': {'city': 'Ashburn', 'region': 'VA', 'region_name': 'Virginia', 'postal_code': '20149', 'latitude': 39.0469, 'longitude': -77.4903, 'tz': 'America/New_York', 'lum_city': 'ashburn', 'lum_region': 'va'}}
3つの異なるレスポンス形式に注意してください。ディクショナリとしてのresponse.json()
は、データアクセスを簡略化するので特に便利です:
response_json['country'] # 'US'
詳細は、「PythonでJSONを解析する方法」に関するガイドをご覧ください。
レスポンスクッキー
HTTPクッキーはヘッダーを介して定義されますが、レスポンス
オブジェクトはそれらを処理するための特別なクッキー
属性を提供します。これにより、サーバーが送り返したクッキーを含むhttp.cookiejarオブジェクトが返されます。
Python requests
ライブラリのレスポンスオブジェクトからクッキーにアクセスする方法を示す以下の例をご覧ください:
import requests
# define the login credentials
credentials = {
'username': 'example_user',
'password': 'example_password'
}
# send a POST request to the login endpoint
response = requests.post('https://www.example.com/login', data=credentials)
# access the cookies set by the server
cookies = response.cookies
# print the cookies received from the server
for cookie in cookies:
print(cookie.name, ':', cookie.value)
上記のサンプルスニペットは次のような内容を生成することがあります:
session_id : be400765483cf840dfbbd39
user_id : 7164
expires : Sat, 01 Jan 2025 14:30:00 GMT
Python Requestsライブラリによるリクエストのカスタマイズ
HTTPリクエストには、多くの場合、特殊なフィルタリングパラメーターとカスタムヘッダーが含まれます。requests
でそれらを指定する方法を見てみましょう。
クエリ文字列パラメーター
クエリパラメーターはURLパラメーターとも呼ばれ、HTTPリクエストのURLの末尾に追加される追加パラメーターです。これらは通常、データのフィルタリング方法やレスポンスのカスタマイズ方法など、リクエストに関する追加情報をサーバーに提供します。
次のURLをご覧ください:
https://api.example.com/data?key1=value1&key2=value2
この例では、?key1=value1&key2=value2
はクエリ文字列で、key1
とkey2
はクエリパラメータです。
クエリ文字列が?
で始まり、等号(=
)で区切られ、 &
で連結されたキーと値のペアで構成されています。Pythonコードでこのクエリ文字列をプログラミング的に指定するのは、特にオプションパラメータを扱う場合、必ずしも簡単ではありません。これがrequests
がparams
オプションを提供している理由です:
import requests
# define query parameters as a dictionary
params = {
'page': 1,
'limit': 10,
'category': 'electronics'
}
# send a GET request to the following URL:
# 'https://api.example.com/products?page=1&limit=10&category=electronics'
response = requests.get('https://api.example.com/products', params=params)
同様に、パラメーターをタプルのリストとしてrequests
に渡すことができます:
import requests
# define query parameters as a list of tuples
params = [
('page', '1'),
('limit', '10'),
('category', 'electronics')
]
response = requests.get('https://api.example.com/products', params=params)
またはバイト
文字列として渡します:
import requests
# define query parameters as a bytes string
params = b'page=1&limit=10&category=electronics'
response = requests.get('https://api.example.com/products', params=params)
リクエストヘッダー
リクエスト
内のHTTPリクエストのヘッダーをカスタマイズするには、それらをディクショナリとしてheaders
オプションに渡します。たとえば、次のようにrequests
にカスタムUser-Agent
文字列を設定できます:
import requests
# define custom headers
custom_headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36',
# other headers...
}
# send a GET request with custom headers
response = requests.get('https://api.example.com/data', headers=custom_headers)
クッキーのリクエスト
HTTPクッキーはヘッダーを介してサーバーに送信されますが、requests
には、それらをカスタマイズするためのクッキー
専用オプションが用意されています。次の例のように使用してください:
# define custom cookies
custom_cookies = {
'session_id': 'be400765483cf840dfbbd39',
'user_id': '7164'
}
# send a GET request with custom cookies
response = requests.get('https://www.example.com', cookies=custom_cookies)
クッキー
はディクショナリまたはhttp.cookiejar
オブジェクトを使用することに注意してください。
その他の構成
requests
には豊富なAPIが用意されており、高度なテクニックも多数用意されています。最も関連性の高いものをいくつかご紹介します!
プロキシ設定
プロキシとrequests
を統合することで、HTTPリクエストをプロキシサーバー経由でルーティングできます。これは、IPアドレスを隠したり、レート制限を回避したり、地理的に制限されたコンテンツにアクセスしたりするための強力なメカニズムです。
プロキシ
オプションを使用すると、プロキシサーバーをPython requests
ライブラリと統合できます:
import requests
# define the proxy settings
proxy = {
'http': 'http://username:[email protected]:8080',
'https': 'https://username:[email protected]:8080'
}
# Make a request using the proxy
response = requests.get('https://www.example.com', proxies=proxy)
完全なチュートリアルについては、「Python Requestsとプロキシを使用する」のガイドに従ってください。
Basic認証
HTTP認証は、「Basic認証」として知られる、HTTP プロトコルに組み込まれているシンプルな認証スキームです。これには、Base64フォーマットでエンコードされたユーザー名とパスワードをAuthorization
ヘッダーに送信する必要があります。
Authorization
ヘッダーを手動で設定して実装することもできますが、requests
ではauth
専用オプションを公開しています。ユーザー名とパスワードを備えたタプルを使用できます。Python requests
ライブラリでBasic認証を扱うときに使います:
import requests
# define the username and password for basic authentication
username = 'sample_username'
password = 'sample_password'
# send a GET request with basic authentication
response = requests.get('https://api.example.com/private/users', auth=(username, password))
SSL証明書の検証
SSL証明書の検証は、インターネットを介したクライアントとサーバー間の安全な通信を確保するために不可欠です。同時に、送信先サーバーが信頼できるため検証を実施する必要がない場合もあります。
特に、HTTPトラフィックをプロキシサーバー経由でルーティングする場合、SSL証明書に関連するエラーが発生する可能性があります。この場合、SSL証明書の検証を無効にする必要があるかもしれません。requests
では、これはverify
オプションで可能です:
import requests
# send a GET request to a website with SSL certificate verification disabled
response = requests.get('https://api.example.com/data', verify=False)
タイムアウト
デフォルトでは、requestsはサーバーがレスポンスするまで自動的に無期限に待機します。サーバーに過負荷がかかったり、ネットワークが遅くなったりすると、この動作が問題になる可能性があります。
来るか分からないレスポンスを待つ間にアプリケーションが遅くなるのを避けるため、requests
にはtimeout
オプションがあります。レスポンスを待つ秒数を整数または浮動小数点数で指定できます:
import requests
# timeout after 2 second
response1 = requests.get("https://api.example.com/data", timeout=2)
あるいは、timeout
には、接続タイムアウトと読み取りタイムアウトの2つの要素を持つタプルを使用できます。次の例のように指定します:
import requests
# timeout after 2.5 seconds for connections and 4 seconds for reading response
response = requests.get("https://api.example.com/data", timeout=(2.5, 4))
リクエストが指定された接続タイムアウト内に接続を確立し、読み取りタイムアウト内にデータを受信した場合、レスポンスは通常どおり返されます。リクエストがタイムアウトすると、Timeout
例外が発生します:
import requests
from requests.exceptions import Timeout
try:
response = requests.get("https://api.example.com/data", timeout=(2.5, 4))
except Timeout:
print("The request timed out")
まとめ
この記事では、requests
ライブラリについて掘り下げ、その概要やメソッド、使用方法などを理解しました。Python requests
モジュールは、いくつかのユースケースをカバーする便利で一般的なHTTPライブラリであることがお分かりいただけたと思います。
問題は、すべてのHTTPリクエストでパブリックIPが公開されてしまうことです。これは素性や居住地の情報を提供するものであり、プライバシーの観点から好ましくないことです。IPアドレスを隠す方法はいくつかありますが、セキュリティとプライバシーを強化する最も効果的な方法は、プロキシサーバーを使用することです。
Bright Dataは世界最高レベルのプロキシサーバーを保有しており、フォーチュン500企業を含む20,000社以上の顧客にサービスを提供しています。Bright Dataは次のような様々な種類のプロキシを提供しています:
- データセンタープロキシ – 77万個以上のデータセンターIP。
- 住宅用プロキシ – 195か国以上で7,200万個を超える住宅用IP。
- ISPプロキシ – 70万を超えるISP登録済みIP。
- モバイルプロキシ – 700万個以上のモバイル用IP。
クレジットカードは必要ありません