Volver al blog

Cómo raspar sitios de noticias sin bloqueos: configuración de proxy y eludir la protección

Guía completa para configurar el scraping de sitios de noticias: elección del tipo de proxy, eludir sistemas anti-bot, configuración de rotación de IP y ejemplos de código en Python.

📅7 de marzo de 2026
```html

Los sitios de noticias son uno de los recursos más protegidos en Internet. Cloudflare, limitación de tasa, bloqueos por IP: todo esto convierte el scraping de noticias en un serio desafío técnico. En esta guía, analizaremos cómo configurar correctamente un proxy para la recopilación estable de datos de portales de noticias, qué tipo de proxy elegir para diferentes tareas y cómo eludir los modernos sistemas de protección.

Por qué los sitios de noticias bloquean los scrapers

Los portales de noticias son especialmente sensibles a la recopilación automática de datos por varias razones. En primer lugar, el contenido es su principal activo, que monetizan a través de publicidad y suscripciones. El scraping masivo permite a los competidores copiar materiales y reduce el tráfico único. En segundo lugar, la alta carga de bots aumenta los costos de servidores y CDN.

Los sitios de noticias modernos utilizan una protección de múltiples niveles:

  • Cloudflare y análogos — verifican JavaScript, huellas TLS del navegador, patrones de comportamiento
  • Limitación de tasa — limitan el número de solicitudes desde una IP (generalmente 10-50 solicitudes por minuto)
  • Bloqueo por User-Agent — bloquean encabezados estándar de bibliotecas (Python-requests, curl)
  • CAPTCHA — se muestran ante actividad sospechosa
  • Geobloqueos — algunos portales de noticias solo están disponibles desde ciertos países

Señales típicas por las que los sitios de noticias detectan scrapers: la misma IP hace muchas solicitudes consecutivas, ausencia de JavaScript, orden no estándar de los encabezados HTTP, velocidad de solicitudes demasiado rápida (una persona no puede abrir 10 páginas por segundo), ausencia de cookies y referrer.

Importante: El scraping de sitios de noticias se encuentra en una zona gris. Siempre verifique el robots.txt y los Términos de Servicio del recurso objetivo. Para el uso comercial de los datos, se recomienda utilizar API oficiales o establecer acuerdos de asociación.

Qué tipo de proxy elegir para el scraping de noticias

La elección del tipo de proxy depende de la escala de la tarea, el presupuesto y el nivel de protección de los sitios objetivo. Consideremos tres opciones principales y su aplicabilidad para el scraping de noticias.

Tipo de proxy Velocidad Costo Cuándo usar
Proxies de centros de datos Alta (50-100 ms) Baja Sitios sin Cloudflare, gran volumen de datos, pruebas
Proxies residenciales Media (200-500 ms) Alta Sitios con Cloudflare, protección estricta, geotargeting
Proxies móviles Media (300-600 ms) Muy alta Máxima protección, versiones móviles de sitios de noticias

Proxies de centros de datos para el scraping de noticias

Son adecuados para el scraping de sitios de noticias sin protección seria: publicaciones regionales, blogs, pequeños portales de información. Ventajas: alta velocidad (importante al hacer scraping de cientos de fuentes), bajo costo (se puede alquilar un pool de 50-100 IP), conexión estable.

Desventajas: se detectan fácilmente por ASN (pertenencia a un centro de datos), a menudo ya están en listas negras de grandes sitios, no pasan el desafío de Cloudflare en el 70% de los casos. Utilice proxies de centros de datos para scraping masivo de feeds RSS, sitemap.xml, endpoints de API o para recopilar metadatos (títulos, fechas de publicación) sin cargar el contenido completo.

Proxies residenciales — el estándar de oro

Los proxies residenciales son direcciones IP de usuarios domésticos reales, proporcionadas por proveedores de Internet. Para los sitios de noticias, parecen visitantes normales, lo cual es crítico al trabajar con recursos protegidos.

Cuándo son obligatorios los proxies residenciales: scraping de grandes portales de noticias (CNN, BBC, Reuters, RBC, Kommersant), sitios detrás de Cloudflare o protección similar, recopilación de datos de ciertos países (geotargeting), sesiones prolongadas con autorización. Los proxies residenciales pasan las verificaciones de JavaScript de Cloudflare, tienen una reputación de IP limpia, y soportan sesiones pegajosas (fijación de IP durante 10-30 minutos).

Consejo práctico: utilice proxies residenciales con rotación por tiempo (sesiones pegajosas), en lugar de por solicitudes. Por ejemplo, una IP funciona durante 10 minutos, recopila 20-30 artículos, y luego cambia. Esto parece más natural que cambiar la IP en cada solicitud.

Proxies móviles para casos especiales

Los proxies móviles utilizan IP de operadores móviles (MTS, Beeline, Tele2). Tienen la máxima confianza, ya que millones de personas utilizan Internet móvil para leer noticias. Úselos para el scraping de versiones móviles de sitios de noticias (a menudo tienen protección simplificada), sitios con protección extremadamente estricta, páginas AMP de Google News.

Característica de los proxies móviles: la IP cambia automáticamente con frecuencia (los operadores móviles utilizan CGNAT), una IP puede ser utilizada por cientos de usuarios al mismo tiempo, lo que hace que el bloqueo sea inútil. Desventaja: alto precio, por lo que úselos de manera selectiva, solo para los objetivos más protegidos.

Eludir Cloudflare y otros sistemas anti-bots

Cloudflare es el principal enemigo de los scrapers de sitios de noticias. Alrededor del 40% de los grandes portales de noticias utilizan Cloudflare para protegerse contra bots. Las bibliotecas estándar (requests, urllib) no pasan la verificación, ya que Cloudflare analiza la huella TLS, la ejecución de JavaScript, el orden de los encabezados HTTP y los patrones de comportamiento.

Estrategias para eludir Cloudflare

1. Navegadores sin cabeza (Selenium, Playwright, Puppeteer)

Emulan un navegador real con ejecución de JavaScript. Cloudflare ve una huella TLS correcta de Chrome/Firefox y permite la solicitud. Desventajas: lento (2-5 segundos por página), requiere muchos recursos (RAM, CPU).

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

# Configuración del proxy para Selenium
chrome_options = Options()
chrome_options.add_argument('--proxy-server=http://username:password@proxy.example.com:8080')
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-blink-features=AutomationControlled')

driver = webdriver.Chrome(options=chrome_options)
driver.get('https://news-site.com/article')

# Esperamos a que se cargue JavaScript
driver.implicitly_wait(10)
html = driver.page_source
driver.quit()

2. Bibliotecas con huellas TLS (curl_cffi, tls-client)

Imitan la huella TLS de un navegador real sin ejecutar un navegador sin cabeza. Funcionan de 10 a 20 veces más rápido que Selenium, pero no ejecutan JavaScript. Son adecuadas para sitios con verificación básica de Cloudflare (sin desafío JS).

from curl_cffi import requests

proxies = {
    'http': 'http://username:password@proxy.example.com:8080',
    'https': 'http://username:password@proxy.example.com:8080'
}

response = requests.get(
    'https://news-site.com/article',
    proxies=proxies,
    impersonate='chrome110'  # Imitación de la huella TLS de Chrome 110
)

print(response.text)

3. Servicios de elusión de Cloudflare (scraperapi, scrapingbee)

API de pago que eluden automáticamente Cloudflare. Envías la URL y devuelven el HTML listo. Ventajas: no necesitas entender los detalles técnicos, rotación automática de proxies, manejo de CAPTCHA. Desventajas: caro con grandes volúmenes (desde $50/mes por 100K solicitudes).

Encabezados HTTP correctos

Incluso con proxies, es importante enviar encabezados correctos, de lo contrario, el sitio detectará al bot por un User-Agent no estándar o la ausencia de Accept-Language.

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    'Accept-Language': 'es-ES,es;q=0.9,en-US;q=0.8,en;q=0.7',
    'Accept-Encoding': 'gzip, deflate, br',
    'DNT': '1',
    'Connection': 'keep-alive',
    'Upgrade-Insecure-Requests': '1',
    'Sec-Fetch-Dest': 'document',
    'Sec-Fetch-Mode': 'navigate',
    'Sec-Fetch-Site': 'none',
    'Cache-Control': 'max-age=0'
}

Actualiza periódicamente el User-Agent: utiliza versiones actuales de navegadores. Puedes verificar tu huella en sitios como whoer.net o browserleaks.com.

Configuración de la rotación de IP y gestión de solicitudes

La rotación correcta de proxies es clave para un scraping estable sin bloqueos. Los sitios de noticias rastrean la frecuencia de solicitudes desde una IP, y exceder el límite resulta en un baneo temporal o permanente.

Tipos de rotación de proxies

Rotación por solicitudes — cada solicitud pasa por una nueva IP. Adecuada para scraping rápido de una gran cantidad de sitios diferentes, minimiza el riesgo de baneo por frecuencia de solicitudes. Desventajas: no es adecuada para sitios con sesiones (cookies, autorización), puede parecer sospechosa para algunas protecciones.

Rotación por tiempo (sesiones pegajosas) — una IP se utiliza durante un tiempo fijo (5-30 minutos) y luego cambia. Adecuada para el scraping de un solo portal de noticias con muchas páginas, mantiene cookies y sesiones, parece el comportamiento de un usuario real. Recomendado para la mayoría de las tareas de scraping de noticias.

Rotación por geolocalización — cambio de IP desde diferentes países/ciudades. Se utiliza para el scraping de contenido geodependiente (noticias regionales), eludiendo geobloqueos.

Frecuencia óptima de solicitudes

Incluso con rotación de proxies, no se deben hacer solicitudes demasiado frecuentes. Intervalos seguros para diferentes tipos de sitios:

  • Grandes portales de noticias (RBC, Kommersant, Vedomosti) — 2-5 segundos entre solicitudes desde una IP
  • Sitios medianos — 1-3 segundos
  • Blogs pequeños y publicaciones regionales — 0.5-1 segundo

Agrega retrasos aleatorios (randomization) para que el patrón de solicitudes parezca natural:

import time
import random

def fetch_article(url, proxies):
    response = requests.get(url, proxies=proxies, headers=headers)
    
    # Retraso aleatorio de 2 a 5 segundos
    delay = random.uniform(2, 5)
    time.sleep(delay)
    
    return response.text

Ejemplo de rotación de proxies desde un pool

Si tienes una lista de proxies, puedes implementar una rotación simple manualmente:

import itertools
import requests

# Pool de proxies
proxy_list = [
    'http://user:pass@proxy1.example.com:8080',
    'http://user:pass@proxy2.example.com:8080',
    'http://user:pass@proxy3.example.com:8080',
]

# Creamos un iterador infinito
proxy_pool = itertools.cycle(proxy_list)

def get_next_proxy():
    proxy = next(proxy_pool)
    return {'http': proxy, 'https': proxy}

# Uso
urls = ['https://news1.com/article', 'https://news2.com/article']

for url in urls:
    proxies = get_next_proxy()
    response = requests.get(url, proxies=proxies, headers=headers)
    print(f'Fetched {url} via {proxies["http"]}')

Ejemplos de código: Python + Scrapy + proxies

Scrapy es un marco profesional para el scraping que admite proxies, middleware, rotación y manejo de errores de forma nativa. Consideremos un ejemplo completo de un scraper de un sitio de noticias con rotación de proxies.

Instalación de dependencias

pip install scrapy scrapy-rotating-proxies

Configuración de Scrapy con proxies (settings.py)

# settings.py

# Activamos el middleware para la rotación de proxies
ROTATING_PROXY_LIST = [
    'http://user:pass@proxy1.example.com:8080',
    'http://user:pass@proxy2.example.com:8080',
    'http://user:pass@proxy3.example.com:8080',
]

DOWNLOADER_MIDDLEWARES = {
    'rotating_proxies.middlewares.RotatingProxyMiddleware': 610,
    'rotating_proxies.middlewares.BanDetectionMiddleware': 620,
}

# Configuraciones para eludir bloqueos
CONCURRENT_REQUESTS = 8  # No más de 8 solicitudes simultáneas
DOWNLOAD_DELAY = 2  # Retraso de 2 segundos entre solicitudes
RANDOMIZE_DOWNLOAD_DELAY = True  # Retraso aleatorio

# User-Agent
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'

# Reintentos en caso de errores
RETRY_TIMES = 3
RETRY_HTTP_CODES = [500, 502, 503, 504, 408, 429]

Spider para scraping de noticias

# news_spider.py

import scrapy
from datetime import datetime

class NewsSpider(scrapy.Spider):
    name = 'news_parser'
    
    # Lista de sitios de noticias para hacer scraping
    start_urls = [
        'https://example-news.com/latest',
    ]
    
    def parse(self, response):
        # Hacemos scraping de la lista de artículos en la página principal
        articles = response.css('article.news-item')
        
        for article in articles:
            article_url = article.css('a.title::attr(href)').get()
            
            if article_url:
                # Vamos a la página del artículo
                yield response.follow(article_url, callback=self.parse_article)
    
    def parse_article(self, response):
        # Extraemos los datos del artículo
        yield {
            'url': response.url,
            'title': response.css('h1.article-title::text').get(),
            'date': response.css('time.published::attr(datetime)').get(),
            'author': response.css('span.author::text').get(),
            'text': ' '.join(response.css('div.article-body p::text').getall()),
            'tags': response.css('a.tag::text').getall(),
            'scraped_at': datetime.now().isoformat(),
        }

Ejecutar el scraper

# Guardar en JSON
scrapy crawl news_parser -o news_data.json

# Guardar en CSV
scrapy crawl news_parser -o news_data.csv

Scraper simple con requests + BeautifulSoup

Si no se necesita lógica compleja, se puede utilizar la combinación de requests + BeautifulSoup:

import requests
from bs4 import BeautifulSoup
import time
import random

# Configuración del proxy
proxies = {
    'http': 'http://user:pass@proxy.example.com:8080',
    'https': 'http://user:pass@proxy.example.com:8080'
}

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}

def parse_news_article(url):
    try:
        response = requests.get(url, proxies=proxies, headers=headers, timeout=10)
        response.raise_for_status()
        
        soup = BeautifulSoup(response.text, 'html.parser')
        
        # Extracción de datos (selectores dependen del sitio)
        title = soup.find('h1', class_='article-title').text.strip()
        date = soup.find('time', class_='published')['datetime']
        text = ' '.join([p.text for p in soup.find_all('p', class_='article-text')])
        
        return {
            'url': url,
            'title': title,
            'date': date,
            'text': text
        }
    
    except Exception as e:
        print(f'Error al hacer scraping de {url}: {e}')
        return None

# Haciendo scraping de la lista de artículos
urls = [
    'https://news-site.com/article-1',
    'https://news-site.com/article-2',
]

for url in urls:
    article_data = parse_news_article(url)
    if article_data:
        print(article_data)
    
    # Retraso entre solicitudes
    time.sleep(random.uniform(2, 4))

Errores comunes al hacer scraping de noticias

Incluso con la configuración correcta de proxies, los scrapers a menudo reciben bloqueos debido a errores técnicos. Analicemos los problemas más comunes y sus soluciones.

Error 1: Frecuencia de solicitudes demasiado alta

Síntomas: HTTP 429 (Too Many Requests), bloqueos temporales de IP, CAPTCHA. Causa: el scraper hace 10-50 solicitudes por segundo desde una IP. Solución: agregue retrasos (time.sleep()), use DOWNLOAD_DELAY en Scrapy, limite CONCURRENT_REQUESTS.

Error 2: Uso de un solo proxy para todas las solicitudes

Síntomas: el proxy se bloquea rápidamente, incluso con retrasos. Causa: una IP hace cientos de solicitudes a un solo sitio. Solución: use un pool de proxies con rotación, para sitios grandes — al menos 10-20 proxies, para sesiones pegajosas cambie la IP cada 10-15 minutos.

Error 3: Ignorar cookies

Muchos sitios de noticias establecen cookies en la primera visita y verifican su presencia en solicitudes posteriores. La ausencia de cookies es un signo de un bot. Solución: use requests.Session() para guardar cookies automáticamente, en Scrapy active COOKIES_ENABLED = True.

import requests

session = requests.Session()
session.proxies = {'http': 'http://proxy.com:8080', 'https': 'http://proxy.com:8080'}

# Primera solicitud — obtenemos cookies
response1 = session.get('https://news-site.com')

# Solicitudes posteriores envían automáticamente las cookies
response2 = session.get('https://news-site.com/article')

Error 4: Manejo incorrecto de redirecciones

Los sitios de noticias a menudo utilizan redirecciones (301, 302) para versiones móviles, subdominios regionales, páginas AMP. Si el scraper no sigue las redirecciones, obtiene una página vacía. Solución: en requests está habilitado por defecto (allow_redirects=True), verifique la URL final a través de response.url.

Error 5: Scraping de contenido dinámico sin JavaScript

Muchos sitios de noticias modernos cargan contenido a través de JavaScript (React, Vue). La biblioteca requests obtiene un esqueleto HTML vacío sin artículos. Solución: use Selenium/Playwright para ejecutar JavaScript, verifique la red en DevTools — es posible que los datos se carguen a través de una API (se puede hacer scraping directamente del JSON).

Escalado: scraping de cientos de fuentes

Cuando necesitas hacer scraping no de un solo sitio de noticias, sino de cientos de fuentes al mismo tiempo (agregadores de noticias, monitoreo de medios), se requiere una arquitectura escalable.

Scraping distribuido con Scrapy Cloud

Scrapy Cloud (de los creadores de Scrapy) permite ejecutar scrapers en la nube con escalado automático. Ventajas: no se necesitan servidores propios, rotación automática de proxies, monitoreo y registros. Costo: desde $9/mes por el plan básico.

Colas de tareas (Celery + Redis)

Para el despliegue autónomo, use Celery — un sistema de tareas distribuidas. Arquitectura: Redis almacena la cola de URL para el scraping, varios trabajadores (servidores) toman tareas de la cola y hacen scraping en paralelo, cada trabajador utiliza su propio pool de proxies.

# tasks.py

from celery import Celery
import requests

app = Celery('news_parser', broker='redis://localhost:6379/0')

@app.task
def parse_article(url, proxy):
    proxies = {'http': proxy, 'https': proxy}
    response = requests.get(url, proxies=proxies, timeout=10)
    # Scraping y guardado de datos
    return response.text

# Agregar tareas a la cola
urls = ['https://news1.com/article', 'https://news2.com/article']
proxies = ['http://proxy1.com:8080', 'http://proxy2.com:8080']

for url in urls:
    proxy = random.choice(proxies)
    parse_article.delay(url, proxy)  # Ejecución asíncrona

Monitoreo y manejo de errores

En el scraping a gran escala, el monitoreo es críticamente importante: cuántas URL se han procesado, cuántos errores, qué proxies han sido bloqueados. Use Sentry para rastrear errores de Python, Grafana + Prometheus para métricas (solicitudes por segundo, tiempo de respuesta), registro en ELK Stack (Elasticsearch, Logstash, Kibana).

Consejo: Crea un sistema de verificación automática de proxies. Cada 5-10 minutos, envía una solicitud de prueba a través de cada proxy a whoer.net o httpbin.org. Si el proxy no responde o está bloqueado, exclúyelo del pool y agrega uno nuevo.

Optimización de costos en proxies

Al hacer scraping de cientos de fuentes, los costos en proxies pueden alcanzar miles de dólares al mes. Estrategias de optimización: use proxies de centros de datos para sitios simples (RSS, API), proxies residenciales solo para protegidos, almacene datos en caché — no haga scraping del mismo artículo dos veces, haga scraping en horas no pico (por la noche la carga en los sitios es menor, menor riesgo de baneo).

Ejemplo: para hacer scraping de 500 sitios de noticias, se pueden usar el 80% de proxies de centros de datos (para RSS y sitios simples) y el 20% de proxies residenciales (para los 100 portales protegidos principales). Esto reducirá los costos de 3 a 5 veces.

Conclusión

El scraping de sitios de noticias es una tarea técnicamente compleja que requiere la elección correcta de proxies, configuración de rotación y elusión de sistemas anti-bots. Conclusiones clave del artículo: para portales de noticias protegidos (Cloudflare, limitación de tasa estricta) use proxies residenciales con sesiones pegajosas, para el scraping masivo de cientos de fuentes son adecuados los proxies de centros de datos con rotación rápida, asegúrese de agregar retrasos entre solicitudes (2-5 segundos) y encabezados HTTP correctos, para eludir Cloudflare use navegadores sin cabeza (Selenium, Playwright) o bibliotecas con huellas TLS.

Al escalar, utilice sistemas distribuidos (Celery, Scrapy Cloud) y monitoreo de errores. Recuerde que el scraping debe ser ético: respete el robots.txt, no genere una carga excesiva en los servidores y respete los derechos de autor sobre el contenido.

Si planea hacer scraping de grandes portales de noticias con protección de Cloudflare, se recomienda utilizar proxies residenciales — ofrecen un alto nivel de confianza y un riesgo mínimo de bloqueos. Para tareas donde la velocidad y el volumen de datos son importantes (scraping de RSS, endpoints de API), son adecuados los proxies de centros de datos.

```