Рычаг Прогресса Python urllib2

Существует много возможностей ...

Поддержка отладки часто реализуется с использованием протокола v8 Debugging Protocol или более нового протокола отладки Chrome .

28
задан speedplane 8 January 2010 в 15:22
поделиться

4 ответа

Вот полностью рабочий пример, основанный на подходе Анурага к отсечению в ответе. Моя версия позволяет задать размер фрагмента и прикрепить произвольную функцию отчётности:

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)
41
ответ дан 28 November 2019 в 03:00
поделиться

urlgrabber имеет встроенную поддержку для уведомления о прогрессе.

5
ответ дан joshk0 14 October 2019 в 10:38
поделиться

Незначительная модификация ответа Триптиха, позволяющая фактически записать файл (python3):

from urllib.request import urlopen

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().get("Content-Length").strip()
    total_size = int(total_size)
    bytes_so_far = 0
    data = b""

    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)

        data += chunk

    return data

Использование:

with open(out_path, "wb") as f:
    response = urlopen(filepath)
    data_read = chunk_read(response, report_hook=chunk_report)

    f.write(data_read)
0
ответ дан Geoff 14 October 2019 в 10:38
поделиться

Почему бы просто не прочитать данные в кусках и не сделать все, что вы хотите сделать между ними, например, запустить в потоке, подключиться к пользовательскому интерфейсу, и т.д.

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)

вывод:

Read 4096 bytes
Read 3113 bytes
done.
12
ответ дан 28 November 2019 в 03:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: