Las bibliotecas HTTP de Python aceptan un proxy con usuario y contraseña directamente en la URL, sin extensiones ni proxy local. Esta guía cubre las tres más usadas. Para navegador automatizado, mira Selenium y Playwright, Puppeteer y Scrapy.
En el panel, en Mis proxies, copia host, puerto HTTP, puerto SOCKS5, usuario y contraseña.
requests
import requests
proxy = "http://usuario:[email protected]:8000"
proxies = {"http": proxy, "https": proxy}
r = requests.get("https://api.ipify.org?format=json", proxies=proxies, timeout=20)
print(r.json())
Dos claves, http y https, porque requests elige el proxy según el esquema del sitio al que accedes. Con solo http, los sitios HTTPS salen por tu IP real.
Para reutilizar conexiones en muchas peticiones, usa una sesión:
s = requests.Session()
s.proxies.update(proxies)
print(s.get("https://api.ipify.org", timeout=20).text)
SOCKS5 en requests
pip install "requests[socks]"
proxy = "socks5h://usuario:[email protected]:1080"
r = requests.get("https://api.ipify.org", proxies={"http": proxy, "https": proxy}, timeout=20)
Usa socks5h y no socks5: con la h, el nombre del sitio lo resuelve el proxy y el DNS de tu red no aparece. La diferencia entre los protocolos está en HTTP, HTTPS y SOCKS5.
httpx
import httpx
with httpx.Client(proxy="http://usuario:[email protected]:8000", timeout=20) as client:
print(client.get("https://api.ipify.org").text)
En las versiones actuales de httpx el parámetro es proxy, en singular. El antiguo proxies se eliminó; si tu código usa proxies= y se rompió al actualizar, es por eso. Para SOCKS5, instala httpx[socks] y usa socks5:// en la URL.
La versión asíncrona es igual, con httpx.AsyncClient.
aiohttp
import asyncio
import aiohttp
async def main():
async with aiohttp.ClientSession() as session:
async with session.get(
"https://api.ipify.org",
proxy="http://p1.ejemplo.com:8000",
proxy_auth=aiohttp.BasicAuth("usuario", "contrasena"),
timeout=aiohttp.ClientTimeout(total=20),
) as resp:
print(await resp.text())
asyncio.run(main())
aiohttp trabaja con proxy HTTP. Pasar proxy_auth por separado evita el problema de los caracteres especiales en la URL. Para SOCKS5, el camino es el paquete aiohttp-socks.
Contraseña con caracteres especiales
from urllib.parse import quote
usuario = quote("usuario", safe="")
contrasena = quote("c0ntr@:segura", safe="")
proxy = f"http://{usuario}:{contrasena}@p1.ejemplo.com:8000"
Errores más comunes en Python
| Mensaje | Causa | Dónde verlo |
|---|---|---|
Tunnel connection failed: 407 Proxy Authentication Required |
Usuario o contraseña rechazados | Error 407 |
Unable to connect to proxy / Connection refused |
Host o puerto equivocados, red que bloquea | El proxy no conecta |
Tunnel connection failed: 502 |
El proxy no llegó al sitio | Fallo en el túnel |
Missing dependencies for SOCKS support |
Falta requests[socks] |
Instala el extra y vuelve a ejecutar |
ReadTimeout |
Sitio o ruta lentos | Aumenta el timeout y prueba con api.ipify.org |
Buenas prácticas
- Define siempre un
timeout. Sin él, una petición colgada bloquea el script de forma indefinida. - Comprueba la IP al inicio del script con
api.ipify.org, para no pasar horas trabajando con la IP equivocada. - Respeta los límites del sitio. Muchas peticiones por segundo desde la misma IP acaban en bloqueo. Para recoger datos en volumen, mira proxy para web scraping.
- Recuerda lo que el proxy no resuelve. Cambia la IP de salida, pero no las cabeceras, el ritmo de las peticiones ni las condiciones de uso de cada sitio.