Pasa un mapeo vacío a ProxyHandler cuando un solo opener de urllib deba conectarse directamente:

from urllib.request import ProxyHandler, build_opener

direct = build_opener(ProxyHandler({}))

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

El diccionario vacío no proporciona rutas de proxy. Si omites el mapeo, el manejador descubre los proxies a partir de su entorno y los ajustes de la plataforma. Estas dos construcciones expresan políticas diferentes.

El ejemplo utiliza la biblioteca estándar de Python y mantiene la verificación HTTPS normal. El bloque with cierra la respuesta, incluso cuando una excepción provoca la salida del bloque.

Solicitudes directas y mediante proxy en la misma aplicación

Dos openers pueden representar las dos políticas sin cambiar variables de entorno entre llamadas:

from urllib.request import ProxyHandler, build_opener

direct = build_opener(ProxyHandler({}))
proxied = build_opener(ProxyHandler({
    "http": "http://127.0.0.1:8080",
    "https": "http://127.0.0.1:8080",
}))

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

Sustituye la dirección de bucle local por tu proxy HTTP, o elige un candidato de la lista de proxies HTTP para la comparación mediante proxy. Puede transportar la conexión al destino HTTPS mediante CONNECT cuando el servicio lo permita. Asegúrate de que el protocolo y la autenticación admitidos por el servicio de escucha sean compatibles con el manejador.

Mantén intacto el opener predeterminado

Llama a direct.open o proxied.open mediante el objeto responsable de la ruta. install_opener cambia el valor predeterminado de todo el proceso que usan las funciones de conveniencia de urllib; por tanto, una biblioteca que lo utilice puede afectar a código ajeno. No hace falta para el opener aislado anterior.

El argumento timeout es un ajuste de operación, no un límite de tiempo real para la totalidad de cada transferencia. Lee solo los datos que necesita la tarea y usa un plazo de nivel superior si hay un presupuesto total estricto.

Estos objetos opener no modifican el cliente de otra biblioteca, un proceso existente ni la configuración de proxy de un navegador.

Artículos relacionados