El web scraping choca casi siempre contra el mismo muro: el sitio ve que desde una misma dirección IP llega una cantidad sospechosa de peticiones y empieza a bloquear, a mostrar captchas o a servir páginas «vacías». Los proxies resuelven este problema: sustituyen su IP real por otra ajena y reparten la carga. Pero no todos los proxies son iguales: hay decenas de variantes, y de la elección depende que su scraper pase desapercibido o se queme en el primer centenar de peticiones.
A continuación, un repaso de todos los tipos principales de proxy, sus propiedades, los niveles de privacidad y la tarificación, además de ejemplos de código en varios lenguajes.
Qué es un proxy y para qué sirve en el scraping
Un servidor proxy es un intermediario entre su scraper y el sitio objetivo. La petición no viaja directa, sino a través del proxy: el sitio ve la IP del proxy, no la suya. En el scraping esto aporta tres cosas:
- Ocultación de la IP real — resulta más difícil identificar y vetar a la persona que hay detrás.
- Reparto de la carga — un pool de cientos de IP permite enviar muchas peticiones sin superar los límites de cada dirección concreta.
- Evasión de restricciones geográficas — puede recopilar datos como si estuviera en el país que necesita (los precios, los resultados de búsqueda y el contenido dependen a menudo de la región).
Clasificación por protocolo: HTTP, HTTPS, SOCKS
Es lo primero que hay que entender: en qué nivel trabaja el proxy.
Proxy HTTP
Trabaja solo con tráfico HTTP. «Entiende» la estructura de la petición HTTP, puede leer y modificar cabeceras y cachear respuestas. Para scrapear sitios corrientes suele bastar.
Proxy HTTPS (HTTP CONNECT)
Lo mismo, pero sabe tunelizar tráfico TLS cifrado mediante el método CONNECT. El proxy no ve el contenido (va cifrado); se limita a reenviar los bytes. Hoy casi toda la web funciona sobre HTTPS, así que el soporte de CONNECT es obligatorio.
SOCKS4 y SOCKS5
SOCKS trabaja a un nivel más bajo: es un túnel universal para cualquier tráfico TCP (y SOCKS5, también UDP). El proxy no entra en el contenido: le da igual que sea HTTP, FTP, WebSocket o cualquier otra cosa.
En qué se diferencian SOCKS y un proxy HTTP:
| HTTP(S) | SOCKS5 | |
|---|---|---|
| Nivel | De aplicación (entiende HTTP) | De transporte (solo mueve TCP/UDP) |
| Puede leer/modificar cabeceras | Sí | No |
| Caché | Posible | No |
| Protocolos | Solo HTTP/HTTPS | Cualquier TCP, más UDP |
| Velocidad | Algo más de sobrecarga | Suele ser más rápido, más «transparente» |
| Autenticación | Basic/Digest | Usuario y contraseña, GSSAPI |
Diferencia entre SOCKS4 y SOCKS5:
- SOCKS4 — antiguo: no soporta autenticación por contraseña, ni IPv6, ni UDP, y no sabe resolver el DNS en el lado del proxy (el dominio se convierte en IP en su máquina; eso es una fuga, porque por las consultas DNS puede deducirse qué está scrapeando).
- SOCKS5 — soporta autenticación, IPv6, UDP y resolución DNS remota (
socks5hen el esquema de la URL). Para el scraping es preferible, porque el DNS no se filtra.
Regla práctica: si duda entre los dos, quédese con SOCKS5 (y use en el código el esquema
socks5h://, para que el DNS se resuelva a través del proxy).
Clasificación por el origen de la IP
Mucho más importante que el protocolo es de dónde procede la dirección IP. Justo eso determina lo «humano» que parece usted ante los sistemas anti-bots.
Proxies de centro de datos (datacenter)
Las IP pertenecen a proveedores de hosting y centros de datos (AWS, OVH, Hetzner, etc.).
- ➕ Baratos, muy rápidos, disponibles por miles.
- ➖ Fáciles de detectar: los sistemas anti-bots mantienen bases con las subredes de los centros de datos. Muchos sitios bloquean estas IP de forma preventiva.
- Sirven para scrapear sitios «tolerantes», sin protección seria.
Proxies residenciales (residential)
IP de usuarios domésticos reales, asignadas por proveedores de internet (ISP). El tráfico pasa por dispositivos de personas de carne y hueso (a menudo mediante redes P2P o SDK integrados en aplicaciones).
- ➕ Parecen usuarios normales; cuesta distinguirlos del tráfico real.
- ➖ Más caros, más lentos y, en ocasiones, inestables.
- Adecuados para sitios con protección seria (marketplaces, redes sociales, buscadores).
Proxies móviles (mobile)
IP de operadores móviles (3G/4G/5G). Su particularidad: los operadores usan CGNAT, así que detrás de una misma IP hay cientos de abonados reales.
- ➕ El nivel de confianza más alto: vetar esa IP equivale a vetar a un montón de personas reales, y por eso los sitios actúan con cautela.
- ➖ Los más caros; velocidad y estabilidad inferiores.
- Se emplean allí donde todo lo demás cae bloqueado al instante.
Proxies ISP (static residential)
Un híbrido: las IP pertenecen formalmente a un proveedor de internet (como las residenciales), pero están alojadas físicamente en un centro de datos (como las datacenter).
- ➕ Velocidad de centro de datos + reputación de proveedor de internet. Son estáticas (no cambian), lo que resulta cómodo para sesiones largas.
- ➖ Más caras que las de centro de datos.
Comparación rápida por «discreción» y precio:
Datacenter → ISP → Residenciales → Móviles
más baratos/ más caros/
más visibles más discretosIPv4 vs IPv6
El espacio de direcciones IPv4 se agotó: hay pocas direcciones y son caras. IPv6 es prácticamente infinito, y por eso los proxies IPv6 salen bastante más baratos.
Pero hay trampa: los proxies IPv6 solo funcionan si el sitio objetivo soporta IPv6. Muchos sitios grandes siguen únicamente en IPv4, y en ese caso un proxy IPv6 sencillamente no podrá conectarse.
| IPv4 | IPv6 | |
|---|---|---|
| Disponibilidad de direcciones | Escasez | Prácticamente infinita |
| Precio del proxy | Más alto | Más bajo |
| Compatibilidad con sitios | Casi universal | Solo si el sitio funciona sobre IPv6 |
| Detección | IPv4 resulta más «familiar» a los anti-bots | Las subredes enormes de un mismo proveedor se vetan por bloques enteros |
Conclusión: IPv6 compensa por precio para scrapear sitios que con seguridad soportan IPv6 (Google y muchos servicios internacionales). Para el resto, y para la máxima compatibilidad, IPv4.
Niveles de privacidad (anonimato) del proxy
Un proxy puede «delatarle» de varias maneras, añadiendo cabeceras HTTP de servicio a la petición. Según lo que se transmita, se distinguen tres niveles.
1. Transparent (transparente)
Transmite su IP real en las cabeceras y declara abiertamente que es un proxy.
Via: 1.1 proxy
X-Forwarded-For: SU_IP_REALPara el scraping es inútil: el sitio ve tanto el hecho del proxy como a usted. Estos proxies suelen instalarse en redes corporativas o públicas para cachear.
2. Anonymous (anónimo)
Oculta su IP real, pero no oculta el propio hecho de usar un proxy.
Via: 1.1 proxy
X-Forwarded-For: IP_DEL_PROXY (o ausente, pero Via delata el proxy)La IP real queda protegida, pero el sistema anti-bots ve la etiqueta «esto es un proxy» y puede ponerse suspicaz.
3. Elite / High Anonymous (elite)
No transmite ni su IP ni señales de proxy. La petición parece hecha en conexión directa.
(nada de Via, X-Forwarded-For, X-Real-IP ni Proxy-Connection)¿Por qué unos proxies transmiten estos datos y otros no? Es cuestión de configuración del propio servidor proxy. Los transparentes añaden X-Forwarded-For a propósito, para que el servidor de destino conozca al cliente original (así se concibieron los proxies de caché y corporativos). Los elite están configurados para limpiar todas esas cabeceras. Las cabeceras que delatan a un proxy: Via, X-Forwarded-For, X-Real-IP, Forwarded, Proxy-Connection, X-Proxy-ID.
Para el scraping sirven únicamente los proxies elite. Anonymous, bajo su cuenta y riesgo; transparent, jamás.
Rotación: proxies estáticos y rotatorios
- Estáticos (sticky) — la misma IP se mantiene durante mucho tiempo. Son necesarios donde hace falta una sesión (login, carrito), para que el sitio no le «pierda» al cambiar de IP.
- Rotatorios (rotating) — la IP cambia automáticamente: con cada petición o cada N minutos. Ideales para la recolección masiva en la que la sesión no importa. A menudo el proveedor entrega un único endpoint «pasarela» y hace la rotación en su lado, sobre un pool de miles de direcciones.
TOR como proxy gratuito
TOR (The Onion Router) es una red anónima en la que el tráfico atraviesa una cadena de tres nodos: de entrada (guard/entry), intermedio (middle) y de salida (exit). Cada capa de cifrado se retira en su nodo correspondiente: de ahí el enrutamiento «de cebolla». En local, TOR levanta un proxy SOCKS5 (puerto 9050 por defecto) al que se puede conectar el scraper.
Sí, en TOR también se pueden elegir la geografía y los nodos. Mediante el archivo de configuración torrc se controla por qué países salir a internet:
# Salir solo por nodos de estos países
ExitNodes {us},{de},{nl}
StrictNodes 1
# Se pueden fijar los nodos de entrada/salida por países
EntryNodes {de}
ExcludeNodes {ru},{cn}
ExcludeExitNodes {ru}Los códigos de país van entre llaves, según ISO ({us}, {de}, {fr}). StrictNodes 1 prohíbe salirse de la lista indicada. Para cambiar de circuito (obtener una nueva IP de salida) basta con enviar la señal NEWNYM al puerto de control.
Desventajas de TOR para el scraping:
- Lento — tres saltos más la congestión de la red.
- Nodos de salida en listas negras — la lista de nodos de salida es pública, y muchos sitios bloquean todo TOR de forma preventiva.
- Pool de IP pequeño — los nodos de salida se cuentan por miles, no por millones como en los proveedores residenciales. La rotación es limitada.
- Vale para tareas puntuales y experimentos, pero no para scraping industrial.
Listas de proxies gratuitos
Internet está lleno de sitios con listas de proxies gratuitos (free proxy lists): miles de pares IP:puerto que se pueden descargar ahora mismo. Suena tentador, pero su calidad es sistemáticamente mala:
- La mayoría están muertos ya en el momento de descargarlos: sobrevive, con suerte, entre un 5 y un 20%.
- Lentos e inestables — unas veces responden y otras no.
- Con frecuencia son transparentes — filtran su IP.
- Ya figuran en listas negras — los usaron miles de personas antes que usted, y los sitios serios los vetaron hace tiempo.
- Riesgo de seguridad — no se sabe quién mantiene el proxy; puede interceptar o alterar el tráfico (especialmente peligroso con HTTP sin cifrar y al transmitir credenciales).
Conclusión: los proxies gratuitos sirven para aprender y para experimentos de un solo uso, pero cualquier scraping serio o comercial exige proxies de pago. Precisamente por eso, todo proxy público debe verificarse antes de usarlo (véase más abajo).
Verificación (checking) de proxies
Un proxy no se puede tomar y usar sin más, sobre todo si procede de listas públicas. Hay que verificarlos, porque «mueren» constantemente, se ralentizan y cambian de comportamiento. Qué se comprueba:
- Si está vivo — si responde siquiera y con qué código.
- Velocidad / latencia — tiempo de respuesta (ping, tiempo hasta el primer byte). Los lentos se descartan.
- Nivel de anonimato — si filtra su IP real. Se comprueba con una petición a un servicio de eco (por ejemplo, un endpoint que devuelve su IP y sus cabeceras) y verificando si aparecen
X-Forwarded-ForoVia. - Geolocalización real — una IP puede declararse «alemana» y estar de hecho en otro país. Se contrasta con una base GeoIP.
- Tipo/reputación — si está en listas negras o marcada como datacenter/proxy (mediante servicios de fraud score).
- Soporte de HTTPS — si pasa el
CONNECTy no rompe el TLS.
El verificador más simple en Python: intentamos llegar a un servicio de eco a través del proxy y miramos qué vuelve:
import requests
def check_proxy(proxy: str, timeout: int = 8):
proxies = {"http": proxy, "https": proxy}
try:
r = requests.get("https://httpbin.org/get",
proxies=proxies, timeout=timeout)
data = r.json()
origin_ip = data.get("origin")
headers = data.get("headers", {})
leaked = any(h in headers for h in
("X-Forwarded-For", "Via", "X-Real-Ip"))
return {
"ok": True,
"ip": origin_ip,
"anonymous": not leaked, # True = la IP real no se filtró
"latency": r.elapsed.total_seconds(),
}
except Exception as e:
return {"ok": False, "error": str(e)}
print(check_proxy("http://user:pass@1.2.3.4:8080"))Cómo influyen los proxies en la detección durante el scraping
Un proxy, por sí solo, no es una «capa de invisibilidad». Los sistemas anti-bots (Cloudflare, DataDome, PerimeterX/HUMAN, Akamai) examinan multitud de señales, y la IP es solo una de ellas.
Qué delata a un scraper en el frente de la IP:
- El tipo de IP. Las subredes de los centros de datos son conocidas y se etiquetan como «no humano». Las residenciales y móviles inspiran más confianza. Es el principal factor sobre el que influye la elección del proxy.
- La reputación de la IP (fraud score). El historial de la dirección: spam, botnets, vetos anteriores. Una IP «sucia» canta aunque sea residencial.
- La frecuencia de peticiones desde una misma IP (rate limiting). Demasiadas peticiones por segundo = bloqueo. Un pool de proxies con rotación reparte la carga y reduce la frecuencia por dirección.
- La distribución geográfica. Si «un mismo usuario» salta en un minuto de Estados Unidos a Brasil y de vuelta, es un bot evidente. Por eso, dentro de una misma sesión conviene mantener la IP estable.
- El ASN. El número de sistema autónomo revela a quién pertenece la IP (a un hosting o a un proveedor real).
Qué NO cubren los proxies (y por qué un proxy solo no basta):
- La huella TLS/JA3 — la firma de su handshake TLS. La de
requests/curlno se parece a la de un navegador, y se ve a través de cualquier proxy. - Las cabeceras HTTP y su orden — un
User-Agenttorcido o no estándar, la ausencia de las cabeceras habituales de un navegador. - El fingerprint del navegador — Canvas, WebGL, fuentes, entorno JS (relevante para navegadores headless).
- El comportamiento — patrones de clics y navegación demasiado rápidos, demasiado regulares, «no humanos».
Conclusión: un proxy de calidad (residencial o móvil, elite, con buena reputación) reduce drásticamente la detección por IP, pero hay que combinarlo con cabeceras correctas, un fingerprint realista y una velocidad de peticiones razonable. El proxy es condición necesaria, pero no suficiente.
Tarificación: qué le cobran exactamente
Los proveedores cobran de maneras distintas, y del modelo depende qué resulta más rentable para su tarea.
- Por tráfico (per GB). Paga los gigabytes de datos transferidos; el pool de IP es enorme y «gratuito». Típico de residenciales y móviles. Peligroso al scrapear páginas «pesadas» con imágenes o vídeo: la factura crece deprisa. Para ahorrar: descargar solo el HTML y bloquear la carga de archivos multimedia.
- Por número de IP (per IP). Paga direcciones concretas (por ejemplo, 100 proxies estáticos datacenter o ISP) con tráfico ilimitado. Rentable con grandes volúmenes de datos e IP estables.
- Por puertos/hilos (per port / per thread). Paga el número de conexiones simultáneas, no el volumen. Frecuente en los proxies móviles.
- Por peticiones (per request) o suscripción. Propio de las APIs de scraping llave en mano, en las que el proveedor rota los proxies por usted y entrega el HTML ya listo.
Cómo elegir: muchas peticiones pequeñas a páginas ligeras → sale mejor per GB o per request; trasiego de grandes volúmenes → sale mejor per IP con tráfico ilimitado.
Ejemplos de código: conexión a un proxy en varios lenguajes
El formato de la cadena de proxy es casi universal: esquema://usuario:contraseña@host:puerto, por ejemplo http://user:pass@1.2.3.4:8080.
Python — requests (síncrono)
import requests
proxies = {
"http": "http://user:pass@1.2.3.4:8080",
"https": "http://user:pass@1.2.3.4:8080",
}
r = requests.get("https://httpbin.org/ip", proxies=proxies, timeout=10)
print(r.json())
# SOCKS5 con DNS remoto (requiere el paquete: pip install requests[socks])
socks = {"http": "socks5h://user:pass@1.2.3.4:1080",
"https": "socks5h://user:pass@1.2.3.4:1080"}
print(requests.get("https://httpbin.org/ip", proxies=socks).json())Python — httpx (asíncrono, con rotación)
import asyncio, httpx, random
POOL = [
"http://user:pass@1.2.3.4:8080",
"http://user:pass@5.6.7.8:8080",
]
async def fetch(url):
proxy = random.choice(POOL) # IP aleatoria del pool en cada petición
async with httpx.AsyncClient(proxy=proxy, timeout=10) as client:
resp = await client.get(url)
return resp.status_code, resp.text[:80]
async def main():
tasks = [fetch("https://httpbin.org/ip") for _ in range(5)]
for code, body in await asyncio.gather(*tasks):
print(code, body)
asyncio.run(main())Python — TOR (SOCKS5 + cambio de circuito)
import requests
from stem import Signal
from stem.control import Controller
proxies = {"http": "socks5h://127.0.0.1:9050",
"https": "socks5h://127.0.0.1:9050"}
print(requests.get("https://httpbin.org/ip", proxies=proxies).json())
# Solicitar una nueva IP de salida (un circuito nuevo)
with Controller.from_port(port=9051) as c:
c.authenticate(password="su_contraseña")
c.signal(Signal.NEWNYM)Node.js — axios + HttpsProxyAgent
const axios = require("axios");
const { HttpsProxyAgent } = require("https-proxy-agent");
const agent = new HttpsProxyAgent("http://user:pass@1.2.3.4:8080");
axios.get("https://httpbin.org/ip", { httpsAgent: agent, httpAgent: agent })
.then(res => console.log(res.data))
.catch(err => console.error(err.message));Node.js — SOCKS5
const axios = require("axios");
const { SocksProxyAgent } = require("socks-proxy-agent");
// socks5h:// — el DNS se resuelve en el lado del proxy
const agent = new SocksProxyAgent("socks5h://user:pass@1.2.3.4:1080");
axios.get("https://httpbin.org/ip", { httpAgent: agent, httpsAgent: agent })
.then(res => console.log(res.data));Node.js — Puppeteer (navegador headless a través de proxy)
const puppeteer = require("puppeteer");
(async () => {
const browser = await puppeteer.launch({
args: ["--proxy-server=http://1.2.3.4:8080"],
});
const page = await browser.newPage();
// autenticación en el proxy, si hace falta
await page.authenticate({ username: "user", password: "pass" });
await page.goto("https://httpbin.org/ip");
console.log(await page.evaluate(() => document.body.innerText));
await browser.close();
})();Go — net/http
package main
import (
"fmt"
"io"
"net/http"
"net/url"
)
func main() {
proxyURL, _ := url.Parse("http://user:pass@1.2.3.4:8080")
client := &http.Client{
Transport: &http.Transport{Proxy: http.ProxyURL(proxyURL)},
}
resp, err := client.Get("https://httpbin.org/ip")
if err != nil {
panic(err)
}
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
fmt.Println(string(body))
}PHP — cURL
<?php
$ch = curl_init("https://httpbin.org/ip");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_PROXY => "1.2.3.4:8080",
CURLOPT_PROXYUSERPWD => "user:pass",
CURLOPT_PROXYTYPE => CURLPROXY_HTTP, // o CURLPROXY_SOCKS5_HOSTNAME
CURLOPT_TIMEOUT => 10,
]);
echo curl_exec($ch);
curl_close($ch);cURL desde la línea de comandos
# Proxy HTTP
curl -x http://user:pass@1.2.3.4:8080 https://httpbin.org/ip
# SOCKS5 con DNS remoto
curl --proxy socks5h://user:pass@1.2.3.4:1080 https://httpbin.org/ipChecklist final para elegir proxy de scraping
| Tarea | Recomendación |
|---|---|
| Sitios ligeros sin protección | Proxies datacenter, IPv4 |
| Sitios con anti-bots (marketplaces, buscadores) | Residenciales, elite, con rotación |
| Sitios ultraprotegidos / redes sociales | Proxies móviles |
| Hace falta sesión (login, carrito) | Estáticos (sticky) ISP/residenciales |
| Solo sitios con IPv6, ahorro | Proxies IPv6 |
| Experimento puntual / aprendizaje | TOR o listas gratuitas (con verificación) |
| El DNS no debe filtrarse | SOCKS5 con esquema socks5h:// |
Reglas principales:
- Elija anonimato elite: ninguna fuga de
X-Forwarded-For/Via. - Verifique sin excepción cualquier proxy público o gratuito antes de ponerlo a trabajar.
- Para los sitios protegidos, residenciales o móviles, no datacenter.
- Los proxies cubren la detección por IP, pero no por fingerprint: combínelos con cabeceras correctas y una velocidad de peticiones razonable.
- Calcule la tarificación según su tarea: muchas peticiones ligeras → per GB/per request; grandes volúmenes → per IP.