PythonのHTTPリクエストライブラリであるurllib3について、使い方を本ページで説明します。
urllib3とは
urllib3は、PythonのHTTPクライアントライブラリであり、HTTPリクエストを送信するための高水準のインターフェースを提供します。urllib3は、Python標準ライブラリのurllibとは異なり、HTTPプロトコルを実装するために、低レベルのライブラリであるhttplibを利用しています。urllib3は、HTTPリクエストの送信と、HTTPレスポンスの受信のための便利な機能を提供することで、より高水準なHTTPクライアントライブラリとして使用されます。
urllib3のインストール
urllib3は、pipを使って簡単にインストールすることができます。以下のコマンドをターミナルで実行してください。
pip install urllib3
urllib3の基本的な使い方
urllib3を使用して、HTTPリクエストを送信するために、以下のステップが必要です。
urllib3.PoolManager
オブジェクトを作成します。PoolManager
オブジェクトのrequest
メソッドを呼び出して、HTTPリクエストを送信します。
以下の例は、httpbin.org
にGETリクエストを送信して、レスポンスの内容を表示するプログラムです。
import urllib3
http = urllib3.PoolManager()
url = 'http://httpbin.org/get'
response = http.request('GET', url)
print(response.data.decode('utf-8'))
httpbin.org
は、HTTPリクエストとレスポンスをテストするためのWebサービスであり、上記のプログラムは、httpbin.org
からレスポンスを受け取り、その内容を表示しています。
HTTPリクエストの送信
PoolManager
オブジェクトのrequest
メソッドを呼び出すと、HTTPリクエストが送信されます。request
メソッドには、以下のパラメータがあります。
method
:HTTPメソッドを指定します。url
:リクエスト先のURLを指定します。fields
:POSTリクエストの場合に、送信するフォームデータを指定します。headers
:HTTPヘッダーを指定します。body
:HTTPリクエストのボディを指定します。encode_multipart
:fields
パラメータが設定された場合に、multipart/form-data形式でエンコードするかどうかを指定します。preload_content
:レスポンスを受け取る前に、すべてのレスポンスデータをロードするかどうかを指定します。timeout
:タイムアウト時間を指定します。retries
:リトライ回数を指定します。
以下は、POSTリクエストを送信する例です。fields
パラメータには、key1
というキーに対して、value1
という値を設定しています。
import urllib3
http = urllib3.PoolManager()
url = 'http://httpbin.org/post'
data = {'key1': 'value1'}
response = http.request('POST', url, fields=data)
print(response.data.decode('utf-8'))
HTTPリクエストのエラーハンドリング
HTTPリクエストを送信する際に、いくつかのエラーが発生する可能性があります。例えば、リクエスト先のサーバーが応答しない場合や、リクエスト先のURLが見つからない場合などです。このようなエラーに対処するために、urllib3は例外を発生させます。以下は、例外をキャッチしてエラーハンドリングを行う例です。
import urllib3
http = urllib3.PoolManager()
url = 'http://httpbin.org/status/404'
try:
response = http.request('GET', url)
response.raise_for_status()
except urllib3.exceptions.HTTPError as e:
print('HTTP error occurred:', e)
except Exception as e:
print('Other error occurred:', e)
上記の例では、httpbin.org
に対して/status/404
のURLにGETリクエストを送信しています。これは存在しないURLなので、HTTP 404 Not Foundのエラーが発生します。response.raise_for_status()
メソッドを呼び出すことで、HTTPエラーが発生した場合には例外を発生させることができます。例外が発生した場合には、HTTPError
例外が発生します。
SSL証明書の検証
urllib3は、SSL証明書の検証をデフォルトで行います。これは、通信のセキュリティを確保するために重要な機能です。しかし、証明書の検証を無効にする場合があるかもしれません。例えば、開発中のWebサービスをテストするために、自己署名証明書を使用する場合などです。以下は、SSL証明書の検証を無効にする例です。
import urllib3
import certifi
http = urllib3.PoolManager(cert_reqs='CERT_NONE', ca_certs=certifi.where())
url = 'https://self-signed.badssl.com/'
response = http.request('GET', url)
print(response.data.decode('utf-8'))
これは、cert_reqs
パラメータにCERT_NONE
を指定し、ca_certs
パラメータにcertifi
ライブラリのwhere()
メソッドを指定しています。certifi
ライブラリは、一般的な証明書認証局から発行された信頼できる証明書を提供するために使用されます。
プロキシの使用
urllib3を使用すると、プロキシサーバーを経由してHTTPリクエストを送信することができます。以下は、プロキシサーバーを使用してHTTPリクエストを送信する例です。
import urllib3
http = urllib3.PoolManager(proxy_url='http://proxy.example.com:8080')
url = 'http://httpbin.org/get'
response = http.request('GET', url)
print(response.data.decode('utf-8'))
上記の例では、proxy.example.com
という名前のプロキシサーバーを経由してhttpbin.org
にGETリクエストを送信しています。proxy_url
パラメータにプロキシサーバーのURLを指定するだけで、簡単にプロキシサーバーを使用することができます。
まとめ
以上で、urllib3ライブラリの基本的な使い方について説明しました。urllib3を使用することで、Pythonで簡単にHTTPリクエストを送信することができます。また、urllib3は多くのオプションを提供するため、HTTPリクエストをより高度な設定で送信することもできます。これらの機能をうまく活用することで、WebスクレイピングやAPIのクライアントプログラムなど、様々な用途に応用することができます。
HTTPリクエストを行うモジュールとして、requestsがあります。うurllib3とrequestsの特徴について、別記事でまとめたので、よかったら見てください。