1. #!/usr/bin/python  
  2. #coding:utf-8 
  3.  
  4.  
  5. """  
  6. urllib 如何限速下载 
  7. file:ratelimit-urllib.py 
  8. Fetch a url rate limited  
  9.  
  10. Syntax: rate URL local_file_name  
  11.  
  12. python ratelimit-urllib.py 200 http://localhost/share/netbeans-7.0-ml-linux.sh  1.sh 
  13.  
  14. """  
  15.  
  16. import os  
  17. import sys  
  18. import urllib  
  19. from time import time, sleep  
  20.  
  21. class RateLimit(object):  
  22.     """Rate limit a url fetch"""  
  23.     def __init__(self, rate_limit):  
  24.         """rate limit in kBytes / second"""  
  25.         self.rate_limit = rate_limit  
  26.         self.start = time()  
  27.     def __call__(self, block_count, block_size, total_size):  
  28.         total_kb = total_size / 1024  
  29.         downloaded_kb = (block_count * block_size) / 1024  
  30.         elapsed_time = time() - self.start  
  31.         if elapsed_time != 0:  
  32.             #实际下载速度 
  33.             rate = downloaded_kb / elapsed_time  
  34.             print "%d kb of %d kb downloaded %f.1 kBytes/s\n" % (downloaded_kb ,total_kb, rate),  
  35.             expected_time = downloaded_kb / self.rate_limit  
  36.             sleep_time = expected_time - elapsed_time  
  37.             print "Sleep for", sleep_time  
  38.             #等待时间 
  39.             if sleep_time > 0:  
  40.                 sleep(sleep_time)  
  41.  
  42. def main():  
  43.     """Fetch the contents of urls"""  
  44.     if len(sys.argv) != 4:  
  45.         print 'Syntax: %s "rate in kBytes/s" URL "local output path"' % sys.argv[0]  
  46.         raise SystemExit(1)  
  47.     rate_limit, url, out_path = sys.argv[1:]  
  48.     rate_limit = float(rate_limit)  
  49.     print "Fetching %r to %r with rate limit %.1f" % (url, out_path, rate_limit)  
  50.     #这个扩展接口支持一个回调函数,每下载一段就调用一次回调函数 
  51.     urllib.urlretrieve(url, out_path, reporthook=RateLimit(rate_limit))  
  52.  
  53. if __name__ == "__main__": main()  

 

参考资料:

http://www.gossamer-threads.com/lists/python/python/613388?do=post_view_threaded#613388