2010-08-20 20 views
8

Duplicar posible:
How can I speed up fetching pages with urllib2 in python?Recuperar varias direcciones URL a la vez/en paralelo

Tengo un script en Python que descargar la página web, analizarlo y devolver algún valor a partir de la página. Necesito raspar algunas de esas páginas para obtener el resultado final. Cada página de recuperación lleva mucho tiempo (5-10s) y preferiría hacer solicitudes en paralelo para disminuir el tiempo de espera.
La pregunta es: ¿qué mecanismo lo hará de forma rápida, correcta y con un gasto mínimo de CPU/memoria? Twisted, asyncore, threading, ¿algo más? ¿Podría proporcionar algún enlace con ejemplos?
Gracias

UPD: Hay algunas soluciones para el problema, estoy buscando el compromiso entre la velocidad y los recursos. Si pudieras contar algunos detalles de la experiencia (cómo se carga rápidamente desde tu punto de vista, etc.) sería muy útil.

+0

Ver mi respuesta aquí http://stackoverflow.com/questions/3491455 –

Respuesta

13

multiprocesamiento. La piscina puede ser un buen negocio, hay some useful examples. Por ejemplo, si usted tiene una lista de direcciones URL, puede asignar la recuperación de contenidos de forma simultánea:

def process_url(url): 
    # Do what you want 
    return what_you_want 

pool = multiprocessing.Pool(processes=4) # how much parallelism? 
pool.map(process_url, list_of_urls) 
+0

Solo como advertencia a alguien más, no estoy seguro por qué, pero a los pocos segundos de ejecutar el código, lleva mi sistema a un parada completa. – Peter

+0

Sí, sobre eso. Decir a cualquier sistema que haga 12 millones de cosas al mismo tiempo podría inducir un ligero retraso en el procesamiento de otras tareas. LOL. –

3

multiprocessing

generar un montón de procesos, uno para cada URL que desea descargar. Use un Queue para mantener una lista de URL y haga que cada uno de los procesos lea una URL fuera de la cola, trátela y devuelva un valor.

1

utilizar un asíncrona, es decir, orientada a eventos en lugar de bloquear, marco para esta creación de redes. Una opción es use twisted. Otra opción que se ha convertido recientemente disponible es usar monóculo. Este mini-marco oculta las complejidades de las operaciones sin bloqueo. Ver this example. Puede usar torcido o tornado detrás de escena, pero realmente no se nota mucho.

Cuestiones relacionadas