Python urllib2 Progress Hook

spe*_*ane 28 python http urllib2 httpclient progress-bar

我正在尝试使用urllib2 http客户端在python中创建下载进度条.我查看了API(以及谷歌),似乎urllib2不允许您注册进度挂钩.但是旧版已弃用的urllib确实具有此功能.

有谁知道如何使用urllib2创建进度条或报告钩子?或者是否有其他一些黑客可以获得类似的功能?

Tri*_*ych 41

这是一个完全有效的例子,它基于Anurag在响应中的分块方法.我的版本允许您设置块大小,并附加任意报告功能:

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)
Run Code Online (Sandbox Code Playgroud)

  • 多数民众赞成下载.上传有类似的东西吗?(即写大量的帖子数据?) (3认同)
  • 请注意,响应并不总是包含"Content-Length"标头.对于不支持它的服务器,这将失败. (2认同)

Anu*_*yal 12

为什么不只是以块的形式读取数据并做任何你想做的事情,例如在线程中运行,挂钩到UI等等

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)
Run Code Online (Sandbox Code Playgroud)

输出:

Read 4096 bytes
Read 3113 bytes
done.
Run Code Online (Sandbox Code Playgroud)


Ign*_*ams 5

urlgrabber内置了对进度通知的支持.