Web scraping con solicitudes de Python y proxies
Un flujo de trabajo de scraping práctico basado en requests y BeautifulSoup, enrutado a través de un proxy autenticado para que su IP de origen permanezca oculta y su rastreador sobreviva a los límites de tasa. Código completo ejecutable incluido.
Un scraper es una sesión, no un bucle de solicitudes.
La diferencia entre un scraper que funciona durante diez minutos y uno que corre durante horas casi nunca es el análisis — es cómo haces las solicitudes. Un for url in urls: requests.get(url) abre una nueva conexión TCP cada vez, no envía encabezados realistas, no mantiene cookies y ataca el objetivo desde una IP hasta que recibe un 429 o un bloqueo.
La solución es un requests.Session más un proxy. Una sesión agrupa conexiones y persiste cookies, por lo que un estallido de páginas es más rápido y parece un cliente coherente. Un proxy autenticado reemplaza tu dirección real con una salida de centro de datos, por lo que el sitio nunca ve tu IP de origen y una sola dirección bloqueada no termina todo el trabajo. Los proxies s4m hablan SOCKS5 en el puerto 1080 y HTTP en el puerto 3128, ambos autenticados con USER:PASS — usa socks5h:// para que el DNS se resuelva de forma remota y los nombres de host nunca se filtren. Para experimentos desechables, la lista de proxies públicos gratuitos es un grupo separado, úsalo bajo tu propio riesgo.
Un scraper de solicitudes resistente
Sesión, encabezados realistas, reintentos con retroceso, rotación de proxy y análisis de BeautifulSoup en un solo archivo. Reemplaza USER:PASS con tus credenciales.
import random
import time
import requests
from bs4 import BeautifulSoup
from requests.exceptions import RequestException
USER, PASS, HOST = "USER", "PASS", "proxy.s4m.online"
POOL = [
f"socks5h://{USER}:{PASS}@{HOST}:1080", # needs requests[socks]
f"http://{USER}:{PASS}@{HOST}:3128",
]
HEADERS = {
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36",
"Accept-Language": "en-US,en;q=0.9",
}
def make_session(proxy):
s = requests.Session()
s.headers.update(HEADERS)
s.proxies = {"http": proxy, "https": proxy}
return s
def fetch(url, retries=4):
for attempt in range(1, retries + 1):
proxy = random.choice(POOL)
try:
s = make_session(proxy)
r = s.get(url, timeout=(5, 20))
if r.status_code == 429:
raise RequestException("rate limited")
r.raise_for_status()
return r
except RequestException as e:
wait = 2 ** attempt + random.random() # exponential backoff
print(f"[{attempt}/{retries}] {proxy} -> {e}; sleeping {wait:.1f}s")
time.sleep(wait)
raise SystemExit(f"giving up on {url}")
html = fetch("https://quotes.toscrape.com/").text
soup = BeautifulSoup(html, "html.parser")
for q in soup.select(".quote"):
text = q.select_one(".text").get_text(strip=True)
who = q.select_one(".author").get_text(strip=True)
print(f"{who}: {text}")Qué mantiene vivo a un crawler
Cuatro hábitos que importan más que el analizador que elijas.
Envía un User-Agent real
El UA predeterminado de python-requests es una bandera instantánea. Establece un User-Agent de navegador normal y un encabezado Accept-Language para que las solicitudes se mezclen con el tráfico ordinario.
Retrocede, no intentes de nuevo ciegamente
En un 429 o un tiempo de espera, duerme con retroceso exponencial y jitter antes de reintentar. Los bucles de reintento ajustados solo profundizan el bloqueo y queman tráfico de proxy.
Rota la salida, no solo el reintento
Elige un proxy nuevo de un grupo en cada intento para que una IP marcada no detenga el trabajo. Los proxies de centro de datos medidos hacen que esto sea barato de escalar.
Respeta el objetivo
Lee robots.txt, limita la concurrencia y raspa solo lo que se te permite. Un rastreador educado también es más difícil de bloquear.
De un script a un pipeline real
Una vez que el bucle de obtención esté sólido, el resto es orquestación. Mantén un pequeño grupo de URLs proxy y rota por solicitud; cuando un objetivo se vuelve agresivo, aumenta el grupo en lugar de la cuenta de reintentos. Persiste los resultados a medida que avanzas para que un fallo a mitad de ejecución nunca te cueste todo el rastreo, y añade un retraso cortés entre páginas para que te mantengas por debajo del límite de tasa en lugar de luchar contra él.
Cuando superas los scripts ad-hoc, el mismo punto final proxy se integra directamente en Scrapy o un cliente asíncrono — consulta proxies rotativos en Python para un grupo aiohttp. Todo está construido sobre los mismos bloques de construcción s4m: proxies SOCKS5 y HTTP autenticados de centro de datos, de pago por uso, con la API y herramientas para verificar IPs de salida y puertos. Si solo necesitas verificar un país o protocolo rápidamente, comienza desde la lista gratuita.
Preguntas, respondidas
¿Necesito PySocks para los ejemplos de SOCKS5?
Sí. El soporte de SOCKS en requests proviene de PySocks — instálalo con pip install "requests[socks]". El punto final HTTP en el puerto 3128 funciona con una instalación estándar de requests y sin dependencias adicionales.
¿Cómo evito ser bloqueado mientras hago scraping?
Envía un User-Agent realista, limita tu tasa de solicitudes, retrocede en las respuestas 429 y rota las IPs de salida a través de un grupo de proxies. Los bloqueos suelen estar relacionados con el comportamiento y la reputación de la IP, no con el parser que usas.
¿Los proxies de s4m son residenciales?
No. s4m vende proxies SOCKS5 y HTTP autenticados de centros de datos, con pago por uso. La lista de proxies públicos gratuitos es de terceros y se utiliza bajo tu propio riesgo, útil solo para pruebas rápidas.
¿Por qué usar socks5h en lugar de socks5?
socks5h le pide al proxy que resuelva DNS, por lo que los nombres de host que raspas nunca se filtran desde tu máquina. socks5 simple resuelve localmente primero, lo que puede revelar tus objetivos.
Proxies construidos para scraping
Dirige las solicitudes a proxy.s4m.online, rota a través de salidas SOCKS5 y HTTP autenticadas de centro de datos, y paga solo por el tráfico que uses. Agrega una IP dedicada siempre que un objetivo espere una.
Las personas encontraron esta página buscando
- web scraping con solicitudes de Python y proxies
- proxy para scraping tutorial
- reenvío de puertos a través de VPN y proxies
- proxy para scraping
- cómo configurar openvpn
- descargar configuración de proxy
- interruptor de apagado de VPN
- proxy http
- cómo lista de proxies gratuitos funciona
- WireGuard vs OpenVPN
- dirección IP
- pagando por una VPN o proxy con cripto
- comprar proxy http
Frases de búsqueda reales que esta página responde — los enlaces abren la página que las cubre en profundidad.