¿Cómo puedo mejorar la velocidad de descarga de scrapy?

Estoy usando scrapy para descargar páginas de muchos dominios diferentes en paralelo. Tengo cientos de miles de páginas para descargar, por lo que el rendimiento es importante.

Desafortunadamente, como he perfilado la velocidad de scrapy, solo recibo un par de páginas por segundo. Realmente, alrededor de 2 páginas por segundo en promedio. Anteriormente, he escrito mis propias arañas multiproceso para hacer cientos de páginas por segundo. Pensé que, con seguridad, el uso de retorcido de tartas, etc. sería capaz de hacer magia similar.

¿Cómo apuro la chatarra? Realmente me gusta el marco, pero este problema de rendimiento podría ser un factor decisivo para mí.

Aquí está la parte relevante del archivo settings.py. ¿Hay algún ajuste importante que me haya perdido?

LOG_ENABLED = False CONCURRENT_REQUESTS = 100 CONCURRENT_REQUESTS_PER_IP = 8 

Algunos parámetros:

  • Usando la versión scrapy 0.14
  • El proyecto se implementa en una instancia grande de EC2, por lo que debería haber mucha memoria, CPU y ancho de banda para jugar.
  • Estoy progtwigndo rastreos utilizando el protocolo JSON, manteniendo el rastreador rellenado con unas docenas de rastreos simultáneos en un momento dado.
  • Como dije al principio, estoy descargando páginas de muchos sitios, por lo que el rendimiento del servidor remoto y CONCURRENT_REQUESTS_PER_IP no deberían ser una preocupación.
  • Por el momento, estoy haciendo muy poco post-procesamiento. No xpath; no regex Solo estoy guardando la url y algunas estadísticas básicas para cada página. (Esto cambiará más adelante, una vez que haya resuelto los problemas de rendimiento básicos).

Tuve este problema en el pasado … Y gran parte de él lo resolví con un viejo truco ‘sucio’.

Hacer un DNS de caché local .

La mayoría de las veces, cuando tienes este alto uso de la CPU para acceder a sitios remotos simultáneos, es porque scrapy está tratando de resolver las URL.

Y recuerde cambiar la configuración de su DNS en el host (/etc/resolv.conf) a su servidor DNS de almacenamiento en caché LOCAL.

Los primeros serán más lentos, pero tan pronto como empiece a almacenar en caché y resulte más eficiente, verán enormes mejoras.

Espero que esto te ayude en tu problema!