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之变量和参数
Oct 10 Python
在Python的Django框架中加载模版的方法
Jul 16 Python
Python端口扫描简单程序
Nov 10 Python
python利用正则表达式提取字符串
Dec 08 Python
Python 关于反射和类的特殊成员方法
Sep 14 Python
PyCharm代码提示忽略大小写设置方法
Oct 28 Python
python实现文件的备份流程详解
Jun 18 Python
python网络编程之多线程同时接受和发送
Sep 03 Python
Django之路由层的实现
Sep 09 Python
pytorch下大型数据集(大型图片)的导入方式
Jan 08 Python
python中安装django模块的方法
Mar 12 Python
python缩进长度是否统一
Aug 02 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获取从百度、谷歌等搜索引擎进入网站关键词的方法
2015/07/08 PHP
zen_cart实现支付前生成订单的方法
2016/05/06 PHP
JS getStyle获取最终样式函数代码
2010/04/01 Javascript
妙用Jquery的val()方法
2012/06/27 Javascript
模拟jQuery中的ready方法及实现按需加载css,js实例代码
2013/09/27 Javascript
微信小程序 连续旋转动画(this.animation.rotate)详解
2017/04/07 Javascript
详解微信小程序设置底部导航栏目方法
2017/06/29 Javascript
学习Vue组件实例
2018/04/28 Javascript
jQuery实现checkbox全选功能完整实例
2018/07/12 jQuery
angular中两种表单的区别(响应式和模板驱动表单)
2018/12/06 Javascript
每天学点Vue源码之vm.$mount挂载函数
2019/03/11 Javascript
基于jquery实现的tab选项卡功能示例【附源码下载】
2019/06/10 jQuery
利用不到200行代码写一款属于你自己的js类库
2019/07/08 Javascript
vue 组件简介
2020/07/31 Javascript
[09:23]国际邀请赛采访专栏:iG战队VK,Tongfu战队Cu
2013/08/05 DOTA
在Python中使用列表生成式的教程
2015/04/27 Python
Python 常用string函数详解
2016/05/30 Python
Python入门之三角函数全解【收藏】
2017/11/08 Python
Scrapy抓取京东商品、豆瓣电影及代码分享
2017/11/23 Python
python二维列表一维列表的互相转换实例
2018/07/02 Python
Python里字典的基本用法(包括嵌套字典)
2019/02/27 Python
使用python3调用wxpy模块监控linux日志并定时发送消息给群组或好友
2019/06/05 Python
程序员的七夕用30行代码让Python化身表白神器
2019/08/07 Python
matplotlib绘制多子图共享鼠标光标的方法示例
2021/01/08 Python
加拿大建筑和装修专家:Reno-Depot
2017/12/21 全球购物
迪拜领先运动补剂零售品牌中文站:Sporter商城
2019/08/20 全球购物
英国门销售网站:Green Tree Doors
2020/01/07 全球购物
在Java开发中如何选择使用哪种集合类
2016/08/09 面试题
不用游标的SQL语句有哪些
2012/09/07 面试题
计生工作先进事迹
2014/08/15 职场文书
运动会开幕词
2015/01/28 职场文书
初级职称评定工作总结
2015/08/13 职场文书
维护民族团结心得体会2016
2016/01/15 职场文书
教师实习自我鉴定总结
2019/08/20 职场文书
基于Python编写一个监控CPU的应用系统
2022/06/25 Python
Nginx跨域问题解析与解决
2022/08/05 Servers