Un servidor proxy HTTP actúa como intermediario entre su script de web scraping y el sitio web de destino. En lugar de que su araña Scrapy se conecte directamente al destino, se conecta al servidor proxy, que luego reenvía la solicitud al destino. Esto le permite enmascarar su dirección IP, evitar restricciones geográficas y evitar ser bloqueado por sitios web que emplean medidas anti-scraping. Este artículo proporciona una guía práctica para configurar y rotar proxies utilizando el middleware de Scrapy.
Configuración de Proxies en Scrapy con Middleware
El sistema de middleware de Scrapy proporciona una forma flexible de manejar solicitudes y respuestas. Podemos aprovechar este sistema para implementar soporte de proxy. El proceso implica crear un middleware personalizado que intercepte las solicitudes y les asigne un servidor proxy.
Creación de un Middleware de Proxy Personalizado
Primero, cree un nuevo archivo Python (por ejemplo, proxy_middleware.py) en su proyecto Scrapy. Este archivo contendrá el código para su middleware de proxy personalizado.
import random
class ProxyMiddleware:
def __init__(self, proxies):
self.proxies = proxies
@classmethod
def from_crawler(cls, crawler):
return cls(crawler.settings.getlist('PROXIES'))
def process_request(self, request, spider):
proxy = random.choice(self.proxies)
request.meta['proxy'] = proxy
print(f"Using proxy: {proxy}")
def process_response(self, request, response, spider):
# Optional: Handle response codes to retry with a different proxy
if response.status in [403, 429]:
print(f"Proxy {request.meta['proxy']} blocked, retrying with another proxy.")
return self._retry_request(request, spider)
return response
def _retry_request(self, request, spider):
proxy = random.choice(self.proxies)
request.meta['proxy'] = proxy
new_request = request.copy()
return new_request
Explicación:
__init__(self, proxies): El constructor toma una lista de proxies como entrada.from_crawler(cls, crawler): Este método de clase es utilizado por Scrapy para crear una instancia del middleware. Recupera la lista de proxies de la configuración de Scrapy.process_request(self, request, spider): Este método se llama antes de que Scrapy envíe una solicitud. Selecciona aleatoriamente un proxy de la lista y lo asigna al atributometa['proxy']de la solicitud. Esto le dice a Scrapy que use el proxy especificado para esta solicitud.process_response(self, request, response, spider): Este método le permite manejar la respuesta recibida del servidor. Aquí, verifica códigos de estado como 403 (Prohibido) o 429 (Demasiadas solicitudes), que a menudo indican que el proxy está bloqueado. Si se encuentra un código de bloqueo, reintenta la solicitud con un proxy diferente._retry_request(self, request, spider): Este método crea una nueva solicitud con un proxy diferente asignado.
Configuración de los Ajustes de Scrapy
A continuación, debe configurar sus ajustes de Scrapy para habilitar el middleware y proporcionar una lista de proxies. Abra su archivo settings.py y agregue lo siguiente:
# settings.py
# Enable the ProxyMiddleware
DOWNLOADER_MIDDLEWARES = {
'your_project_name.proxy_middleware.ProxyMiddleware': 350, # Adjust priority as needed
'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': None, # Disable the default HttpProxyMiddleware
}
# List of proxies
PROXIES = [
'http://user1:pass1@proxy1.example.com:8080',
'http://user2:pass2@proxy2.example.com:8080',
'http://user3:pass3@proxy3.example.com:8080',
'https://user4:pass4@proxy4.example.com:8080',
]
# Retry many times since proxies often fail
RETRY_TIMES = 10
# Retry on most error codes since proxies fail a lot
RETRY_HTTP_CODES = [500, 502, 503, 504, 400, 408]
# Disable default user agent middleware and use a custom one
DOWNLOADER_MIDDLEWARES.update({
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
'scrapy_user_agents.middlewares.RandomUserAgentMiddleware': 400,
})
# Obey robots.txt rules
ROBOTSTXT_OBEY = False
Explicación:
DOWNLOADER_MIDDLEWARES: Este diccionario habilita y configura los middlewares de descarga. La clave es la ruta a su clase de middleware, y el valor es la prioridad del middleware. Los números más bajos indican una prioridad más alta (el middleware se ejecuta antes). ElHttpProxyMiddlewarepredeterminado está deshabilitado para evitar conflictos con el middleware personalizado.PROXIES: Esta lista contiene los servidores proxy que desea utilizar. El formato esprotocolo://usuario:contraseña@host:puerto. Se pueden usar proxies HTTP y HTTPS. Si no se requieren nombre de usuario y contraseña, el formato es simplementeprotocolo://host:puerto.RETRY_TIMESyRETRY_HTTP_CODES: Estos ajustes configuran el middleware de reintento de Scrapy. Dado que los proxies pueden ser poco confiables, es una buena práctica aumentar el número de reintentos e incluir códigos de error HTTP comunes que podrían indicar un problema de proxy.DOWNLOADER_MIDDLEWARES.update(...): Esta sección deshabilita el middleware de User Agent predeterminado y habilitascrapy_user_agentspara rotar los User Agents. Esto ayuda a evitar que su scraper sea fácilmente identificado. Deberá instalarscrapy_user_agentsusandopip install scrapy-user-agents.
Ejecución de la Araña
Ahora puede ejecutar su araña Scrapy como de costumbre. El middleware asignará automáticamente un proxy a cada solicitud.
scrapy crawl your_spider_name
Estrategias de Rotación de Proxies
La rotación de proxies es crucial para evitar que su scraper sea bloqueado. Aquí hay algunas estrategias comunes:
- Selección Aleatoria: Como se implementa en el ejemplo anterior, seleccionar aleatoriamente un proxy de la lista para cada solicitud. Este es el enfoque más simple, pero puede no ser el más efectivo.
- Rotación Secuencial: Recorrer la lista de proxies de manera secuencial. Esto puede ser útil si desea asegurarse de que cada proxy se use un número igual de veces.
- Rotación Inteligente: Implementar lógica para rastrear el rendimiento de cada proxy y priorizar los proxies que funcionan bien. Esto puede implicar monitorear los tiempos de respuesta, las tasas de error y otras métricas.
- Uso de una API de Proxy: Utilizar una API de servicio de proxy que maneje automáticamente la rotación y administración de proxies. Estos servicios a menudo proporcionan características como la geolocalización y la gestión de la reputación de la dirección IP.
Rotación Secuencial de Proxies
Aquí hay un ejemplo de cómo implementar la rotación secuencial de proxies en su middleware:
import itertools
class SequentialProxyMiddleware:
def __init__(self, proxies):
self.proxies = itertools.cycle(proxies) # Use cycle to rotate proxies
@classmethod
def from_crawler(cls, crawler):
return cls(crawler.settings.getlist('PROXIES'))
def process_request(self, request, spider):
proxy = next(self.proxies) # Get the next proxy from the cycle
request.meta['proxy'] = proxy
print(f"Using proxy: {proxy}")
def process_response(self, request, response, spider):
if response.status in [403, 429]:
print(f"Proxy {request.meta['proxy']} blocked, rotating to the next proxy.")
return self._retry_request(request, spider)
return response
def _retry_request(self, request, spider):
proxy = next(self.proxies)
request.meta['proxy'] = proxy
new_request = request.copy()
return new_request
Cambio Clave:
itertools.cycle(proxies): Esto crea un iterador que recorre indefinidamente la lista de proxies. La funciónnext()se utiliza para obtener el siguiente proxy en la secuencia.
Recuerde actualizar su configuración DOWNLOADER_MIDDLEWARES para que apunte a SequentialProxyMiddleware.
Integración de API de Proxy
La integración con una API de proxy generalmente implica realizar solicitudes a la API para recuperar un proxy y manejar la autenticación y las respuestas de error de la API. Los detalles específicos dependerán de la API que elija. Muchos proveedores de proxy ofrecen SDK de Python para simplificar este proceso.
Tipos de Proxy
Aquí hay una comparación de diferentes tipos de proxy:
| Característica | Proxy HTTP | Proxy HTTPS | Proxy SOCKS |
|---|---|---|---|
| Protocolo | HTTP | HTTPS | SOCKS (varias versiones) |
| Cifrado | Sin cifrado entre cliente y proxy | Cifrado entre cliente y proxy | El cifrado depende de la versión de SOCKS |
| Casos de Uso | Navegación web, scraping de sitios HTTP | Navegación web, scraping de sitios HTTPS | Propósito general, soporta varios protocolos |
| Anonimato | Puede ser menos anónimo | Puede ser más anónimo | Puede ser altamente anónimo |
| Configuración | Típicamente configurado en navegadores web | Típicamente configurado en navegadores web | Requiere cliente SOCKS o soporte de biblioteca |
| URL de Ejemplo | http://host:port |
https://host:port |
socks5://host:port o socks4://host:port |
| Autenticación | Autenticación básica (usuario/contraseña) | Autenticación básica (usuario/contraseña) | Autenticación de usuario/contraseña soportada |
Problemas Comunes y Solución de Problemas
- Proxies que no funcionan: Verifique que el servidor proxy esté en línea y accesible. Revise las credenciales de autenticación del proxy (nombre de usuario y contraseña). Asegúrese de que el formato del proxy en
settings.pysea correcto. - Proxies bloqueados: Implemente la rotación de proxies y considere usar un servicio de proxy con un gran grupo de direcciones IP. Monitoree los códigos de respuesta (403, 429) y reintente automáticamente las solicitudes con diferentes proxies.
- Rendimiento lento: Elija proxies que estén geográficamente cerca del servidor de destino. Pruebe diferentes proveedores de proxy para encontrar uno con un rendimiento confiable.
- Errores HTTPS: Asegúrese de que su proxy admita conexiones HTTPS. Algunos proxies HTTP solo admiten tráfico HTTP.
- Fugas de DNS: Use un proxy SOCKS o configure su sistema para usar el servidor DNS del proxy para evitar fugas de DNS.
Conclusión
Configurar y rotar proxies en Scrapy es esencial para construir scrapers web robustos y confiables. Al usar middleware personalizado, implementar estrategias de rotación efectivas y comprender los diferentes tipos de proxies, puede reducir significativamente el riesgo de ser bloqueado y mejorar el rendimiento de sus proyectos de scraping. Recuerde monitorear continuamente sus proxies y adaptar su estrategia según sea necesario para mantener una eficiencia de scraping óptima.
Recuerde probar sus proxies regularmente y monitorear su rendimiento para asegurarse de que su scraper siga funcionando de manera efectiva. Considere usar un servicio de administración de proxies para funciones más avanzadas y una gestión más sencilla.