libreria from example python http progress-bar urllib2 httpclient

from - Gancho de progreso de Python urllib2



urllib.urlopen python 3 (4)

Estoy intentando crear una barra de progreso de descarga en python usando el cliente http urllib2. Miré a través de la API (y en google) y parece que urllib2 no te permite registrar ganchos de progreso. Sin embargo, el urllib obsoleto más viejo tiene esta funcionalidad.

¿Alguien sabe cómo crear una barra de progreso o declarar un enlace usando urllib2? ¿O hay algunos otros hacks para obtener una funcionalidad similar?


Versión simplificada:

temp_filename = "/tmp/" + file_url.split(''/'')[-1] f = open(temp_filename, ''wb'') remote_file = urllib2.urlopen(file_url) try: total_size = remote_file.info().getheader(''Content-Length'').strip() header = True except AttributeError: header = False # a response doesn''t always include the "Content-Length" header if header: total_size = int(total_size) bytes_so_far = 0 while True: buffer = remote_file.read(8192) if not buffer: sys.stdout.write(''/n'') break bytes_so_far += len(buffer) f.write(buffer) if not header: total_size = bytes_so_far # unknown size percent = float(bytes_so_far) / total_size percent = round(percent*100, 2) sys.stdout.write("Downloaded %d of %d bytes (%0.2f%%)/r" % (bytes_so_far, total_size, percent))


¿Por qué no simplemente leer datos en fragmentos y hacer lo que quieras hacer en el medio, por ejemplo, ejecutar un hilo, enganchar en una interfaz de usuario, etc. etc.

import urllib2 urlfile = urllib2.urlopen("http://www.google.com") data_list = [] chunk = 4096 while 1: data = urlfile.read(chunk) if not data: print "done." break data_list.append(data) print "Read %s bytes"%len(data)

salida :

Read 4096 bytes Read 3113 bytes done.


Aquí hay un ejemplo completamente funcional que se basa en el enfoque de Anurag de fragmentar en una respuesta. Mi versión te permite establecer el tamaño del fragmento y adjuntar una función de informe arbitraria:

import urllib2, sys def chunk_report(bytes_so_far, chunk_size, total_size): percent = float(bytes_so_far) / total_size percent = round(percent*100, 2) sys.stdout.write("Downloaded %d of %d bytes (%0.2f%%)/r" % (bytes_so_far, total_size, percent)) if bytes_so_far >= total_size: sys.stdout.write(''/n'') def chunk_read(response, chunk_size=8192, report_hook=None): total_size = response.info().getheader(''Content-Length'').strip() total_size = int(total_size) bytes_so_far = 0 while 1: chunk = response.read(chunk_size) bytes_so_far += len(chunk) if not chunk: break if report_hook: report_hook(bytes_so_far, chunk_size, total_size) return bytes_so_far if __name__ == ''__main__'': response = urllib2.urlopen(''http://www.ebay.com''); chunk_read(response, report_hook=chunk_report)


urlgrabber tiene soporte integrado para notificación de progreso.