Por qué Scrapy necesita un proxy
Los proxies para Scrapy permiten que la herramienta se conecte a través de una dirección IP diferente, en lugar de utilizar siempre la IP del equipo en el que se ejecuta. Esto resulta útil para tareas basadas en la ubicación, pruebas, supervisión y otras tareas en las que la fuente de la conexión es importante.
Scrapy sigue encargándose de la tarea principal. El proxy se encarga de gestionar el origen de la conexión.
Qué ocurre sin él: bloqueos de IP, límites de frecuencia y restricciones geográficas
Sin un proxy, los sitios web siguen viendo la misma dirección IP. A medida que aumenta la actividad, esa IP puede alcanzar un límite de frecuencia o acabar bloqueada.
La ubicación también puede ser importante. Es posible que una página abierta desde Alemania no muestre el mismo contenido que otra abierta desde EE. UU.
Un proxy para Scrapy permite conectarse desde diferentes direcciones IP y ubicaciones cuando sea necesario.
Qué tipo de proxy utilizar con Scrapy
El tipo de proxy adecuado depende de la tarea.
| Tipo de proxy | Extracción de datos | Gestión de cuentas | Pruebas | Supervisión |
|---|
| Residencial | Ideal cuando la ubicación y la fuente de la IP son importantes | Útil cuando las cuentas necesitan IP residenciales | Ideal para pruebas basadas en la ubicación | Útil para comprobar contenidos desde diferentes ubicaciones |
| ISP | Ideal cuando se necesita una IP estable | Útil para sesiones más largas con una misma IP | Ideal para pruebas con una IP constante | Útil para comprobaciones continuas desde la misma IP |
| Centro de datos | Ideal para velocidad y grandes volúmenes de solicitudes | Mejor cuando no se requieren IP residenciales | Ideal para pruebas generales | Ideal para comprobaciones automatizadas frecuentes |
Los proxies residenciales son útiles cuando la dirección IP de origen y la ubicación son importantes. Los proxies de ISP funcionan bien cuando es necesario que la misma dirección IP permanezca activa durante más tiempo. Los proxies de centro de datos son la opción más adecuada cuando lo principal es la velocidad y la escala.
La mejor opción también depende de si la tarea requiere segmentación geográfica, una conexión estable o acceso a un conjunto más amplio de direcciones IP.
Cómo configurar un proxy en Scrapy
La configuración del proxy en Scrapy requiere el host Geonode, el puerto, el nombre de usuario y la contraseña. Guarda las credenciales en variables de entorno y, a continuación, cárgalas al configurar el proxy en el código.
¿Utilizas Geonode? Obtén el nombre de usuario y la contraseña en Credenciales de acceso y el servidor, el puerto y el protocolo en Información del servidor proxy.
Ruta de configuración o código
Para nuestra prueba, hemos añadido un middleware de descarga:
DOWNLOADER_MIDDLEWARES = {
"geonode_scrapy.middlewares.GeonodeProxyMiddleware": 350,
"scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware": 400,
}
El middleware pasa la URL del proxy a través de request.meta["proxy"]
, que luego utiliza el HttpProxyMiddleware
de Scrapy:
request.meta["proxy"] = proxy_url
También puedes pasar el proxy directamente a una solicitud concreta:
yield scrapy.Request(
url,
meta={"proxy": proxy_url},
)
Mantén el nombre de usuario y la contraseña reales en variables de entorno en lugar de incluirlos directamente en el archivo Python. Esta configuración devolvió correctamente un código de estado HTTP 200 a través del proxy durante nuestra prueba.
El formato de autenticación «host:port:user:pass»
Geonode
te proporciona cuatro valores:
proxy.geonode.io:PORT:USERNAME:PASSWORD
Scrapy necesita los mismos datos que una URL de proxy:
http://USERNAME:PASSWORD@proxy.geonode.io:PORT
Guarda las credenciales o el valor completo del proxy en una variable de entorno:
GEONODE_PROXY_URL=http://USERNAME:PASSWORD@proxy.geonode.io:PORT
A continuación, cárgalo en Python:
import os
proxy_url = os.environ["GEONODE_PROXY_URL"]
Para nuestra prueba HTTP, el formato resultante fue:
http://USERNAME:PASSWORD@proxy.geonode.io:9000
Para comprobar la autenticación, también ejecutamos la solicitud con credenciales incorrectas. Scrapy recibió un código de estado HTTP 407 con la respuesta:
Authentication error. Please check your authentication settings.
Scrapy mostró la respuesta a través de HttpErrorMiddleware
como HttpError('Ignoring non-200 response')
.
Rotación frente a sesión fija en Scrapy
Si las solicitudes no necesitan mantener la misma IP, utiliza la rotación.
Para nuestra prueba, pasamos a Scrapy el proxy rotativo Geonode
:
proxy_url = "http://USERNAME:PASSWORD@proxy.geonode.io:9000"
yield scrapy.Request(
url,
meta={"proxy": proxy_url},
)
Realizamos cinco solicitudes consecutivas:
Request 1: 101.98.231.191
Request 2: 101.98.231.191
Request 3: 101.98.231.191
Request 4: 122.164.83.189
Request 5: 122.164.83.189
Unique IPs: 2
Rotation: Yes
La prueba confirma que se produjo la rotación, pero la IP no cambió en todas las solicitudes.
Si las solicitudes relacionadas deben mantenerse en la misma dirección IP, utiliza en su lugar una sesión fija:
proxy_url = (
"http://USERNAME-session-blogtest01-lifetime-10:"
"PASSWORD@proxy.geonode.io:10000"
)
Realizamos tres solicitudes utilizando la misma sesión:
Request 1: 177.73.202.78
Request 2: 177.73.202.78
Request 3: 177.73.202.78
Same IP: Yes
En nuestra prueba, las tres solicitudes utilizaron la misma dirección IP.
Consulta las guías de Geonode
sobre proxies rotativos y sesiones fijas para conocer la configuración disponible.
Errores comunes con los proxies en Scrapy y cómo solucionarlos
Si el proxy no funciona, empieza por comprobar los datos de conexión. Comprueba el nombre de usuario y la contraseña, y después el servidor, el puerto y el protocolo. El error que muestra Scrapy suele ayudar a identificar el problema.
407 Se requiere autenticación del proxy
Un código 407 suele indicar un problema de autenticación.
Cuando probamos Scrapy con credenciales incorrectas, el proxy devolvió: «
HTTP status: 407
Authentication error. Please check your authentication settings.
». Comprueba primero el nombre de usuario y la contraseña. Si son correctos, asegúrate de que Scrapy reciba la URL completa del proxy con el esquema, las credenciales, el host y el puerto.
ERR_TUNNEL_CONNECTION_FAILED / conexión rechazada
Un error de conexión suele significar que Scrapy no ha podido conectarse al proxy.
Comprueba primero el host y el puerto. A continuación, asegúrate de que el protocolo coincide con el del servidor proxy que se está utilizando.
Scrapy no devuelve necesariamente el código de estado ERR_TUNNEL_CONNECTION_FAILED, propio de los navegadores. En nuestra prueba de conexión fallida, Scrapy volvió a intentar la solicitud y, finalmente, devolvió DownloadFailedError, que contenía un error de Twisted ConnectionLost.
Tiempos de espera y respuestas vacías
Un tiempo de espera significa que la solicitud no recibió respuesta en el plazo configurado.
En primer lugar, comprueba si la URL de destino funciona y si el proxy puede conectarse. Si ambos funcionan, comprueba la configuración del tiempo de espera en Scrapy.
Para nuestra prueba de fallo de conexión, utilizamos un puerto de proxy no válido con DOWNLOAD_TIMEOUT=5
. Tras los reintentos, Scrapy devolvió:
DownloadFailedError(
ConnectionLost:
Connection to the other side was lost in a non-clean fashion.
)
. Por lo tanto, una conexión de proxy fallida puede aparecer como un error de conexión en lugar de como un simple mensaje de tiempo de espera agotado.
Un error específico de Scrapy
Un error común específico de Scrapy es pasar un valor incompleto a request.meta["proxy"]
.
En nuestra prueba, utilizamos:
proxy.geonode.io:9000
sin el esquema ni las credenciales. La solicitud devolvió un código HTTP 407.
La solución consistió en pasar la URL completa del proxy:
http://USERNAME:PASSWORD@proxy.geonode.io:9000
o dejar que el middleware del descargador la generara a partir de las variables de entorno.
Scrapy + Geonode: qué te ofrece
Scrapy se encarga de las solicitudes o conexiones en la aplicación. Geonode se encarga de la conexión al proxy.
Puedes elegir entre proxies residenciales, de ISP o de centro de datos en función del trabajo, y luego utilizar la rotación, las sesiones persistentes y la segmentación geográfica cuando sea necesario. De este modo, la configuración del proxy se mantiene separada del resto del código de la aplicación.
Los planes varían según el tipo de proxy, y algunas opciones se cobran por GB.
¿Admite Scrapy los proxies de tipo «SOCKS5»?
La configuración «SOCKS5» requiere una configuración adicional en la versión de Scrapy que hemos probado.
Al intentar pasar un proxy de tipo «socks5://» a través del gestor HTTP predeterminado de Scrapy, se produjo el siguiente error:
UnsupportedURLSchemeError("Unsupported scheme: b'socks5'")
A continuación, instalamos httpx2[socks] y configuramos el controlador experimental de Scrapy HttpxDownloadHandler. Con el proxy rotativo SOCKS5 en el puerto 11000, la solicitud se completó con éxito con un código de estado HTTP 200 y devolvió una dirección IP del proxy. El controlador es experimental, por lo que resulta más adecuado para realizar pruebas que como recomendación para entornos de producción.
¿Puedo rotar las direcciones IP por solicitud en Scrapy?
Sí, Scrapy puede enviar solicitudes a través de un proxy rotativo, pero no se garantiza que cada solicitud utilice una dirección IP diferente.
Nuestra prueba de cinco solicitudes arrojó dos direcciones IP únicas. Las tres primeras solicitudes compartieron una misma dirección IP, mientras que las dos últimas compartieron otra, lo que confirma que se produjo la rotación durante la prueba.
¿Hay una prueba gratuita?
Sí. Geonode ofrece una prueba gratuita, por lo que se puede probar el proxy con Scrapy antes de pasar a un plan de pago. Consulta la prueba gratuita actual y los planes.
¿Dónde debo configurar el proxy en Scrapy?
Para una solicitud concreta, pasa el proxy a través de request.meta["proxy"].
Si se necesita la misma configuración de proxy para varias solicitudes, el middleware «downloader» centraliza la lógica del proxy en un único lugar. En nuestra prueba, el middleware personalizado estableció request.meta["proxy"] antes de que el HttpProxyMiddleware integrado en Scrapy procesara la solicitud.
¿Por qué mi araña de Scrapy se ejecuta pero no envía ninguna solicitud?
Comprueba cómo crea la araña sus primeras solicitudes.
En nuestra prueba con Scrapy 2.19, al definir únicamente el método heredado start_requests()
, la araña se iniciaba y se cerraba sin realizar ninguna solicitud. El problema se solucionó utilizando el método asíncrono start()
:
async def start(self):
yield scrapy.Request(...)
Este fue el comportamiento registrado durante nuestra configuración de prueba.