[Python-es] Descargar varios ficheros a la vez

lasizoillo lasizoillo en gmail.com
Mie Jul 14 18:20:27 CEST 2010


El día 14 de julio de 2010 17:32, Kiko <kikocorreoso en gmail.com> escribió:
> Hola a todos.
>
> Estoy descargando ficheros de un WMS [1] mediante urllib.urlretrieve.
>
> Hasta ahora lo que hago es generar la url y mediante urllib.urlretrieve
> lanzo la petición al servidor y me genera una imagen (jpeg) que es la que me
> descargo.
>
> El problema es que tengo que descargar un volumen relativamente grande y de
> la forma en que lo tengo hecho va muy lento.
>
> La pregunta es: ¿Hay alguna forma de lanzar varias peticiones a la vez desde
> el mismo script o de mejorar el tiempo de alguna otra forma?
>

Si. Tienes varias formas:

Hilos
====
http://docs.python.org/library/threading.html

Procesos
=======
http://docs.python.org/library/multiprocessing.html#module-multiprocessing

Se puede usar también fork, pero es dependiente de la plataforma:
http://docs.python.org/library/os.html#os.fork

Programación asíncrona
==================
Se puede hacer uso de sockets no bloqueantes, pero dudo que quieres
reescribir el urlretrieve. Usar el modulo asyncore puede ser un punto
de partida más sencillo:
http://docs.python.org/library/asyncore.html#asyncore-example-basic-http-client

O con librerias externas:
 * Twisted (no voy a entrar en detalles porque tiene curva lenta de aprendizaje)
 * eventlet: http://eventlet.net/doc/
 * gevent: http://bitbucket.org/denis/gevent/src/tip/examples/concurrent_download.py

Colas de trabajo o mensajes
=====================
Esto ya excede el nivel de cosa que se suele escribir en un script.
Asi solo cito opciones como gearman, celery, ... como herramienta si
haces algo un poco más gordo.

Crawler
======
Scrapy es una forma sencilla de usar twisted sin darte cuenta de que
usas twisted. Si lo que quieres es un crawler, esto puede ayudar. No
se si excederá tus requerimientos o si va a casar a la perfección con
lo que necesitas:
http://scrapy.org/



Como ves, opciones hay muchas (me dejó un montón en el tintero). Entre
los enlaces tienes varios ejemplos para hacer lo que pides de una
manera inmediata. Si tienes algún problema con la tecnología que
elijas, no dudes en comentarlo en la lista.

Un saludo:

Javi


Más información sobre la lista de distribución Python-es