【Pythonクローラー】シンプルかつ強力なリクエストライブラリ

ここに画像の説明を挿入

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=value1key2=value2URL に追加します。

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 は属性を使用して取得できcookiescookiesカスタム 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 中国語のエンコーディングの問題

中国語の文字を含むリクエストを処理するときに、エンコードの問題が発生することがあります。文字化けやエンコードエラーを避けるために、encodeanddecodeメソッドを使用して文字エンコードを指定できます。

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 通信要件に柔軟に対応できるようにしたいと考えています。

参考リンク:

おすすめ

転載: blog.csdn.net/mingfeng4923/article/details/131077681