Pythonでプロキシを経由してHTTPリクエストを送信する完全ガイド

企業や組織から指定されたプロキシを通して通信する場合、PythonではRequestsまたは標準ライブラリのurllib.requestを利用できます。本記事では、HTTPプロキシを経由したHTTP/HTTPS通信、Basicプロキシ認証、環境変数、エラーの切り分けを説明します。利用するネットワークと接続先の許可・規約に従い、アクセス拒否や利用制限を迂回する目的では使わないでください。

以下はPython 3向けの設定例です。*.example.invalidは実在の接続先ではなく、認証値も置き換え用です。記事の例を実際のプロキシや外部サイトへ送信して検証した結果ではありません。実行前に管理者指定の値へ変更し、アクセス許可を確認してください。

目次

プロキシの基本とその利点

プロキシは、クライアントと接続先の間で通信を中継します。送信先に見えるIPアドレスが変わる場合がありますが、匿名性は保証されません。プロキシの運用者、ログ、Cookie、ログイン状態などから利用者や通信が識別されることがあります。信頼できる管理者が提供するものを使用してください。

プロキシの利点

プロキシを使用することで得られる主な利点には以下のものがあります:

接続経路と公開IPアドレスの管理

組織の出口プロキシに経路を集約できます。ただし、プロキシだけで追跡防止や機密性が成立するわけではありません。HTTPの内容は暗号化されず、HTTPSでも中継先や接続時刻などの情報は運用者から見える場合があります。

許可された経路での通信

プロキシ経由の接続が必須の企業ネットワークでは、管理者が指定した経路を使用します。接続先の認証、地域条件、アクセス拒否、利用回数制限は引き続き守る必要があります。

セキュリティの強化

フィルタリングや監査を行うプロキシでは、組織の通信ポリシーを適用できます。これらは製品・設定による機能であり、すべてのプロキシが悪意のある通信を防ぐわけではありません。

キャッシュによるパフォーマンス向上

キャッシュ可能な応答を保存する設定なら、転送量や待ち時間を減らせる場合があります。ただし、キャッシュ制御や認証の条件に依存します。HTTPSのCONNECTトンネルをそのまま中継するプロキシは、暗号化された本文を通常のHTTPキャッシュとして扱えません。

プロキシは通信経路を管理する仕組みです。暗号化や匿名化と同一視せず、管理者が指定した方式をPython側に設定しましょう。

Pythonでプロキシを設定する方法

Pythonでは、簡単にプロキシを設定してHTTPリクエストを送信することができます。まずは、基本的なプロキシ設定の方法を紹介します。

requestsライブラリを使用する

Pythonのrequestsライブラリは、HTTPリクエストを簡単に行うための強力なツールです。プロキシの設定も簡単に行えます。

requestsライブラリのインストール

まず、requestsライブラリがインストールされていない場合は、以下のコマンドでインストールします:

python -m pip install requests

プロキシ設定の基本例

以下は、requestsライブラリを使用してプロキシを設定し、HTTPリクエストを送信する基本的な例です:

import requests

# 管理者から指定された HTTP プロキシに置き換える
proxy_url = "http://proxy.example.invalid:8080"
proxies = {"http": proxy_url, "https": proxy_url}

with requests.get("https://example.com/", proxies=proxies,
                  timeout=(5, 20)) as response:
    response.raise_for_status()
    print(response.text)

辞書のキーは接続先URLのスキーム、値の先頭のスキームはプロキシ自体との接続方式です。HTTPS宛てでも、HTTPプロキシなら値はhttp://...になります。この場合は通常CONNECTでトンネルを作り、その中で接続先とのTLS通信を行います。HTTPSプロキシとHTTPS宛先を混同しないでください。

urllibライブラリを使用する

もう一つの方法として、標準ライブラリであるurllibを使用してプロキシを設定することも可能です。

urllibを使ったプロキシ設定の基本例

以下は、urllibを使用してプロキシを設定し、HTTPリクエストを送信する基本的な例です:

import urllib.request

proxy_url = "http://proxy.example.invalid:8080"
handler = urllib.request.ProxyHandler({"http": proxy_url, "https": proxy_url})
opener = urllib.request.build_opener(handler)

with opener.open("https://example.com/", timeout=20) as response:
    print(response.read())

ProxyHandlerを渡してオープナーを作り、opener.open()を直接呼びます。install_opener()でプロセス全体のデフォルトを変更する必要はありません。応答はwithブロックで閉じます。本文はバイト列として表示しており、文字列へ変換する場合は接続先が指定する文字コードを確認してください。

以上の方法を使用することで、Pythonで簡単にプロキシを設定し、HTTPリクエストを送信することができます。次に、具体的なライブラリを使ったプロキシ設定について詳しく見ていきましょう。

requestsライブラリを使ったプロキシ設定

requestsライブラリはPythonでHTTPリクエストを送信するための非常に人気のあるツールで、プロキシの設定も簡単に行うことができます。ここでは、requestsライブラリを使用してプロキシを設定する具体的な方法について解説します。

基本的なプロキシ設定

requestsライブラリでプロキシを設定するためには、プロキシ情報を辞書型で指定し、リクエストメソッドに渡します。以下は基本的な設定方法です:

import requests

# 管理者から指定された HTTP プロキシに置き換える
proxy_url = "http://proxy.example.invalid:8080"
proxies = {"http": proxy_url, "https": proxy_url}

with requests.get("https://example.com/", proxies=proxies,
                  timeout=(5, 20)) as response:
    response.raise_for_status()
    print(response.text)

各リクエストへproxiesを渡すと経路の指定が明確になります。timeout=(5, 20)は接続待ちと読み取り待ちの指定で、処理全体を25秒以内に終わらせる上限ではありません。raise_for_status()は4xx・5xxのHTTP応答を例外として扱います。

認証が必要なプロキシの設定

HTTP Basic方式のプロキシ認証は、URLのユーザー情報部分で指定できます。以下はすべてプレースホルダーです。実際の秘密情報は承認された秘密管理の仕組みから実行時に取得し、ソース管理・ログ・画面出力へ保存しないでください。

import requests
from urllib.parse import quote

# 説明用のプレースホルダー。実際の秘密情報をソースに保存しない
username = "REPLACE_WITH_PROXY_USER"
password = "REPLACE_WITH_PROXY_PASSWORD"
proxy_url = (
    f"http://{quote(username, safe='')}:{quote(password, safe='')}"
    "@proxy.example.invalid:8080"
)
proxies = {"http": proxy_url, "https": proxy_url}

with requests.get("https://example.com/", proxies=proxies,
                  timeout=(5, 20)) as response:
    response.raise_for_status()
    print(response.status_code)

ユーザー名とパスワードをそれぞれquote(..., safe="")でエンコードしています。Basic認証は暗号化ではありません。HTTPS宛先でもHTTPプロキシとのCONNECT要求やその認証は平文区間を通り得るため、組織が認めた保護された経路を使ってください。

Sessionに設定をまとめる場合、session.proxiesだけでは環境変数の設定が優先されることがあります。経路を明示したいときは各呼び出しにproxiesを渡してください。trust_env=Falseはプロキシ以外の環境設定にも影響するため、意味を確認せずに設定しないでください。

環境変数を使ったプロキシ設定

プロキシ設定をコードに直接記述せず、環境変数を使用することもできます。これにより、コードの可読性が向上し、設定の変更が容易になります:

import os
import requests

# 認証情報を含めない説明用の設定。実運用では起動環境で指定する
os.environ["http_proxy"] = "http://proxy.example.invalid:8080"
os.environ["https_proxy"] = "http://proxy.example.invalid:8080"

with requests.get("https://example.com/", timeout=(5, 20)) as response:
    response.raise_for_status()
    print(response.status_code)

Requestsは通常http_proxy、https_proxy、all_proxy、no_proxyおよび大文字版を参照します。no_proxyで対象外になった宛先は環境変数のプロキシを経由しないため、経路要件と既存の設定を確認してください。認証情報を環境変数へ保存することにも漏えいリスクがあり、安全な秘密保管庫の代用にはなりません。

エラーハンドリング

プロキシを使用する際には、エラーハンドリングも重要です。以下は、プロキシエラーをキャッチする例です:

import requests

proxy_url = "http://proxy.example.invalid:8080"
proxies = {"http": proxy_url, "https": proxy_url}

try:
    with requests.get("https://example.com/", proxies=proxies,
                      timeout=(5, 20)) as response:
        response.raise_for_status()
        print(response.status_code)
except requests.exceptions.ProxyError:
    print("プロキシ接続・トンネル確立に失敗しました。設定と認証方式を確認してください。")
except requests.exceptions.SSLError:
    print("証明書を検証できません。接続先と信頼済み CA を確認してください。")
except requests.exceptions.Timeout:
    print("接続または読み取りがタイムアウトしました。")
except requests.exceptions.HTTPError as error:
    print("HTTP エラー:", error.response.status_code)
except requests.exceptions.RequestException:
    print("通信に失敗しました。秘密情報を含めずに原因を調べてください。")

ProxyError、SSLError、Timeout、HTTP応答エラーを分けます。例外本文に接続先や認証付きURLが含まれる可能性を考え、例ではそのまま出力していません。プロキシ認証失敗が常に同じ例外になるとは限りません。

requestsライブラリを使用することで、簡単にプロキシを設定してHTTPリクエストを送信することができます。次に、urllibライブラリを使ったプロキシ設定方法を見ていきましょう。

urllibライブラリを使ったプロキシ設定

urllibライブラリはPythonの標準ライブラリの一部であり、HTTPリクエストを送信するための基本的なツールを提供します。ここでは、urllibを使ってプロキシを設定する具体的な方法について解説します。

基本的なプロキシ設定

urllibを使用してプロキシを設定するには、ProxyHandlerを利用し、オープナーをカスタマイズします。以下はその基本的な例です:

import urllib.request

proxy_url = "http://proxy.example.invalid:8080"
handler = urllib.request.ProxyHandler({"http": proxy_url, "https": proxy_url})
opener = urllib.request.build_opener(handler)

with opener.open("https://example.com/", timeout=20) as response:
    print(response.read())

作成したオープナーだけにプロキシ設定を適用します。ただしurllib.requestでは明示したProxyHandlerでも、no_proxyやOSの除外設定によってプロキシを使わない場合があります。timeout=20はブロックする通信操作の待ち時間で、ダウンロード全体の期限ではありません。標準ライブラリの例はHTTPプロキシを対象とし、プロキシ側のTLSや独自認証が必要なら対応状況を別途確認します。

認証が必要なプロキシの設定

Basic認証のユーザー情報をエンコードしてプロキシURLに含める例です。値は説明用のプレースホルダーであり、実際の秘密情報は保存・表示しません。

import urllib.request
from urllib.parse import quote

username = "REPLACE_WITH_PROXY_USER"
password = "REPLACE_WITH_PROXY_PASSWORD"
proxy_url = (
    f"http://{quote(username, safe='')}:{quote(password, safe='')}"
    "@proxy.example.invalid:8080"
)
handler = urllib.request.ProxyHandler({"http": proxy_url, "https": proxy_url})
opener = urllib.request.build_opener(handler)

with opener.open("https://example.com/", timeout=20) as response:
    print(response.status)

ユーザー情報部分をパーセントエンコードしたURLを渡します。HTTPS接続先への通信であっても、HTTPプロキシとの認証区間まで暗号化されるとは限りません。

環境変数を使ったプロキシ設定

環境変数を使用してプロキシを設定する方法もあります。これにより、コード内でプロキシ設定を直接記述する必要がなくなります:

import urllib.request

# 起動環境にある http_proxy / https_proxy などを読み取る
handler = urllib.request.ProxyHandler()
opener = urllib.request.build_opener(handler)
with opener.open("https://example.com/", timeout=20) as response:
    print(response.read())

引数なしのProxyHandler()は検出した設定を使います。環境変数がない場合はOSの設定を参照する環境もあり、no_proxy等の除外条件も確認が必要です。設定が見つからなければ、プロキシ経由になるとは限りません。

エラーハンドリング

urllibを使用する際には、エラーハンドリングも重要です。以下は、プロキシエラーをキャッチする例です:

import urllib.request
from urllib.error import HTTPError, URLError

proxy_url = "http://proxy.example.invalid:8080"
handler = urllib.request.ProxyHandler({"http": proxy_url, "https": proxy_url})
opener = urllib.request.build_opener(handler)

try:
    with opener.open("https://example.com/", timeout=20) as response:
        print(response.status)
except HTTPError as error:
    print("HTTP エラー:", error.code)
except URLError:
    print("接続・名前解決・証明書などを確認してください。")
except TimeoutError:
    print("通信がタイムアウトしました。")

HTTPErrorはURLErrorの派生なので先に捕捉します。URLErrorはプロキシ専用ではなく、DNS・接続・証明書などの失敗も表します。読み取り中のタイムアウト等も別途考慮してください。

urllibライブラリを使用することで、プロキシを設定してHTTPリクエストを送信することが可能です。次に、認証が必要なプロキシを使用する方法についてさらに詳しく見ていきましょう。

認証が必要なプロキシの使用方法

一部のプロキシサーバーでは、セキュリティのためにユーザー認証が必要です。このセクションでは、Pythonで認証が必要なプロキシを使用する方法について詳しく説明します。

requestsライブラリを使った認証プロキシの設定

requestsライブラリを使用して認証が必要なプロキシを設定する方法を紹介します。

基本的な認証プロキシ設定

以下のコードでは、認証情報をプロキシURLに含めることで認証を行います:

import requests
from urllib.parse import quote

# 説明用のプレースホルダー。実際の秘密情報をソースに保存しない
username = "REPLACE_WITH_PROXY_USER"
password = "REPLACE_WITH_PROXY_PASSWORD"
proxy_url = (
    f"http://{quote(username, safe='')}:{quote(password, safe='')}"
    "@proxy.example.invalid:8080"
)
proxies = {"http": proxy_url, "https": proxy_url}

with requests.get("https://example.com/", proxies=proxies,
                  timeout=(5, 20)) as response:
    response.raise_for_status()
    print(response.status_code)

この形式はBasicプロキシ認証の例です。NTLM・Kerberos・独自SSOなど、別方式の認証にそのまま利用できるとは限りません。組織が指定するクライアントと認証方式を確認してください。

HTTPBasicAuthとの違いとURLエンコード

HTTPBasicAuthやauth=(user, password)は通常、接続先サーバーの認証用であり、プロキシURLの認証指定の代用ではありません。HTTPProxyAuthをリクエストのauthに渡す方法も、HTTPSのCONNECT認証へ同じように適用できると考えないでください。本記事では公式ガイドのプロキシURL形式を使います。

from urllib.parse import quote

# URL の予約文字をエンコードする(Basic のユーザー名に : は不可)
username = "REPLACE_WITH_PROXY_USER"
password = "REPLACE_WITH_PROXY_PASSWORD"
user_part = quote(username, safe="")
password_part = quote(password, safe="")
proxy_url = f"http://{user_part}:{password_part}@proxy.example.invalid:8080"
# proxy_url をログや画面に出さず、proxies の値として渡す

エンコードはユーザー名・パスワードの値だけに行います。Basic認証のユーザー名にコロンは使えず、URLエンコードでその制限を解除できるわけではありません。非ASCII文字の扱いもクライアントとプロキシで一致させる必要があります。接続先用のAuthorizationヘッダーにプロキシの秘密情報を入れないでください。

urllibライブラリを使った認証プロキシの設定

urllibライブラリを使用して認証が必要なプロキシを設定する方法を紹介します。

基本的な認証プロキシ設定

以下のコードでは、認証情報をプロキシURLに含めることで認証を行います:

import urllib.request
from urllib.parse import quote

username = "REPLACE_WITH_PROXY_USER"
password = "REPLACE_WITH_PROXY_PASSWORD"
proxy_url = (
    f"http://{quote(username, safe='')}:{quote(password, safe='')}"
    "@proxy.example.invalid:8080"
)
handler = urllib.request.ProxyHandler({"http": proxy_url, "https": proxy_url})
opener = urllib.request.build_opener(handler)

with opener.open("https://example.com/", timeout=20) as response:
    print(response.status)

認証情報を含むURLは秘密情報として取り扱います。実在する認証情報やプロキシを掲載した例ではありません。

HTTPPasswordMgrWithDefaultRealmを使用する方法

HTTP宛先への407応答に対応する例では、HTTPPasswordMgrWithDefaultRealmとProxyBasicAuthHandlerを組み合わせられます。これは接続先の401認証用ハンドラーとは別です。

import urllib.request

# HTTP 宛先への 407 チャレンジ応答の例。HTTPS CONNECT の例ではない
proxy_url = "http://proxy.example.invalid:8080"
handler = urllib.request.ProxyHandler({"http": proxy_url})
password_mgr = urllib.request.HTTPPasswordMgrWithDefaultRealm()
password_mgr.add_password(None, proxy_url,
                          "REPLACE_WITH_PROXY_USER", "REPLACE_WITH_PROXY_PASSWORD")
auth_handler = urllib.request.ProxyBasicAuthHandler(password_mgr)
opener = urllib.request.build_opener(handler, auth_handler)

with opener.open("http://example.com/", timeout=20) as response:
    print(response.status)

この例はHTTP宛先専用で、通信本文も暗号化されません。HTTPSのCONNECT段階で返る407は同じハンドラーの再試行経路で処理されない場合があるため、汎用的なHTTPS認証例としては使わないでください。必要な認証方式は管理者に確認します。

以上の方法を使用することで、認証が必要なプロキシをPythonで簡単に設定して使用することができます。次に、プロキシを使用した具体的な応用例について見ていきましょう。

プロキシの応用例

プロキシを使用することで、さまざまな実用的なシナリオに対応できます。ここでは、プロキシを利用した具体的な応用例について紹介します。

ウェブスクレイピング

取得を許可されたページを、指定された出口プロキシから取得してタイトルを解析する例です。利用規約・robotsの方針・アクセス頻度を守り、403や429を別のIPアドレスで回避しないでください。BeautifulSoupを使う環境にはbeautifulsoup4パッケージも必要です。

import requests
from bs4 import BeautifulSoup

proxy_url = "http://proxy.example.invalid:8080"
proxies = {"http": proxy_url, "https": proxy_url}
with requests.get("https://example.com/", proxies=proxies,
                  timeout=(5, 20)) as response:
    response.raise_for_status()
    soup = BeautifulSoup(response.content, "html.parser")
    print(soup.title.get_text(strip=True) if soup.title else "タイトルなし")

このコードでは、プロキシを経由してウェブページを取得し、BeautifulSoupを使って解析しています。

許可された地域拠点からの動作確認

自社サービスの地域別表示など、運営者が許可した確認では、承認された拠点の出口プロキシを指定します。第三者サービスの地域制限を解除する手段としては使用しません。

import requests

# 管理者から指定された HTTP プロキシに置き換える
proxy_url = "http://approved-region-proxy.example.invalid:8080"
proxies = {"http": proxy_url, "https": proxy_url}

with requests.get("https://example.com/", proxies=proxies,
                  timeout=(5, 20)) as response:
    response.raise_for_status()
    print(response.text)

例のプロキシ名は予約された無効なドメインです。実行時は承認済みのプロキシと、確認を許可された接続先だけを設定してください。

企業ネットワークのセキュリティ強化

企業ネットワークでは管理者指定のプロキシ・接続先・証明書の条件を使います。内部サービスがプロキシ経由で到達可能か、除外対象かは組織ごとに異なります。

import requests

# 管理者から指定された HTTP プロキシに置き換える
proxy_url = "http://corporate-proxy.example.invalid:8080"
proxies = {"http": proxy_url, "https": proxy_url}

with requests.get("https://service.example.invalid/", proxies=proxies,
                  timeout=(5, 20)) as response:
    response.raise_for_status()
    print(response.text)

このコードのホスト名もプレースホルダーです。プロキシの設定だけで接続先の認証やアクセス権が付与されるわけではありません。

APIのリクエスト制限への対応

APIから429が返ったら、プロキシを切り替えて制限を回避せず、提供者の再試行条件に従います。Retry-Afterがある場合も、秒数またはHTTP日付として解釈し、回数・待ち時間の上限を設けます。次の例は自動再試行をせず停止する最小例です。

import requests

proxy_url = "http://proxy.example.invalid:8080"
proxies = {"http": proxy_url, "https": proxy_url}

with requests.get("https://api.example.invalid/data", proxies=proxies,
                  timeout=(5, 20)) as response:
    if response.status_code == 429:
        # 即時再試行もプロキシ切り替えもしない
        print("利用制限に達しました。API の再試行条件を確認して停止します。")
    else:
        response.raise_for_status()
        print(response.status_code)

この例は429時に追加のリクエストを送りません。再試行を実装する場合は、操作の冪等性や二重処理のリスクも確認してください。

プロキシを利用することで、これらの応用例のように、さまざまな課題を解決し、効率的に作業を行うことができます。次に、プロキシ使用時によく発生する問題とその対策について見ていきましょう。

プロキシに関するよくある問題と対策

プロキシを使用する際には、いくつかのよくある問題が発生することがあります。ここでは、プロキシ使用時に直面する可能性のある問題とその対策について説明します。

接続エラー

プロキシサーバーに接続できない場合、以下のような接続エラーが発生します。この問題は、プロキシサーバーのアドレスやポートが間違っている場合、またはサーバーがダウンしている場合に発生します。

import requests

proxy_url = "http://proxy.example.invalid:8080"
proxies = {"http": proxy_url, "https": proxy_url}

try:
    with requests.get("https://example.com/", proxies=proxies,
                      timeout=(5, 20)) as response:
        response.raise_for_status()
        print(response.status_code)
except requests.exceptions.ProxyError:
    print("プロキシ接続・トンネル確立に失敗しました。設定と認証方式を確認してください。")
except requests.exceptions.SSLError:
    print("証明書を検証できません。接続先と信頼済み CA を確認してください。")
except requests.exceptions.Timeout:
    print("接続または読み取りがタイムアウトしました。")
except requests.exceptions.HTTPError as error:
    print("HTTP エラー:", error.response.status_code)
except requests.exceptions.RequestException:
    print("通信に失敗しました。秘密情報を含めずに原因を調べてください。")

対策:

  1. プロキシサーバーのアドレスとポートを再確認する。
  2. 管理者に稼働状況と許可された接続経路を確認する。
  3. サーバーのステータスを確認する。

認証エラー

認証失敗には、値の誤りだけでなく認証方式の不一致もあります。HTTPの407応答とHTTPSのCONNECT失敗では、Requestsでの見え方が異なる場合があります。次の設定例を使う際も、前述のエラー処理と組み合わせて確認してください。

import requests
from urllib.parse import quote

# 説明用のプレースホルダー。実際の秘密情報をソースに保存しない
username = "REPLACE_WITH_PROXY_USER"
password = "REPLACE_WITH_PROXY_PASSWORD"
proxy_url = (
    f"http://{quote(username, safe='')}:{quote(password, safe='')}"
    "@proxy.example.invalid:8080"
)
proxies = {"http": proxy_url, "https": proxy_url}

# HTTPS トンネルの認証失敗は ProxyError になる場合もある
with requests.get("https://example.com/", proxies=proxies,
                  timeout=(5, 20)) as response:
    response.raise_for_status()
    print(response.status_code)

対策:

  1. 正しいユーザー名とパスワードを使用する。
  2. 407と接続先の401を区別し、秘密情報をログに残さず管理者へ認証方式を確認する。

タイムアウトエラー

Requestsはtimeoutを省略すると待機を打ち切らないことがあります。接続と読み取りに待ち時間を指定しましょう。原因はプロキシだけでなく接続先やネットワークにもあり、読み取りタイムアウトは処理全体の時間制限ではありません。

import requests

proxy_url = "http://proxy.example.invalid:8080"
proxies = {"http": proxy_url, "https": proxy_url}
try:
    with requests.get("https://example.com/", proxies=proxies,
                      timeout=(5, 20)) as response:
        response.raise_for_status()
        print(response.status_code)
except requests.exceptions.Timeout:
    print("接続または読み取りの待ち時間を超えました。")

対策:

  1. 接続待ちと読み取り待ちのどちらで失敗したか調べ、必要な場合だけ妥当な値へ調整する。
  2. プロキシサーバーの応答速度を確認する。
  3. 承認された経路で管理者に相談し、無制限の再試行を避ける。

SSL証明書の問題

HTTPS宛先の証明書、ホスト名、有効期限、証明書チェーンなどに問題があると検証に失敗します。単純なCONNECT中継では通常、接続先の証明書を検証します。組織がTLS検査を行う場合は、管理者の正規手順で配布されたCAが必要になることがあります。

import requests

proxy_url = "http://proxy.example.invalid:8080"
proxies = {"http": proxy_url, "https": proxy_url}
try:
    with requests.get("https://example.com/", proxies=proxies,
                      timeout=(5, 20)) as response:
        response.raise_for_status()
        print(response.status_code)
except requests.exceptions.SSLError:
    print("証明書の検証に失敗しました。検証を無効化せず管理者に確認してください。")

対策:

  1. 検証を無効化して接続を続けず、ホスト名・期限・端末時刻・証明書チェーンを確認する。
  2. 組織のTLS検査が必要な場合だけ、管理者が確認・配布したCAバンドルを使用する。
  3. Requestsでは確認済みCAファイルをverifyに指定するか、REQUESTS_CA_BUNDLEを使う。出所不明のCAを信頼しない。

帯域幅制限

一部のプロキシサーバーは帯域幅を制限しており、大量のデータを送受信する際に問題が発生することがあります。

対策:

  1. 管理者・契約先に利用可能な帯域幅と上限を確認する。
  2. 取得頻度や転送量を減らし、許可される範囲でキャッシュを利用する。
  3. 必要な容量は正規の手続きで相談し、制限回避のための多重接続は行わない。

以上の対策を講じることで、プロキシ使用時に発生する一般的な問題を解決し、安定した接続を維持することができます。最後に、この記事の内容をまとめましょう。

まとめ

Pythonを使用してプロキシを設定し、HTTPリクエストを送信する方法について詳しく解説しました。プロキシの基本概念と利点から始まり、requestsライブラリやurllibライブラリを使ったプロキシ設定の具体的な手順を示しました。また、認証が必要なプロキシの設定方法や、プロキシの応用例、よくある問題とその対策についても説明しました。

接続先とプロキシのスキームを区別し、認証情報の管理、タイムアウト、HTTPステータス、証明書検証を組み合わせることが重要です。プロキシを匿名化や利用制限の回避手段と考えず、承認された通信経路を正しく設定してください。

公式資料

Requests:Proxies、SSL Cert Verification、Timeouts / Errors and Exceptions、Python:urllib.request、urllib.parse.quoteを参照してください。

urllib3:HTTP/HTTPSプロキシとCONNECT、RFC 7617:Basic認証、RFC 6585:429 Too Many Requestsも参照してください。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次