PythonのRequestsライブラリで認証付きプロキシを使う方法は複数あります。
状況によって使い分けが必要なので今回の記事でまとめました。
URLに認証情報を入れる方法
一番オーソドックスな方法です。
ただ、Basic認証をサポートしているプロキシサーバのみで可能で、Digest認証などでは別の方法を選ぶ必要があります。
import requests
proxies = {
"http": "http://user:pass@proxy.example.com:8080",
"https": "http://user:pass@proxy.example.com:8080",
}
response = requests.get("http://example.com", proxies=proxies)
print(response.text)
HTTPヘッダーに認証情報を入れる方法
HTTPリクエストヘッダーの方に認証情報を入れる方法です。
この方法ではBasic認証だけでなく、Digest認証などセキュリティが高い方法を選択することもできます。
Basic認証
Basic認証の情報をHTTPヘッダーに含める必要がある場合は下記のようにします。
ただ、この方法はUnicode文字が認証情報含まれている場合うまく動きません。
その場合は、後述する「自力でHTTPヘッダーに認証情報を入れる方法」を検討してください。
import requests
from requests.auth import HTTPProxyAuth
proxies = {
"http": "http://proxy.example.com:8080",
"https": "http://proxy.example.com:8080",
}
auth = HTTPProxyAuth("user", "pass")
response = requests.get("http://example.com", proxies=proxies, auth=auth)
print(response.text)
Digest認証
Digest認証はBasic認証に比べて認証情報をハッシュ化するのでセキュリティが向上した方式です。
こちらの認証方法を行う必要がある場合は以下のようにします。
import requests
from requests.auth import HTTPDigestAuth
proxies = {
"http": "http://proxy.example.com:8080",
"https": "http://proxy.example.com:8080",
}
auth = HTTPDigestAuth("user", "pass")
response = requests.get("http://example.com", proxies=proxies, auth=auth)
print(response.text)
ほかにRequestsではBearer認証などにも対応しています。
自力でHTTPヘッダーに認証情報を入れる方法
Requestsでは認証情報にUnicode文字が含まれている場合エラーになります。
その場合、認証ヘッダーを自力で構築する必要があります。
import requests
import base64
proxies = {
"http": "http://proxy.example.com:8080",
"https": "http://proxy.example.com:8080",
}
auth = "user:pass"
encoded_auth = base64.b64encode(s.encode()).decode()
headers = {
"Proxy-Authorization": f"Basic {encoded_auth}",
}
response = requests.get("http://example.com", proxies=proxies, headers=headers)
print(response.text)