[Python] urllib3の使い方

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リクエストを送信するために、以下のステップが必要です。

  1. urllib3.PoolManagerオブジェクトを作成します。
  2. 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_multipartfieldsパラメータが設定された場合に、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の特徴について、別記事でまとめたので、よかったら見てください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次