リクエストライブラリ
1 はじめに
最新の Web 開発では、サーバーとの HTTP 通信が重要なタスクです。Python の Requests ライブラリは、HTTP リクエストの送信を非常に簡単にする簡潔な API を提供する、シンプルで強力なサードパーティ ライブラリです。このチュートリアルでは、Python リクエスト ライブラリを使用して、さまざまなタイプの HTTP リクエストを送信し、応答を処理する方法を説明します。
1.1 HTTP リクエストとレスポンス
始める前に、HTTP リクエストとレスポンスの基本概念を簡単に理解しましょう。HTTP は、クライアントとサーバー間の通信用のプロトコルです。クライアントはサーバーにリクエストを送信し、サーバーは対応する応答を返します。リクエストにはメソッド(GET、POSTなど)、URL、リクエストヘッダ、リクエストボディなどの情報が含まれ、レスポンスにはステータスコード、レスポンスヘッダ、レスポンスボディなどの情報が含まれます。
1.2 Python Requests ライブラリの役割と利点
Python リクエスト ライブラリは、HTTP リクエストを送信し、応答を処理するための一般的なサードパーティ ライブラリです。リクエストの送信を非常に簡単にするクリーンな API を提供します。Python の組み込み HTTP ライブラリの一部 (urllib など) も同様のタスクを実行できますが、Requests ライブラリの方が使いやすく、より多くの機能と柔軟性を提供します。
1.3 リクエストライブラリのインストール
開始する前に、Python インタープリターがインストールされていることを確認してください。Requests ライブラリをインストールするには、pip コマンドを使用して次の手順を実行します。
pip install requests
インストールが完了したら、Requests ライブラリを使用して HTTP リクエストの送信を開始できます。
2. GETリクエストを送信する
GET リクエストはサーバーからデータを取得するために使用されます。以下に、一般的な GET リクエストの例をいくつか示します。
2.1 基本的な GET リクエストを送信する
単純な GET リクエストの送信は、リクエスト ライブラリを使用すると非常に簡単です。ターゲット URL を指定するだけです。
import requests
response = requests.get('https://api.example.com/data')
print(response.text)
上記のコードは、GET リクエストを https://api.example.com/data に送信し、応答の内容を出力します。
2.2 クエリパラメータの追加
場合によっては、特定のデータを取得するために URL にクエリ パラメーターを追加する必要があります。params
パラメーターを使用してクエリ パラメーターを指定できます。
import requests
payload = {
'key1': 'value1', 'key2': 'value2'}
response = requests.get('https://api.example.com/data', params=payload)
print(response.text)
上記のコードは、クエリ パラメーターkey1=value1
をkey2=value2
URL に追加します。
2.3 リクエストヘッダーの設定
リクエスト ヘッダーには、User-Agent、Accept などのリクエストに関する追加情報が含まれています。headers
パラメータを使用してリクエスト ヘッダーを設定できます。
import requests
headers = {
'User-Agent': 'Mozilla/5.0'}
response = requests.get('https://api.example.com/data', headers=headers)
print(response.text)
上記のコードは、リクエストを送信するブラウザをシミュレートするために User-Agent リクエスト ヘッダーを設定します。
2.4 応答の処理
応答を取得したら、それに対してさまざまな操作を実行できます。例えば、ステータスコード、ヘッダ情報、レスポンスの内容を取得できます。
import requests
response
= requests.get('https://api.example.com/data')
print(response.status_code) # 打印状态码
print(response.headers) # 打印响应头
print(response.text) # 打印响应内容
上記のコードは、ステータス コード、応答ヘッダー、および応答コンテンツを取得する方法を示しています。
3. POSTリクエストを送信する
POST リクエストは、データをサーバーに送信するために使用されます。以下に、一般的な POST リクエストの例をいくつか示します。
3.1 基本的な POST リクエストを送信する
単純な POST リクエストの送信も、Requests ライブラリを使用して簡単に行えます。宛先 URL と送信するデータを指定するだけです。
import requests
payload = {
'key1': 'value1', 'key2': 'value2'}
response = requests.post('https://api.example.com/submit', data=payload)
print(response.text)
上記のコードは、POST リクエストを https://api.example.com/submit に送信し、応答の内容を出力します。
3.2 フォームデータの送信
Web 開発では、ユーザー入力データを収集するためにフォームがよく使用されます。パラメータを使用してdata
フォーム データを送信できます。
import requests
data = {
'username': 'john', 'password': 'secret'}
response = requests.post('https://api.example.com/login', data=data)
print(response.text)
上記のコードは、ユーザー名とパスワードをフォーム データとして https://api.example.com/login に送信します。
3.3 JSONデータの送信
フォームデータだけでなく、JSON形式のデータも送信できます。json
パラメーターを使用してJSON データを送信できます。
import requests
data = {
'name': 'John Doe', 'age': 30}
response = requests.post('https://api.example.com/user', json=data)
print(response.text)
上記のコードは、data
辞書を JSON 形式に変換し、https://api.example.com/user に送信します。
3.4 応答の処理
GET リクエストと同様に、POST リクエストの応答に対してさまざまな操作を実行することもできます。たとえば、ステータス コード、ヘッダー情報、コンテンツを取得します。
import requests
response = requests.post('https://api.example.com/submit', data={
'key': 'value'})
print(response.status_code) # 打印状态码
print(response.headers) # 打印响应头
print(response.text) # 打印响应内容
上記のコードは、POST リクエストの応答情報を取得する方法を示しています。
4. リクエストセッション管理
場合によっては、セッション状態の維持や Cookie の処理が必要になる場合があります。Requests ライブラリは、これらの状況を処理するためのセッション オブジェクトを提供します。
4.1 セッションオブジェクトの使用
セッション オブジェクトを使用して、複数のリクエスト間で状態を共有します。セッション オブジェクトは、Cookie を保持したり、リクエスト ヘッダーを設定したりできます。
import requests
session = requests.Session()
session.get('https://api.example.com/login')
response = session.get('https://api.example.com/dashboard')
print(response.text)
上記のコードはセッション オブジェクトを作成し、ログイン後にセッションを永続化し、別のリクエストをダッシュボード ページに送信します。
4.2 セッション状態を維持する
セッション オブジェクトは Cookie を自動的に保持し、後続のリクエストで自動的に送信します。これは、ユーザーのログインをシミュレートしたり、連続したリクエストを実行したりする場合に役立ちます。
import requests
session = requests.Session()
login_data =
{
'username': 'john', 'password': 'secret'}
session.post('https://api.example.com/login', data=login_data)
response = session.get('https://api.example.com/dashboard')
print(response.text)
上記のコードは、ログイン後のセッション状態を維持し、同じセッション オブジェクトを使用して後続のリクエストを送信します。
4.3 Cookieの処理
セッション オブジェクトは Cookie も簡単に処理します。現在のセッションの Cookie は属性を使用して取得できcookies
、cookies
カスタム Cookie はパラメータを使用して送信できます。
import requests
session = requests.Session()
session.get('https://api.example.com/login')
cookies = session.cookies.get_dict() # 获取当前会话的Cookie
response = session.get('https://api.example.com/dashboard', cookies=cookies)
print(response.text)
上記のコードは、現在のセッション Cookie を取得し、ダッシュボード ページに送信します。
5. 例外とエラーの処理
HTTPリクエストでは、さまざまな例外やエラーが発生する場合があります。Requests ライブラリは、これらの例外とエラーを処理するメカニズムを提供します。
5.1 処理要求のタイムアウトについて
リクエストがタイムアウトした場合は、timeout
パラメータを設定してリクエストの待機時間を制限できます。
import requests
try:
response = requests.get('https://api.example.com/data', timeout=5)
print(response.text)
except requests.Timeout:
print('请求超时')
上記のコードは、リクエストのタイムアウトを 5 秒に設定し、Timeout
例外をキャッチします。
5.2 接続エラーの処理
サーバーへの接続中にエラーが発生した場合、requests.ConnectionError
例外をキャッチできます。
import requests
try:
response = requests.get('https://api.example.com/data')
print(response.text)
except requests.ConnectionError:
print('连接错误')
上記のコードは、接続エラーが発生したときに例外をキャッチします。
5.3 HTTPエラーステータスコードの処理
サーバーが間違った HTTP ステータス コードを返した場合、response.raise_for_status()
メソッドを使用して例外をスローできます。
import requests
response = requests.get('https://api.example.com/data')
try:
response.raise_for_status()
print(response.text)
except requests.HTTPError:
print('HTTP错误')
上記のコードは、応答のステータス コードをチェックし、ステータス コードが 2xx でない場合は例外をスローします。
6. 高度な機能と拡張機能
基本的な HTTP リクエストに加えて、リクエスト ライブラリは、より複雑なニーズを満たすためのいくつかの高度な機能と拡張機能も提供します。
6.1 ファイルのアップロードとダウンロード
Requests ライブラリを使用すると、ファイルのアップロードとダウンロードが簡単になります。
import requests
# 文件上传
files = {
'file': open('data.txt', 'rb')}
response = requests.post('https://api.example.com/upload', files=files)
# 文件下载
response = requests.get('https://api.example.com/download/data.txt')
with open('data.txt', 'wb') as file:
file.write(response.content)
上記のコードは、ファイルのアップロードとダウンロードの例を示しています。
6.2 SSL 検証と証明書
Requests ライブラリは、SSL 検証とカスタム証明書をサポートしています。
import requests
response = requests.get('https://api.example.com', verify=True) # 开启SSL验证
# 使用自定义证书
response = requests.get('https://api.example.com', cert=('client.crt', 'client.key'))
上記のコードは、SSL 検証を有効にしてカスタム証明書を使用する方法を示しています。
6.3 プロキシ設定
プロキシ サーバー経由でリクエストを送信する必要がある場合は、proxies
パラメータを使用してプロキシを設定できます。
import requests
proxies = {
'http': 'http://127.0.0.1:8080', 'https': 'http://127.0.0.1:8080'}
response = requests.get('https://api.example.com', proxies=proxies)
上記のコードは、プロキシ サーバー経由でリクエストを送信します。
7. ベストプラクティス
7.1 セッションオブジェクトの使用
セッション オブジェクトを使用すると、セッション状態をより適切に管理し、複数の関連リクエストを送信するときにデータを共有できます。これにより効率が向上し、不必要な操作の重複が削減されます。特に、ログインを維持したり、Cookie を処理したりする必要がある状況では、セッション オブジェクトを使用すると非常に便利です。
import requests
session = requests.Session()
session.get('https://api.example.com/login')
# 发送其他请求...
7.2 例外の処理
リクエストを送信すると、接続タイムアウトやサーバーエラーなどの異常な状況が発生することは避けられません。プログラムの堅牢性を確保するには、例外処理メカニズムを使用してこれらの例外をキャッチして処理することをお勧めします。
import requests
try:
response = requests.get('https://api.example.com/data', timeout=5)
response.raise_for_status()
# 处理响应...
except requests.exceptions.Timeout:
print('请求超时')
except requests.exceptions.HTTPError:
print('HTTP错误')
except requests.exceptions.RequestException as e:
print('请求异常:', str(e))
7.3 タイムアウト時間の設定
リクエストを送信するときは、適切なタイムアウトを設定することが重要です。待ち時間が長すぎると、プログラムの応答速度に影響を及ぼす可能性があります。パラメータを設定することでtimeout
、リクエストの待ち時間を制限できます。
import requests
response = requests.get('https://api.example.com/data', timeout=5)
リクエストが長期間ブロックされることを避けるために、特定の状況に応じて適切なタイムアウト期間を設定することをお勧めします。
7.4 レスポンスステータスコードの確認
応答を処理するとき、多くの場合、応答のステータス コードを確認する必要があります。ステータス コードが正しい場合は、リクエストが成功したことを示しますが、ステータス コードが正しくない場合は、対応する処理手段が必要になる場合があります。
import requests
response = requests.get('https://api.example.com/data')
if response.status_code == 200:
print('请求成功')
else:
print('请求失败:', response.status_code)
ステータス コードに応じて、リクエストの再試行、ログの記録、例外のスローなど、さまざまな処理ロジックを採用できます。
8. よくある質問
8.1 証明書の検証に失敗しました
場合によっては、requests.exceptions.SSLError
要求された URL で HTTPS プロトコルが使用されており、証明書の検証が失敗すると、要求ライブラリが例外をスローすることがあります。これは通常、ターゲット Web サイトの証明書が無効か期限切れであることが原因です。
verify
この問題を解決するには、証明書の検証をスキップするようにパラメーターを設定しますFalse
。
import requests
response = requests.get('https://api.example.com', verify=False)
証明書の検証をスキップするとセキュリティ上のリスクが生じるため、テスト環境でのみ推奨されることに注意してください。
8.2 リダイレクトの問題
デフォルトでは、Requests ライブラリはリダイレクトを自動的に処理します。サーバーがリダイレクト応答を返すと、Requests ライブラリは自動的にリダイレクトに従い、最終的な応答結果を返します。
import requests
response = requests.get('https://api.example.com/redirect')
print(response.url) # 打印最终
重定向后的URL
allow_redirects
リダイレクトを無効にする必要がある場合は、パラメータを に設定できますFalse
。
import requests
response = requests.get('https://api.example.com/redirect', allow_redirects=False)
print(response.status_code) # 打印重定向响应的状态码
8.3 中国語のエンコーディングの問題
中国語の文字を含むリクエストを処理するときに、エンコードの問題が発生することがあります。文字化けやエンコードエラーを避けるために、encode
anddecode
メソッドを使用して文字エンコードを指定できます。
import requests
response = requests.get('https://api.example.com/data')
response.encoding = 'utf-8' # 指定字符编码
content = response.text
特定の文字エンコーディングに従って、response.encoding
対応する値が設定されます。
接続プールが枯渇した
プログラムが大量のリクエストを頻繁に送信すると、接続プールが枯渇する問題が発生する可能性があります。現時点では、接続プールのサイズを増やすことで同時実行パフォーマンスを向上させることができます。
import requests
adapter = requests.adapters.HTTPAdapter(pool_connections=100, pool_maxsize=100)
session = requests.Session()
session.mount('https://', adapter)
pool_connections
とを適切な値に設定することによりpool_maxsize
、接続プールの容量を増加して、同時リクエストの需要に対応できます。
9. まとめ
このチュートリアルでは、Python Requests ライブラリの基本的な使用法と高度な機能について説明します。GET リクエストと POST リクエストの送信、応答の処理、セッション状態の管理、例外とエラーの処理、およびいくつかの高度な機能の探索方法を学習しました。Requests ライブラリを使いこなすことで、Web 開発における HTTP リクエストとレスポンスの処理を簡単に実行できるようになります。
このチュートリアルの学習を通じて、Python Requests ライブラリについての理解を深め、さまざまな HTTP 通信要件に柔軟に対応できるようにしたいと考えています。
参考リンク: