Python编写一个优美的下载器


Posted in Python onApril 15, 2018

本文实例为大家分享了Python编写下载器的具体代码,供大家参考,具体内容如下

#!/bin/python3 
# author: lidawei 
# create: 2016-07-11 
# version: 1.0 
# 功能说明: 
#  从指定的URL将文件取回本地 
##################################################### 
 
import http.client 
import os 
import threading 
import time 
import logging 
import unittest 
from queue import Queue 
from urllib.parse import urlparse 
 
logging.basicConfig(level = logging.DEBUG, 
     format = '%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s', 
     datefmt = '%a, %d %b %Y %H:%M:%S', 
     filename = 'Downloader_%s.log' % (time.strftime('%Y-%m-%d')), 
     filemode = 'a') 
 
class Downloader(object): 
 '''''文件下载器''' 
 url = '' 
 filename = '' 
 
 def __init__(self, full_url_str, filename): 
  '''''初始化''' 
  self.url = urlparse(full_url_str) 
  self.filename = filename 
 
 def download(self): 
  '''''执行下载,返回True或False''' 
  if self.url == '' or self.url == None or self.filename == '' or self.filename == None: 
   logging.error('Invalid parameter for Downloader') 
   return False 
 
  successed = False 
  conn = None 
  if self.url.scheme == 'https': 
   conn = http.client.HTTPSConnection(self.url.netloc) 
  else: 
   conn = http.client.HTTPConnection(self.url.netloc) 
  conn.request('GET', self.url.path) 
  response = conn.getresponse() 
  if response.status == 200: 
   total_size = response.getheader('Content-Length') 
   total_size = (int)(total_size) 
   if total_size > 0: 
    finished_size = 0 
    file = open(self.filename, 'wb') 
    if file: 
     progress = Progress() 
     progress.start() 
     while not response.closed: 
      buffers = response.read(1024) 
      file.write(buffers) 
 
      finished_size += len(buffers) 
      progress.update(finished_size, total_size) 
      if finished_size >= total_size: 
       break 
     # ... end while statment 
     file.close() 
     progress.stop() 
     progress.join() 
    else: 
     logging.error('Create local file %s failed' % (self.filename)) 
    # ... end if statment 
   else: 
    logging.error('Request file %s size failed' % (self.filename)) 
   # ... end if statment 
  else: 
   logging.error('HTTP/HTTPS request failed, status code:%d' % (response.status)) 
  # ... end if statment 
  conn.close() 
 
  return successed 
 # ... end download() method 
# ... end Downloader class 
 
class DataWriter(threading.Thread): 
 filename = '' 
 data_dict = {'offset' : 0, 'buffers_byte' : b''} 
 queue = Queue(128) 
 __stop = False 
 
 def __init__(self, filename): 
  self.filename = filename 
  threading.Thread.__init__(self) 
 
 #Override 
 def run(self): 
  while not self.__stop: 
   self.queue.get(True, 1) 
 
 def put_data(data_dict): 
  '''''将data_dict的数据放入队列,data_dict是一个字典,有两个元素:offset是偏移量,buffers_byte是二进制字节串''' 
  self.queue.put(data_dict) 
 
 def stop(self): 
  self.__stop = True 
 
class Progress(threading.Thread): 
 interval = 1 
 total_size = 0 
 finished_size = 0 
 old_size = 0 
 __stop = False 
 
 def __init__(self, interval = 0.5): 
  self.interval = interval 
  threading.Thread.__init__(self) 
 
 #Override 
 def run(self): 
  # logging.info('  Total  Finished  Percent  Speed') 
  print('  Total  Finished  Percent  Speed') 
  while not self.__stop: 
   time.sleep(self.interval) 
   if self.total_size > 0: 
    percent = self.finished_size / self.total_size * 100 
    speed = (self.finished_size - self.old_size) / self.interval 
    msg = '%12d %12d %10.2f%% %12d' % (self.total_size, self.finished_size, percent, speed) 
    # logging.info(msg) 
    print(msg) 
 
    self.old_size = self.finished_size 
   else: 
    logging.error('Total size is zero') 
  # ... end while statment 
 # ... end run() method 
 
 def stop(self): 
  self.__stop = True 
 
 def update(self, finished_size, total_size): 
  self.finished_size = finished_size 
  self.total_size = total_size 
 
class TestDownloaderFunctions(unittest.TestCase): 
 
 def setUp(self): 
  print('setUp') 
 
 def test_download(self): 
  url = 'http://dldir1.qq.com/qqfile/qq/QQ8.4/18376/QQ8.4.exe' 
  filename = 'QQ8.4.exe' 
  dl = Downloader(url, filename) 
  dl.download() 
 
 def tearDown(self): 
  print('tearDown') 
 
if __name__ == '__main__': 
 unittest.main()

这是测试结果:

Python编写一个优美的下载器

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python求解平方根的方法
Mar 11 Python
python中根据字符串调用函数的实现方法
Jun 12 Python
Python 3实战爬虫之爬取京东图书的图片详解
Oct 09 Python
Python3多线程爬虫实例讲解代码
Jan 05 Python
Python中三元表达式的几种写法介绍
Mar 04 Python
从0开始的Python学习014面向对象编程(推荐)
Apr 02 Python
如何使用Python实现斐波那契数列
Jul 02 Python
解决matplotlib.pyplot在Jupyter notebook中不显示图像问题
Apr 22 Python
Pytorch 使用opnecv读入图像由HWC转为BCHW格式方式
Jun 02 Python
浅谈tensorflow使用张量时的一些注意点tf.concat,tf.reshape,tf.stack
Jun 23 Python
pandas to_excel 添加颜色操作
Jul 14 Python
Python列表嵌套常见坑点及解决方案
Sep 30 Python
python实现音乐下载器
Apr 15 #Python
tensorflow 1.0用CNN进行图像分类
Apr 15 #Python
tensorflow学习笔记之mnist的卷积神经网络实例
Apr 15 #Python
tensorflow学习笔记之简单的神经网络训练和测试
Apr 15 #Python
Pytorch入门之mnist分类实例
Apr 14 #Python
pytorch构建网络模型的4种方法
Apr 13 #Python
Python输入二维数组方法
Apr 13 #Python
You might like
php 下载保存文件保存到本地的两种实现方法
2013/08/12 PHP
PHP面向对象程序设计高级特性详解(接口,继承,抽象类,析构,克隆等)
2016/12/02 PHP
PHP jQuery+Ajax结合写批量删除功能
2017/05/19 PHP
PHP 进程池与轮询调度算法实现多任务的示例代码
2019/11/26 PHP
JS连连看源码完美注释版(推荐)
2013/12/09 Javascript
JS delegate与live浅析
2013/12/21 Javascript
使用GruntJS构建Web程序之构建篇
2014/06/04 Javascript
JavaScript的arguments对象应用示例
2014/09/15 Javascript
利用vue实现模态框组件
2016/12/19 Javascript
JavaScript严格模式详解
2017/01/16 Javascript
js控制一个按钮是否可点击(可使用)disabled的实例
2017/02/14 Javascript
使用jQuery实现购物车结算功能
2017/08/15 jQuery
Vue.set()动态的新增与修改数据,触发视图更新的方法
2018/09/15 Javascript
详解Vue Elementui中的Tag与页面其它元素相互交互的两三事
2018/09/25 Javascript
JavaScript常用工具方法封装
2019/02/12 Javascript
element中的$confirm的使用
2020/04/26 Javascript
基于JS实现快速读取TXT文件
2020/08/25 Javascript
Python实现把回车符\r\n转换成\n
2015/04/23 Python
Python基于whois模块简单识别网站域名及所有者的方法
2018/04/23 Python
django框架模型层功能、组成与用法分析
2019/07/30 Python
Python多叉树的构造及取出节点数据(treelib)的方法
2019/08/09 Python
python super的使用方法及实例详解
2019/09/25 Python
基于spring boot 日志(logback)报错的解决方式
2020/02/20 Python
python用Configobj模块读取配置文件
2020/09/26 Python
pytorch学习教程之自定义数据集
2020/11/10 Python
浅谈Html5移动端ios/Android兼容性总结
2018/06/01 HTML / CSS
傲盾软件面试题
2015/08/17 面试题
中专生的个人自我评价
2013/12/11 职场文书
公务员转正考察材料
2014/02/07 职场文书
婚假请假条格式及范文
2014/04/10 职场文书
计算机应用专业毕业生求职信
2014/06/03 职场文书
校园文化标语
2014/06/18 职场文书
会计人员演讲稿
2014/09/11 职场文书
群众路线对照检查剖析材料
2014/10/09 职场文书
英语导游词
2015/02/13 职场文书
为自由献出你的心脏!「进击的巨人展 FINAL」2022年6月在台开展
2022/04/13 日漫