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制作CSDN免积分下载器
Mar 10 Python
python实现对文件中图片生成带标签的txt文件方法
Apr 27 Python
PythonWeb项目Django部署在Ubuntu18.04腾讯云主机上
Apr 01 Python
windows10下安装TensorFlow Object Detection API的步骤
Jun 13 Python
Python安装selenium包详细过程
Jul 23 Python
python实现回旋矩阵方式(旋转矩阵)
Dec 04 Python
Python标准库shutil模块使用方法解析
Mar 10 Python
django实现将后台model对象转换成json对象并传递给前端jquery
Mar 16 Python
Django之富文本(获取内容,设置内容方式)
May 21 Python
解决Python3.7.0 SSL低版本导致Pip无法使用问题
Sep 03 Python
Django数据库迁移常见使用方法
Nov 12 Python
Django通过设置CORS解决跨域问题
Nov 26 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中include与require使用方法区别详解
2013/10/19 PHP
推荐一本PHP程序猿都应该拜读的书
2014/12/31 PHP
PHP中实现crontab代码分享
2015/03/26 PHP
php判断当前操作系统类型
2015/10/28 PHP
ThinkPHP 整合Bootstrap Ajax分页样式
2016/12/23 PHP
php+Ajax处理xml与json格式数据的方法示例
2019/03/04 PHP
PHP+mysql防止SQL注入的方法小结
2019/04/27 PHP
js获取php变量的实现代码
2013/08/10 Javascript
js改变鼠标的形状和样式的方法
2014/03/31 Javascript
用js格式化金额可设置保留的小数位数
2014/05/09 Javascript
jquery背景跟随鼠标滑动导航
2015/11/20 Javascript
超赞的jQuery图片滑块动画特效代码汇总
2016/01/25 Javascript
基于JavaScript实现表单密码的隐藏和显示出来
2016/03/02 Javascript
javascript中去除数组重复元素的实现方法【实例】
2016/04/12 Javascript
基于Jquery插件实现跨域异步上传文件功能
2016/04/26 Javascript
Node.js刷新session过期时间的实现方法推荐
2016/05/18 Javascript
jquery判断对象是否为空并遍历对象的简单实例
2016/07/26 Javascript
浅析Ajax语法
2016/12/05 Javascript
fckeditor部署到weblogic出现xml无法读取及样式不能显示问题的解决方法
2017/03/24 Javascript
vuex学习之Actions的用法详解
2017/08/29 Javascript
Vue组件库发布到npm详解
2018/02/17 Javascript
Bootstrap Table中的多选框删除功能
2018/07/15 Javascript
在vue中阻止浏览器后退的实例
2019/11/06 Javascript
[01:32]DOTA2上海特锦赛现场采访:最想COS的英雄
2016/03/25 DOTA
python爬虫豆瓣网的模拟登录实现
2019/08/21 Python
keras 解决加载lstm+crf模型出错的问题
2020/06/10 Python
使用pygame实现垃圾分类小游戏功能(已获校级二等奖)
2020/07/23 Python
通过实例简单了解Python sys.argv[]使用方法
2020/08/04 Python
python使用re模块爬取豆瓣Top250电影
2020/10/20 Python
python subprocess pipe 实时输出日志的操作
2020/12/05 Python
英国和世界各地鲜花速递专家:Arena Flowers
2018/02/10 全球购物
英国领先的鞋类零售商和顶级品牌的官方零售商:Wynsors
2020/02/17 全球购物
中学生教师节演讲稿
2014/09/03 职场文书
运动会宣传语
2015/07/13 职场文书
2015国庆节放假通知范文
2015/07/30 职场文书
Javascript 解构赋值详情
2021/11/17 Javascript