侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

Python编写一个优美的下载器

Python  /  管理员 发布于 7年前   117

本文实例为大家分享了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实现音乐下载器
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客