Преобразование записей IPv4 ip:port:user:password для Requests
Разберите ip:port:user:password ограниченным разделением и закодируйте части учётных данных перед построением карты прокси.
Если HTTP-прокси использует формат IPv4 ip:port:user:password, преобразуйте поля перед передачей значения в Requests:
from ipaddress import IPv4Address
from urllib.parse import quote
def proxy_map(line):
host, port, user, password = line.rstrip('\r\n').split(':', 3)
host = str(IPv4Address(host))
port = int(port)
if not 1 <= port <= 65535:
raise ValueError('Proxy port is out of range')
credentials = quote(user, safe='') + ':' + quote(password, safe='')
url = f'http://{credentials}@{host}:{port}'
return {'http': url, 'https': url}
Ограниченное разделение сохраняет дополнительные двоеточия внутри пароля. Удаление только окончаний строк также не даёт молча срезать пробелы, которые могут принадлежать учётным данным.
Кодируйте имя пользователя и пароль как отдельные компоненты URL. Символ @ в исходном пароле нельзя путать с разделителем перед хостом прокси. Эта функция ожидает исходные учётные данные; если передать уже закодированный текст, знак процента может быть закодирован повторно.
Возвращённая карта выбирает этот прокси для назначений HTTP и HTTPS. Ключ вроде http://192.0.2.10 имеет в Requests другой смысл: он выбирает маршрут для этого хоста назначения. Это не индекс для пула прокси-серверов.
Парсер намеренно принимает указанный формат IPv4. Он не охватывает имена пользователей с двоеточиями или адреса IPv6 без скобок; для них нужен однозначный формат ввода. Держите сгенерированные URL с учётными данными вне обычных журналов.