2010-05-05 11 views
11

Estoy tratando de recuperar un archivo de 500mb usando Python, y tengo un script que usa urllib.urlretrieve(). Parece que hay un problema de red entre el sitio de descarga y yo, ya que esta llamada cuelga constantemente y no se completa. Sin embargo, usar wget para recuperar el archivo tiende a funcionar sin problemas. ¿Cuál es la diferencia entre urlretrieve() y wget que podría causar esta diferencia?Diferencia entre Python urllib.urlretrieve() y wget

Respuesta

16

La respuesta es bastante simple. Python's urllib y urllib2 no son tan maduros y robustos como podrían ser. Incluso mejor que wget en mi experiencia es cURL. He escrito un código que descarga gigabytes de archivos a través de HTTP con tamaños de archivo que van desde 50 KB a más de 2 GB. Que yo sepa, cURL es el software más confiable del planeta en este momento para esta tarea. No creo que python, wget, o incluso la mayoría de los navegadores web puedan igualarlo en términos de corrección y robustez de la implementación. En una python lo suficientemente moderna que use urllib2 de la manera correcta, se puede hacer bastante confiable, pero todavía ejecuto un subproceso curl y eso es absolutamente sólido como una roca.

Otra forma de decir esto es que cURL hace una sola cosa y lo hace mejor que cualquier otro software porque ha tenido mucho más desarrollo y refinamiento. Python's urllib2 es útil y conveniente y funciona lo suficientemente bien para cargas de trabajo de pequeñas a medias, pero cURL está muy por delante en términos de confiabilidad.

Además, rizo tiene numerosas opciones para ajustar el comportamiento fiabilidad incluyendo reintentar el recuento de tiempo de espera, valores, etc.

2

Si está utilizando:

page = urllib.retrieve('http://example.com/really_big_file.html') 

va a crear una cadena de 500 mb, que bien puede gravar a su máquina, que sea lento, y provocar que la línea de tiempo de espera. Si es así, debe utilizar:

(filename, headers) = urllib.retrieve('http://...', 'local_outputfile.html') 

que no impondrá impuestos al intérprete.

Vale la pena señalar que urllib.retrieve() usa urllib.urlopen() which is now deprecated.

+0

Buen punto, aunque yo estoy usando la versión más larga que guarda en un archivo. – jrdioko

Cuestiones relacionadas