Para o formato IPv4 dun provedor de proxy HTTP ip:port:user:password, converte os campos antes de pasarlle o valor a 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}

A división limitada conserva os dous puntos adicionais dentro do contrasinal. Eliminar só os finais de liña tamén evita quitar en silencio espazos que poderían pertencer a unha credencial.

Codifica o nome de usuario e o contrasinal como compoñentes de URL separados. Un @ nun contrasinal en bruto non debe confundirse co separador anterior ao host do proxy. Esta función espera credenciais en bruto; pasar texto xa codificado pode volver codificar o signo de porcentaxe.

O mapa devolto selecciona este proxy para destinos HTTP e HTTPS. Unha clave como http://192.0.2.10 ten outro significado en Requests: selecciona unha ruta para ese host de destino. Non é un índice dun conxunto de servidores proxy.

O analizador acepta deliberadamente só o formato IPv4 indicado. Non cobre nomes de usuario con dous puntos nin enderezos IPv6 sen corchetes; eses precisan un formato de entrada inequívoco. Mantén as URL xeradas con credenciais fóra dos rexistros habituais.

Artigos relacionados