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中对元组和列表按条件进行排序的方法示例
Nov 10 Python
利用Python画ROC曲线和AUC值计算
Sep 19 Python
Python面向对象类的继承实例详解
Jun 27 Python
使用Python横向合并excel文件的实例
Dec 11 Python
详解Python安装tesserocr遇到的各种问题及解决办法
Mar 07 Python
python3 反射的四种基本方法解析
Aug 26 Python
Django3.0 异步通信初体验(小结)
Dec 04 Python
opencv python在视屏上截图功能的实现
Mar 05 Python
使用pytorch实现论文中的unet网络
Jun 24 Python
浅谈Django前端后端值传递问题
Jul 15 Python
Python如何使用input函数获取输入
Aug 06 Python
Python自动发送和收取邮件的方法
Aug 12 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
六酷社区论坛HOME页清新格调免费版 下载
2007/03/07 PHP
php实现在限定区域里自动调整字体大小的类实例
2015/04/02 PHP
php发送邮件的问题详解
2015/06/22 PHP
使用Firebug对js进行断点调试的图文方法
2011/04/02 Javascript
jQuery操作input值的各种方法总结
2013/11/21 Javascript
jquery无刷新验证邮箱地址实现实例
2014/02/19 Javascript
JS中字符串trim()使用示例
2015/05/26 Javascript
jQuery基础知识点总结(DOM操作)
2016/06/01 Javascript
Bootstrap编写一个在当前网页弹出可关闭的对话框 非弹窗
2016/06/30 Javascript
利用Javascript实现BMI计算器
2016/08/16 Javascript
jquery操作checkbox火狐下第二次无法勾选的解决方法
2016/10/10 Javascript
详解Nodejs之npm&package.json
2017/06/15 NodeJs
使用Three.js实现太阳系八大行星的自转公转示例代码
2019/04/09 Javascript
javascript中this的用法实践分析
2019/07/29 Javascript
Python中使用PyQt把网页转换成PDF操作代码实例
2015/04/23 Python
从Python的源码来解析Python下的freeblock
2015/05/11 Python
Python实现列表转换成字典数据结构的方法
2016/03/11 Python
selenium+python实现1688网站验证码图片的截取功能
2018/08/14 Python
Python读取txt内容写入xls格式excel中的方法
2018/10/11 Python
python scipy卷积运算的实现方法
2019/09/16 Python
美国最受欢迎的度假目的地优惠套餐:BookVIP
2018/09/27 全球购物
StubHub新西兰:购买和出售你的门票
2019/04/22 全球购物
.NET面试题:什么是反射
2016/09/30 面试题
JAVA招聘远程笔试题
2015/07/23 面试题
公司领导推荐信
2013/11/12 职场文书
业务主管岗位职责范本
2013/12/25 职场文书
简历上的自我评价
2014/02/03 职场文书
《风筝》教学反思
2014/04/10 职场文书
网络编辑求职信
2014/04/30 职场文书
公益广告标语
2014/06/19 职场文书
文员转正自我鉴定怎么写
2014/09/29 职场文书
死者家属慰问信
2015/03/24 职场文书
员工考勤管理制度
2015/08/06 职场文书
Java框架入门之简单介绍SpringBoot框架
2021/06/18 Java/Android
Vue + iView实现Excel上传功能的完整代码
2021/06/22 Vue.js
漫画「狩龙人拉格纳」公开TV动画预告图
2022/03/22 日漫