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实现给qq邮箱发送邮件的方法
May 28 Python
解决Python 遍历字典时删除元素报异常的问题
Sep 11 Python
Python抓取手机号归属地信息示例代码
Nov 28 Python
windows 10下安装搭建django1.10.3和Apache2.4的方法
Apr 05 Python
Python加密方法小结【md5,base64,sha1】
Jul 13 Python
Python实现模拟登录网易邮箱的方法示例
Jul 05 Python
Python使用Flask-SQLAlchemy连接数据库操作示例
Aug 31 Python
Python学习笔记之读取文件、OS模块、异常处理、with as语法示例
Jun 04 Python
基于Python安装pyecharts所遇的问题及解决方法
Aug 12 Python
Django 实现xadmin后台菜单改为中文
Nov 15 Python
scrapy数据存储在mysql数据库的两种方式(同步和异步)
Feb 18 Python
使用qt quick-ListView仿微信好友列表和聊天列表的示例代码
Jun 13 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中的一个中文字符串截取函数
2007/02/14 PHP
利用“多说”制作留言板、评论系统
2015/07/14 PHP
PHP对XML内容进行修改和删除实例代码
2016/10/26 PHP
php实现给二维数组中所有一维数组添加值的方法
2017/02/04 PHP
Firefox和IE浏览器兼容JS脚本写法小结
2008/07/07 Javascript
JavaScript 基础篇之运算符、语句(二)
2012/04/07 Javascript
用Jquery重写windows.alert方法实现思路
2013/04/03 Javascript
js hover 定时器(实例代码)
2013/11/12 Javascript
jquery实现手机发送验证码的倒计时代码
2014/02/12 Javascript
jquery的each方法使用示例分享
2014/03/25 Javascript
javascript怎么禁用浏览器后退按钮
2014/03/27 Javascript
JQuery EasyUI 数字格式化处理示例
2014/05/05 Javascript
AngularJS 单选框及多选框的双向动态绑定
2017/04/20 Javascript
Node.JS 循环递归复制文件夹目录及其子文件夹下的所有文件
2017/09/18 Javascript
VUE中的无限循环代码解析
2017/09/22 Javascript
vue项目总结之文件夹结构配置详解
2017/12/13 Javascript
JavaScript实现短暂提示框功能
2018/04/04 Javascript
vue实现文字加密功能
2019/09/27 Javascript
vue项目引入ts步骤(小结)
2019/10/31 Javascript
Python中的sort()方法使用基础教程
2017/01/08 Python
python安装模块如何通过setup.py安装(超简单)
2018/05/05 Python
Python基于最小二乘法实现曲线拟合示例
2018/06/14 Python
Python使用reportlab模块生成PDF格式的文档
2019/03/11 Python
python range实例用法分享
2020/02/06 Python
python绘制雷达图实例讲解
2021/01/03 Python
CSS3感应鼠标的背景闪烁和图片缩放动画效果
2014/05/14 HTML / CSS
AmazeUI的下载配置与Helloworld的实现
2020/08/19 HTML / CSS
总裁岗位职责
2013/12/04 职场文书
食品安全标语
2014/06/07 职场文书
禁毒宣传活动总结
2014/08/26 职场文书
2014离婚协议书范文两篇
2014/09/15 职场文书
2015届本科毕业生自我鉴定
2014/09/27 职场文书
中学综治宣传月活动总结
2015/05/07 职场文书
2019年大学毕业生个人自我鉴定范文大全
2019/03/21 职场文书
如何写好一份优秀的工作总结?
2019/06/21 职场文书
高中班主任工作总结(范文)
2019/08/20 职场文书