{"id":355,"date":"2026-07-14T08:19:19","date_gmt":"2026-07-14T06:19:19","guid":{"rendered":"https:\/\/proxyseo.es\/blog\/355-2\/"},"modified":"2026-07-14T08:19:21","modified_gmt":"2026-07-14T06:19:21","slug":"proxies-python-requests-y-scrapy","status":"publish","type":"post","link":"https:\/\/proxyseo.es\/blog\/proxies-python-requests-y-scrapy\/","title":{"rendered":"Proxies Python Requests y Scrapy"},"content":{"rendered":"<p>Extraer datos a gran escala sin protecci\u00f3n es pedir un problema. La diferencia entre un proyecto que funciona y una IP baneada para siempre suele estar en los detalles de la conexi\u00f3n, y ah\u00ed entra el uso de <strong>proxies Python Requests Scrapy<\/strong>. Los sitios web ya no son tontos; sistemas como Cloudflare o Akamai analizan el tr\u00e1fico en tiempo real y cortan la conexi\u00f3n si detectan el m\u00e1s m\u00ednimo patr\u00f3n sospechoso. Despu\u00e9s de a\u00f1os lidiando con infraestructura de red, una cosa est\u00e1 clara: el c\u00f3digo puede ser perfecto, pero si la conexi\u00f3n intermedia es basura, el proyecto cae.<\/p>\n<h2>Por qu\u00e9 tu bot necesita proxies residenciales o dedicados<\/h2>\n<p>Si lanzas tu script desde el servidor de casa o tu VPS habitual, est\u00e1s desnudo. Tu direcci\u00f3n IP est\u00e1 ah\u00ed, expuesta, cantando qui\u00e9n eres y desde d\u00f3nde conectas. Los anti-bots miran la frecuencia de las peticiones, revisan los headers y, sobre todo, el origen. Ven 100 peticiones por segundo desde la misma direcci\u00f3n y no lo dudan: grifo cerrado. Asumen que es un ataque o un bot mal programado.<\/p>\n<p>Aqu\u00ed es donde los proxies salvan el d\u00eda. Act\u00faan como ese intermediario necesario. Tu script pide datos al proxy, y es el proxy quien va al servidor de destino. El sitio ve la IP del proxy, no la tuya. Pero ojo, no sirve cualquiera. Necesitas proxies que no est\u00e9n en listas negras. Servicios como <strong>ProxySEO.es<\/strong> dan acceso a proxies HTTP\/s y SOCKSv5 dedicados con IPs espa\u00f1olas. Haces que el tr\u00e1fico parezca leg\u00edtimo, como si viniera de un usuario real en una ubicaci\u00f3n geogr\u00e1fica concreta.<\/p>\n<h2>Configuraci\u00f3n de proxies en la librer\u00eda Requests<\/h2>\n<p>No hay muchas dudas: <em>Requests<\/em> es el est\u00e1ndar en Python para esto. Meter un proxy es f\u00e1cil, pero si quieres que el proyecto aguante, tienes que ir m\u00e1s all\u00e1 de lo b\u00e1sico. Hay que gestionar errores, poner tiempos de espera y, sobre todo, no quedarse quieto con una sola IP.<\/p>\n<p>Para empezar, as\u00ed es como se estructura un proxy en Requests:<\/p>\n<div class=\"result-box\">\n<pre><code>import requests\n\n<p>proxies = {<\/p>\n<p>'http': 'http:\/\/usuario:contrase\u00f1a@ip_proxy:puerto',<\/p>\n<p>'https': 'http:\/\/usuario:contrase\u00f1a@ip_proxy:puerto',<\/p>\n<p>}<\/p>\n\n<p>try:<\/p>\n<p>response = requests.get('https:\/\/httpbin.org\/ip', proxies=proxies, timeout=10)<\/p>\n<p>print(response.json())<\/p>\n<p>except requests.exceptions.RequestException as e:<\/p>\n<p>print(f\"Error en la petici\u00f3n: {e}\")<\/p>\n<\/code><\/pre>\n<\/div>\n<h3>Rotaci\u00f3n de User-Agents y Headers<\/h3>\n<p>Con cambiar la IP no basta. Si tu <code>User-Agent<\/code> dice claramente <code>python-requests\/x.y.z<\/code>, te cerrar\u00e1n la puerta en la cara en segundos. Tienes que parecer un navegador de verdad.<\/p>\n<pre><code>import random\n\n<p>user_agents = [<\/p>\n<p>'Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/91.0.4472.124 Safari\/537.36',<\/p>\n<p>'Mozilla\/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit\/605.1.15 (KHTML, like Gecko) Version\/14.0.3 Safari\/605.1.15',<\/p>\n<p>]<\/p>\n\n<p>headers = {<\/p>\n<p>'User-Agent': random.choice(user_agents),<\/p>\n<p>'Accept-Language': 'es-ES,es;q=0.9',<\/p>\n<p>'Accept-Encoding': 'gzip, deflate, br',<\/p>\n<p>'Connection': 'keep-alive',<\/p>\n<p>}<\/p>\n\n<p>response = requests.get('https:\/\/objetivo.com', proxies=proxies, headers=headers)<\/p>\n<\/code><\/pre>\n<h2>Implementaci\u00f3n avanzada en Scrapy Middleware<\/h2>\n<p>Scrapy es otra historia. Es un framework potente, pensado para escalar, y su arquitectura de <em>middlewares<\/em> es perfecta para inyectar proxies sin ensuciar el c\u00f3digo de cada Spider. Lo ideal es no configurar el proxy en cada archivo, sino crear un <em>Middleware<\/em> central que gestione la asignaci\u00f3n y rotaci\u00f3n de IPs autom\u00e1ticamente para todo el proyecto.<\/p>\n<h3>Creaci\u00f3n del Middleware de Proxy<\/h3>\n<p>Crea un archivo (por ejemplo, <code>middlewares.py<\/code>) y define una clase que intercepte la petici\u00f3n antes de salir. Este ejemplo asume que ya tienes una lista de proxies dedicados, como los que ofrece ProxySEO.es:<\/p>\n<pre><code>import random\n\n<p>class ProxyRotationMiddleware:<\/p>\n<p>def __init__(self, proxies_list):<\/p>\n<p>self.proxies = proxies_list<\/p>\n\n<p>@classmethod<\/p>\n<p>def from_crawler(cls, crawler):<\/p>\n<p># Obtener la lista de proxies desde settings.py<\/p>\n<p>return cls(<\/p>\n<p>proxies_list=crawler.settings.getlist('PROXY_LIST')<\/p>\n<p>)<\/p>\n\n<p>def process_request(self, request, spider):<\/p>\n<p># Seleccionar un proxy aleatorio de la lista<\/p>\n<p>proxy = random.choice(self.proxies)<\/p>\n<p>request.meta['proxy'] = proxy<\/p>\n<p># Opcional: Imprimir para depuraci\u00f3n (comentar en producci\u00f3n)<\/p>\n<p>spider.logger.info(f'Usando proxy: {proxy}')<\/p>\n\n<p>def process_exception(self, request, exception, spider):<\/p>\n<p># Si falla el proxy (ej: error 407 o timeout), podemos manejarlo aqu\u00ed<\/p>\n<p>if 'proxy' in request.meta:<\/p>\n<p>spider.logger.error(f'Fallo con el proxy {request.meta[\"proxy\"]}: {exception}')<\/p>\n<\/code><\/pre>\n<h3>Activaci\u00f3n del Middleware en settings.py<\/h3>\n<p>Para que Scrapy sepa que tiene que usar este middleware, toca tocar <code>settings.py<\/code>. A\u00f1ade esto:<\/p>\n<pre><code>\n<h2>Lista de proxies (formato http:\/\/user:pass@ip:port)<\/h2>\n<p>PROXY_LIST = [<\/p>\n<p>'http:\/\/mi_usuario:mi_pass@192.168.1.10:8080',<\/p>\n<p>'http:\/\/mi_usuario:mi_pass@192.168.1.11:8080',<\/p>\n<p># A\u00f1ade aqu\u00ed tus proxies de ProxySEO.es<\/p>\n<p>]<\/p>\n\n<h2>Prioridad del middleware (300 es un buen valor para que sobrescriba otros)<\/h2>\n<p>DOWNLOADER_MIDDLEWARES = {<\/p>\n<p>'myproject.middlewares.ProxyRotationMiddleware': 300,<\/p>\n<p>'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 400,<\/p>\n<p>}<\/p>\n\n<h2>Desactivar el cache para asegurar peticiones frescas durante pruebas<\/h2>\n<p>HTTPCACHE_ENABLED = False<\/p>\n<\/code><\/pre>\n<h2>Estrategias para evitar bloqueos con \u00e9xito<\/h2>\n<p>Tener buenos proxies, como los de <strong>ProxySEO.es<\/strong> con su tr\u00e1fico ilimitado y IPs est\u00e1ticas espa\u00f1olas, es el principio. Pero tu comportamiento tambi\u00e9n importa. Si lanzas 10.000 peticiones en un minuto, aunque la IP sea limpia, el patr\u00f3n de tr\u00e1fico gritar\u00e1 \u00absoy un robot\u00bb. Hay que ser inteligente.<\/p>\n<h3>Limitaci\u00f3n de velocidad (Rate Limiting)<\/h3>\n<p>Configura <code>DOWNLOAD_DELAY<\/code> en Scrapy o usa <code>time.sleep()<\/em> en Requests. Hay que simular respiraci\u00f3n humana. En Scrapy queda as\u00ed:<\/p>\n<pre><code>\n<h2>Espera aleatoria entre 2 y 5 segundos entre peticiones<\/h2>\n<p>DOWNLOAD_DELAY = 3<\/p>\n<p>RANDOMIZE_DOWNLOAD_DELAY = True<\/p>\n<\/code><\/pre>\n<h3>Sesiones y Cookies<\/h3>\n<p>Mantener la sesi\u00f3n en Requests ayuda a conservar cookies, \u00fatil si necesitas login. En Scrapy vienen activadas por defecto, pero si rotas mucho de IP, a veces el sitio se lia y pierde la sesi\u00f3n. Si solo buscas datos p\u00fablicos est\u00e1ticos, a veces es mejor desactivarlas (<code>COOKIES_ENABLED = False<\/code>) para reducir la huella digital y simplificar el proceso.<\/p>\n<h3>Monitoreo y Soporte para Agentes IA<\/h3>\n<p>Si est\u00e1s metiendo mano en agentes de Inteligencia Artificial que navegan por su cuenta, la estabilidad lo es todo. Los proxies de ProxySEO.es est\u00e1n pensados para esto y son compatibles con <strong>soporte MCP para agentes IA<\/strong>. Tus sistemas pueden leer, consultar y tomar decisiones sin que un bloqueo geogr\u00e1fico o de IP les corte las alas.<\/p>\n<h2>Protocolos: HTTP\/s vs SOCKSv5<\/h2>\n<p>Elegir bien el protocolo importa m\u00e1s de lo que parece. Los proxies <strong>HTTP\/s<\/strong> van bien para el tr\u00e1fico web est\u00e1ndar y son m\u00e1s sencillos de configurar en Scrapy. Ahora bien, si tu scraping se sale de lo HTTP (tema de sockets o scraping de email, por ejemplo), el protocolo <strong>SOCKSv5<\/strong> gana por goleada. Maneja cualquier tr\u00e1fico TCP y suele ser un pel\u00edn m\u00e1s r\u00e1pido al tener menos sobrecarga en el handshake inicial.<\/p>\n<p>En ProxySEO.es tienes ambos. Si quieres usar SOCKS5 con Requests, necesitas el paquete extra <code>[socks]<\/code> (<code>pip install requests[socks]<\/code>) y ajustar el esquema:<\/p>\n<pre><code>\n<p>proxies = {<\/p>\n<p>'http': 'socks5:\/\/usuario:pass@ip:puerto',<\/p>\n<p>'https': 'socks5:\/\/usuario:pass@ip:puerto',<\/p>\n<p>}<\/p>\n<\/code><\/pre>\n<h2>Preguntas Frecuentes<\/h2>\n<div class=\"faq-block\">\n<h3>\u00bfQu\u00e9 es mejor para Scrapy: proxies de centros de datos o residenciales?<\/h3>\n<p>Depende. Para sitios con anti-bots agresivos, los residenciales pasan m\u00e1s desapercibidos. Pero si necesitas velocidad y fiabilidad para grandes vol\u00famenes de datos, los proxies de centros de datos dedicados \u2014como los de ProxySEO.es\u2014 son imbatibles en precio y estabilidad.<\/p>\n<\/div>\n<div class=\"faq-block\">\n<h3>\u00bfCu\u00e1ntas peticiones por segundo puedo hacer con un proxy dedicado?<\/h3>\n<p>No hay un n\u00famero m\u00e1gico, depende del sitio. Pero como regla de oro, empieza despacio: una petici\u00f3n cada 2 o 3 segundos. Con proxies dedicados de calidad puedes escalar, pero vigila siempre los c\u00f3digos 429 (Too Many Requests) para no pasarte de la raya.<\/p>\n<\/div>\n<h2>Conclusi\u00f3n<\/h2>\n<p>Montar un sistema con <strong>proxies Python Requests Scrapy<\/strong> no es solo copiar y pegar c\u00f3digo; es una estrategia de supervivencia para tu operaci\u00f3n de datos. Si escatimas en calidad de proxies, te enfrentar\u00e1s a CAPTCHAS constantes y bans que te har\u00e1n perder el tiempo. Apuesta por proxies dedicados, an\u00f3nimos y con IPs espa\u00f1olas como los de ProxySEO.es. As\u00ed construyes una infraestructura que aguanta desde scripts simples hasta agentes IA complejos con soporte MCP. Y ojo: combina buena IP con cabeza. Controla la velocidad, rota cabeceras y respeta el sitio objetivo.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Extraer datos a gran escala sin protecci\u00f3n es pedir un problema. La diferencia entre un proyecto que funciona y una IP baneada para siempre suele estar en los detalles de&#8230;<\/p>\n","protected":false},"author":1,"featured_media":357,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":["post-355","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-proxies"],"_links":{"self":[{"href":"https:\/\/proxyseo.es\/blog\/wp-json\/wp\/v2\/posts\/355","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/proxyseo.es\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/proxyseo.es\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/proxyseo.es\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/proxyseo.es\/blog\/wp-json\/wp\/v2\/comments?post=355"}],"version-history":[{"count":1,"href":"https:\/\/proxyseo.es\/blog\/wp-json\/wp\/v2\/posts\/355\/revisions"}],"predecessor-version":[{"id":356,"href":"https:\/\/proxyseo.es\/blog\/wp-json\/wp\/v2\/posts\/355\/revisions\/356"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/proxyseo.es\/blog\/wp-json\/wp\/v2\/media\/357"}],"wp:attachment":[{"href":"https:\/\/proxyseo.es\/blog\/wp-json\/wp\/v2\/media?parent=355"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/proxyseo.es\/blog\/wp-json\/wp\/v2\/categories?post=355"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/proxyseo.es\/blog\/wp-json\/wp\/v2\/tags?post=355"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}