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 encode和decode的妙用
Sep 02 Python
python 算法 排序实现快速排序
Jun 05 Python
python选择排序算法的实现代码
Nov 21 Python
python遍历类中所有成员的方法
Mar 18 Python
vscode 远程调试python的方法
Dec 01 Python
python批量下载网站马拉松照片的完整步骤
Dec 05 Python
Mac安装python3的方法步骤
Aug 09 Python
调试Django时打印SQL语句的日志代码实例
Sep 12 Python
python3图片文件批量重命名处理
Oct 31 Python
Pytorch 之修改Tensor部分值方式
Dec 27 Python
python GUI库图形界面开发之PyQt5开发环境配置与基础使用
Feb 25 Python
利用Python的folium包绘制城市道路图的实现示例
Aug 24 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自动反斜杠的函数代码
2010/01/05 PHP
PHP中文URL编解码(urlencode()rawurlencode()
2010/07/03 PHP
利用php绘制饼状图的实现代码
2013/06/07 PHP
PHP实现从PostgreSQL数据库检索数据分页显示及根据条件查找数据示例
2018/06/09 PHP
Javascript 代码也可以变得优美的实现方法
2009/06/22 Javascript
利用div+jquery自定义滚动条样式的2种方法
2013/07/18 Javascript
Javascript实现获取窗口的大小和位置代码分享
2014/12/04 Javascript
JavaScript中Date对象的常用方法示例
2015/10/24 Javascript
jQuery实现简单滚动动画效果
2016/04/07 Javascript
浅谈JavaScript中小数和大整数的精度丢失
2016/05/31 Javascript
jQuery插件zTree实现的基本树与节点获取操作示例
2017/03/08 Javascript
BootStrap selectpicker后台动态绑定数据
2017/06/01 Javascript
vue实现带复选框的树形菜单
2019/05/27 Javascript
JS实现商城秒杀倒计时功能(动态设置秒杀时间)
2019/12/12 Javascript
原生JavaScript实现购物车
2021/01/10 Javascript
Python合并两个字典的常用方法与效率比较
2015/06/17 Python
python中nan与inf转为特定数字方法示例
2017/05/11 Python
Python运维自动化之nginx配置文件对比操作示例
2018/08/29 Python
Python使用random模块生成随机数操作实例详解
2019/09/17 Python
PIL包中Image模块的convert()函数的具体使用
2020/02/26 Python
python mysql 字段与关键字冲突的解决方式
2020/03/02 Python
CSS3绘制有活力的链接下划线
2016/07/14 HTML / CSS
澳大利亚足球鞋和服装购物网站:Ultra Football
2018/10/11 全球购物
马德里竞技官方网上商店:Atletico Madrid Shop
2019/03/31 全球购物
货代行业个人求职简历的自我评价
2013/10/22 职场文书
18岁生日感言
2014/01/12 职场文书
超市后勤自我鉴定
2014/01/17 职场文书
中文师范生自荐信
2014/01/30 职场文书
歌颂祖国演讲稿
2014/05/04 职场文书
2014年机关后勤工作总结
2014/12/16 职场文书
大学生就业意向书
2015/05/11 职场文书
学校2015年纠风工作总结
2015/05/15 职场文书
优秀教师工作总结2015
2015/07/22 职场文书
Vue通过懒加载提升页面响应速度
2021/05/10 Vue.js
《火纹风花雪月无双》预告“神秘雇佣兵” 紫发剑客
2022/04/13 其他游戏
pnpm对npm及yarn降维打击详解
2022/08/05 Javascript