Специальные символы в паролях прокси
Кодируйте имя пользователя и пароль прокси отдельно, чтобы @, двоеточия, косые черты и # не нарушали URL.
Пароль с @ или # может нарушить вручную собранный URL прокси, даже если учётные данные верны. Эти символы уже имеют значение в URL, поэтому клиент может разобрать часть пароля как имя хоста или фрагмент.
Кодируйте два поля учётных данных отдельно
В этом примере структурные разделители URL сохраняются, а кодируются только имя пользователя и пароль:
from urllib.parse import quote
username = "user@team"
password = "p:a/ss#?"
proxy_url = (
"http://"
+ quote(username, safe="")
+ ":"
+ quote(password, safe="")
+ "@203.0.113.10:8080"
)
Используйте свой фактический узел и учётные данные. Показанный адрес — пример для документации. Пустой аргумент safe важен: quote обычно не экранирует косую черту, но внутри этого поля учётных данных её нужно кодировать.
Не кодируйте URL прокси целиком. Кодирование разделителей схемы и @ между учётными данными и хостом разрушает структуру, которую вы хотели сохранить. Также не кодируйте уже закодированный пароль повторно.
Используйте результат с Requests
import requests
response = requests.get(
"https://example.com/",
proxies={"http": proxy_url, "https": proxy_url},
timeout=(5, 15),
)
response.raise_for_status()
Если запрос по-прежнему не проходит, выясните, отклоняет ли прокси вход или клиент отказал раньше — при разборе либо соединении. Запрос аутентификации 407 и недопустимый URL — разные сбои.
HTTPX позволяет отделить аутентификацию
Объект Proxy в HTTPX принимает адрес узла и учётные данные отдельными аргументами:
import httpx
proxy = httpx.Proxy(
"http://203.0.113.10:8080",
auth=("user@team", "p:a/ss#?"),
)
with httpx.Client(proxy=proxy, trust_env=False, timeout=15) as client:
response = client.get("https://example.com/")
response.raise_for_status()
Это избавляет от ручного построения части userinfo. Однако не шифрует учётные данные независимо от соединения с прокси и не выбирает метод аутентификации, поддерживаемый всеми сервисами.
Если бесплатный список даёт только IP и порт, этот пример не является источником учётных данных по умолчанию. Используйте аутентификацию лишь тогда, когда оператор действительно предоставляет аккаунт. Не помещайте URL с учётными данными в общие журналы и исходные файлы.