Sin KYC — sin identificación, sin selfie, sin documentos · Paga con criptomonedas: BTC, USDT, USDC, ETH, SOL, LTC
Idioma: Español
Compra con criptomonedas

Guía · Python

Proxies para Python: requests, httpx, aiohttp y Scrapy

Código funcional para los cuatro clientes Python más usados, con un ayudante que construye URLs de proxy dirigidas y persistentes.

Última actualización: · 7 min de lectura

Respuesta rápida

¿Cómo uso proxies en Python?

Pasa una URL de proxy como http://USERNAME-country-ae:[email protected]:7777 a tu cliente HTTP. Nameless Proxy, un proveedor de proxy sin KYC y con privacidad, funciona con requests, httpx, aiohttp y Scrapy, y con socks5h:// en el puerto 7778. La segmentación está en el nombre de usuario. El tráfico residencial empieza en 0,53 US$/GB. Sin KYC — sin ID, sin selfie, sin documentos. Paga con criptomonedas.

Configuración de Python de un vistazo

URL del proxyhttp://USER-country-xx:[email protected]:7777
SOCKS5socks5h://…:7778 con requests[socks]
requestsproxies={"http": url, "https": url}
httpx 0.26+httpx.Client(proxy=url) y httpx.AsyncClient(proxy=url)
aiohttpsession.get(url, proxy=proxy_url) (proxies residenciales)
Scrapyrequest.meta["proxy"], configurado por un middleware de descarga
IP fijaAñade -session-{id}-ttl-{minutes} después de la ciudad, hasta por 60 minutos

¿Cómo uso un proxy con requests?

Dale a requests la misma URL de proxy para las claves http y https. Los destinos HTTPS pasan por un túnel CONNECT, así que la conexión TLS permanece entre tu script y el sitio. Siempre configura un timeout.

requests: una llamada a través de una IP de EAU
# pip install requests
import requests

USERNAME = "USERNAME"   # base proxy username from the client area
PASSWORD = "PASSWORD"   # proxy password (not your account password)
HOST = "gw.namelessproxy.com"
HTTP_PORT = 7777
SOCKS_PORT = 7778

proxy = f"http://{USERNAME}-country-ae:{PASSWORD}@{HOST}:{HTTP_PORT}"
proxies = {"http": proxy, "https": proxy}

r = requests.get("https://api.ipify.org?format=json", proxies=proxies, timeout=30)
print(r.json())   # {'ip': '...'}

¿Cómo creo URLs de proxy dirigidas y con IP fija?

Usa un asistente para cada biblioteca. El nombre de usuario sigue a USERNAME-country-{cc}-city-{city}-session-{id}-ttl-{minutes}, así que el asistente añade partes en este orden: país, luego ciudad, luego sesión y TTL. Sin sesión obtienes una IP rotativa; con sesión, la IP se mantiene mientras dure el TTL.

proxy_url(): un lugar para dirigir
import uuid

def proxy_url(country, city=None, session=None, ttl=30, scheme="http"):
    """Build a gateway URL. Targeting lives in the username, in this order:
    country -> city -> session -> ttl."""
    user = f"{USERNAME}-country-{country.lower()}"
    if city:
        user += f"-city-{city.lower().replace(' ', '_')}"
        if session:
            user += f"-session-{session}-ttl-{ttl}"
    port = SOCKS_PORT if scheme.startswith("socks") else HTTP_PORT
    return f"{scheme}://{user}:{PASSWORD}@{HOST}:{port}"

def new_session():
    """A fresh session ID = a fresh sticky IP."""
    return uuid.uuid4().hex[:10]

# Rotating IP in Egypt, and a sticky IP in Abu Dhabi for 30 minutes
rotating = proxy_url("eg")
sticky = proxy_url("ae", city="Abu Dhabi", session=new_session(), ttl=30)

¿Cómo uso SOCKS5 en Python?

Instala el extra SOCKS y usa el esquema socks5h://. El h hace que el proxy resuelva los nombres de host, así que las consultas DNS también salen desde el país destino. El socks5:// simple resuelve DNS en tu máquina.

requests sobre SOCKS5
# pip install "requests[socks]"
# socks5h:// = the proxy resolves DNS, so lookups also exit in the target country
proxy = proxy_url("ke", scheme="socks5h")
r = requests.get("https://api.ipify.org", proxies={"http": proxy, "https": proxy}, timeout=30)
print(r.text)

¿Cómo reintento solicitudes fallidas con una IP nueva?

Reintenta en errores de conexión y en respuestas 429 y 5xx, con retroceso exponencial y un pequeño retraso aleatorio. Con un nombre de usuario rotativo, cada conexión nueva puede salir desde una IP nueva, así que un reintento también es una IP fresca. Para trabajo con IP fija, inicia un nuevo ID de sesión cuando falle una IP.

Retroceso y reintento
import random
import time

RETRY_STATUS = {429, 500, 502, 503, 504}

def fetch(url, country="ae", attempts=4):
    """Retry with exponential backoff. Each attempt opens a new connection,
    so a rotating username exits from a new IP."""
    for attempt in range(attempts):
        proxy = proxy_url(country)
        try:
            r = requests.get(url, proxies={"http": proxy, "https": proxy}, timeout=30)
            if r.status_code not in RETRY_STATUS:
                return r
        except (requests.exceptions.ConnectionError, requests.exceptions.Timeout):
            pass  # ProxyError is a ConnectionError: retry on a new IP
        time.sleep(min(2 ** attempt + random.random(), 30))
    raise RuntimeError(f"Giving up on {url} after {attempts} attempts")

¿Cómo uso httpx, sincronizado y asincrónico?

Desde httpx 0.26, un cliente toma un solo argumento proxy=; el antiguo proxies= fue eliminado en la 0.28. Un cliente mantiene las conexiones activas, y las solicitudes en una conexión activa comparten una IP de salida. Abre un cliente nuevo, o usa una sesión fija a propósito, según lo que necesites.

httpx: cliente persistente y lote asíncrono
# pip install httpx   (0.26 or later: the argument is "proxy", not "proxies")
import asyncio
import httpx

# Sync: one sticky IP in Nairobi for 10 minutes
with httpx.Client(proxy=proxy_url("ke", city="nairobi", session=new_session(), ttl=10), timeout=30) as client:
    print(client.get("https://api.ipify.org").text)

# Async: 20 connections at most, rotating IPs in Nigeria
async def main(urls):
    limits = httpx.Limits(max_connections=20)
    async with httpx.AsyncClient(proxy=proxy_url("ng"), timeout=30, limits=limits) as client:
        results = await asyncio.gather(*(client.get(u) for u in urls), return_exceptions=True)
    for url, res in zip(urls, results):
        print(url, res.status_code if isinstance(res, httpx.Response) else repr(res))

asyncio.run(main(["https://api.ipify.org"] * 5))

¿Cómo ejecuto muchas solicitudes con aiohttp?

aiohttp toma el proxy por solicitud, con las credenciales dentro de la URL. Solo soporta proxies HTTP; para SOCKS5 necesitas un paquete extra como aiohttp-socks. Limita la concurrencia con un semáforo: comienza con alrededor de 10 a 20 solicitudes paralelas y aumenta mientras tu tasa de error se mantenga baja.

aiohttp con límite de concurrencia
# pip install aiohttp   (HTTP proxies only; the credentials can sit in the proxy URL)
import asyncio
import aiohttp

async def fetch(session, url, sem):
    async with sem:
        async with session.get(url, proxy=proxy_url("eg")) as r:
            return r.status, await r.text()

async def main(urls):
    sem = asyncio.Semaphore(20)   # concurrency cap
    timeout = aiohttp.ClientTimeout(total=30)
    async with aiohttp.ClientSession(timeout=timeout) as session:
        results = await asyncio.gather(*(fetch(session, u, sem) for u in urls), return_exceptions=True)
    print(results)

asyncio.run(main(["https://api.ipify.org"] * 5))

¿Cómo agrego el proxy a Scrapy?

Escribe un pequeño middleware de descarga que establezca request.meta["proxy"]. El HttpProxyMiddleware incorporado de Scrapy convierte las credenciales en un encabezado Proxy-Authorization. Dale a tu middleware un número menor a 750 para que se ejecute primero. Las claves meta por solicitud permiten que un spider mezcle países y sesiones persistentes.

middlewares.py
# myproject/middlewares.py
USERNAME = "USERNAME"
PASSWORD = "PASSWORD"
GATEWAY = "gw.namelessproxy.com:7777"

class NamelessProxyMiddleware:
    """Set the proxy per request from request.meta:
    country (default 'ae'), optional city, optional session + ttl."""

    def process_request(self, request, spider):
        meta = request.meta
        user = f"{USERNAME}-country-{meta.get('country', 'ae')}"
        if meta.get("city"):
            user += f"-city-{meta['city']}"
            if meta.get("session"):
                user += f"-session-{meta['session']}-ttl-{meta.get('ttl', 10)}"
        # Scrapy's HttpProxyMiddleware turns the credentials into Proxy-Authorization
        meta["proxy"] = f"http://{user}:{PASSWORD}@{GATEWAY}"
settings.py
# myproject/settings.py
DOWNLOADER_MIDDLEWARES = {
    # Below 750 so it runs before Scrapy's built-in HttpProxyMiddleware
    "myproject.middlewares.NamelessProxyMiddleware": 350,
}
CONCURRENT_REQUESTS = 16
DOWNLOAD_TIMEOUT = 30
RETRY_TIMES = 3
RETRY_HTTP_CODES = [429, 500, 502, 503, 504, 408]
AUTOTHROTTLE_ENABLED = True
ROBOTSTXT_OBEY = True

# In a spider:
# yield scrapy.Request(url, meta={"country": "sa", "city": "riyadh", "session": "cart01"})

Preguntas frecuentes

¿Por qué recibo un 407 o ProxyError en Python?

Un 407 significa que el gateway rechazó las credenciales. Verifica el nombre de usuario base y la contraseña del proxy en el área de cliente, el orden de las partes de targeting y cualquier carácter especial en la contraseña, que debe estar codificada en URL. Un ProxyError sin 407 suele significar un puerto incorrecto o un firewall. Prueba la misma URL con curl desde la guía rápida.

¿Por qué no cambia mi IP entre solicitudes?

Probablemente tu cliente está reutilizando una conexión persistente. Un requests.Session, un cliente httpx o una sesión aiohttp mantienen conexiones abiertas, y una conexión mantiene una IP de salida. Para una IP nueva por solicitud, llama a requests.get sin sesión o abre un cliente nuevo. Si añadiste un ID de sesión, la IP es persistente a propósito.

¿Debo usar requests, httpx o aiohttp?

Usa requests para scripts simples y trabajos pequeños. Usa httpx cuando quieras una librería para código síncrono y asíncrono, o HTTP/2. Usa aiohttp para rastreos asíncronos grandes donde controlas la concurrencia tú mismo. Usa Scrapy cuando necesites un rastreador completo con programación, reintentos y pipelines. Los cuatro funcionan con la misma URL de proxy.

¿Puede un script usar varios países a la vez?

Sí. El targeting es parte de cada URL de proxy, así que crea una URL diferente por solicitud o por cliente: proxy_url("ae") para Emiratos Árabes Unidos y proxy_url("ng") para Nigeria, por ejemplo. El tráfico se factura desde el mismo saldo sin importar el país, y el precio por GB no cambia según el país.

¿Cuánto tráfico usa un scraper?

Depende de las páginas: una página HTML suele tener decenas a cientos de kilobytes, mientras que imágenes y scripts suman mucho más. El tráfico se cuenta en GB decimales (1 GB = 1,000,000,000 bytes), y el área de cliente muestra el uso diario por suscripción y subusuario. Descarga solo lo que parseas y omite imágenes para mantener bajos los costos.

¿El código Python funciona con puertos móviles dedicados?

Sí, con el host, puerto, usuario y contraseña propios del puerto desde el área de cliente en lugar de los valores del gateway. El país y operador de un puerto dedicado se eligen al rentarlo, y puedes moverlo después. Para cambiar su IP desde Python, consulta la guía de rotación de IP móvil.

Ejecuta tu código Python a través de IPs residenciales

Desde 0,53 US$/GB, pagado con criptomonedas. Sin KYC — sin ID, sin selfie, sin documentos.

Desde 0,53 US$/GB · sin KYC

Comprar proxies