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 17 Python
Python多层嵌套list的递归处理方法(推荐)
Jun 08 Python
python opencv实现任意角度的透视变换实例代码
Jan 12 Python
Python修改文件往指定行插入内容的实例
Jan 30 Python
python3转换code128条形码的方法
Apr 17 Python
简单了解Python3里的一些新特性
Jul 13 Python
对Django url的几种使用方式详解
Aug 06 Python
python实现异常信息堆栈输出到日志文件
Dec 26 Python
详解Python的三种拷贝方式
Feb 11 Python
python GUI库图形界面开发之PyQt5下拉列表框控件QComboBox详细使用方法与实例
Feb 27 Python
用python打开摄像头并把图像传回qq邮箱(Pyinstaller打包)
May 17 Python
pytorch 带batch的tensor类型图像显示操作
May 20 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
微信支付开发交易通知实例
2016/07/12 PHP
PHP下 Mongodb 连接远程数据库的实例代码
2017/08/30 PHP
php实现在线考试系统【附源码】
2018/09/18 PHP
JavaScript入门教程(6) Window窗口对象
2009/01/31 Javascript
javascript中判断一个值是否在数组中并没有直接使用
2012/12/17 Javascript
Js 获取Gridview选中行的内容操作步骤
2013/02/05 Javascript
动态加载js和css(外部文件)
2013/04/17 Javascript
javascript确认框的三种使用方法
2013/12/17 Javascript
jQuery 获取、设置HTML或TEXT内容的两种方法
2014/05/23 Javascript
JS iFrame加载慢怎么解决
2016/05/13 Javascript
jQuery实现的tab标签切换效果示例
2016/09/05 Javascript
js实现非常棒的弹出div
2016/10/06 Javascript
Vuex之理解Mutations的用法实例
2017/04/19 Javascript
ES6数组的扩展详解
2017/04/25 Javascript
Vue实现todolist删除功能
2018/06/26 Javascript
微信小程序页面间传递数组对象方法解析
2019/11/06 Javascript
vue el-table实现行内编辑功能
2019/12/11 Javascript
js实现列表向上无限滚动
2020/01/13 Javascript
[47:52]DOTA2-DPC中国联赛正赛 iG vs LBZS BO3 第二场 3月4日
2021/03/11 DOTA
Python中使用PyHook监听鼠标和键盘事件实例
2014/07/18 Python
python安装oracle扩展及数据库连接方法
2017/02/21 Python
Python贪吃蛇游戏编写代码
2020/10/26 Python
Python使用当前时间、随机数产生一个唯一数字的方法
2017/09/18 Python
python实现文本界面网络聊天室
2018/12/12 Python
pywinauto自动化操作记事本
2019/08/26 Python
Python3 mmap内存映射文件示例解析
2020/03/23 Python
Python基于Hypothesis测试库生成测试数据
2020/04/29 Python
美国最大的宠物药店:1-800-PetMeds
2016/10/02 全球购物
Currentbody澳大利亚:美容仪专家
2019/11/11 全球购物
品牌推广策划方案
2014/05/28 职场文书
委托书格式
2014/08/01 职场文书
父亲节寄语大全
2015/02/27 职场文书
go结构体嵌套的切片数组操作
2021/04/28 Golang
基于Redis延迟队列的实现代码
2021/05/13 Redis
python编写五子棋游戏
2021/05/25 Python
Python selenium的这三种等待方式一定要会!
2021/06/10 Python