Python编写一个优美的下载器

本文实例为大家分享了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实现多线程HTTP下载器示例
  • Python制作CSDN免积分下载器
  • python使用urllib模块开发的多线程豆瓣小站mp3下载器
  • python实现多线程网页下载器
(0)

相关推荐

  • python使用urllib模块开发的多线程豆瓣小站mp3下载器

    复制代码 代码如下: #! /usr/bin/python2.7# -- coding:utf-8 -- import os, urllib,urllib2, thread,threadingimport re #匹配音乐urlreg=re.compile('{"name":"(.+?)".+?"rawUrl":"(.+?)",.+?}', re.I) class downloader(threading.Thread):  

  • python实现多线程网页下载器

    本文为大家分享了python实现的一个多线程网页下载器,供大家参考,具体内容如下 这是一个有着真实需求的实现,我的用途是拿它来通过 HTTP 方式向服务器提交游戏数据.把它放上来也是想大家帮忙挑刺,找找 bug,让它工作得更好. keywords:python,http,multi-threads,thread,threading,httplib,urllib,urllib2,Queue,http pool,httppool 废话少说,上源码: # -*- coding:utf-8 -*- im

  • Python制作CSDN免积分下载器

    CSDN免积分下载 你懂的. 1.输入资源地址如:http://download.csdn.net/download/gengqkun/4127808 2.输入验证码 3.点击下载,会弹出浏览器下载. 注:成功率在70-80% ,界面很丑,请将就着用. 复制代码 代码如下: #-*-coding:utf-8-*- #python3.3.5 import urllib.parse,urllib.request,http.cookiejar,io,webbrowser import tkinter

  • Python实现多线程HTTP下载器示例

    本文将介绍使用Python编写多线程HTTP下载器,并生成.exe可执行文件. 环境:windows/Linux + Python2.7.x 单线程 在介绍多线程之前首先介绍单线程.编写单线程的思路为: 1.解析url: 2.连接web服务器: 3.构造http请求包: 4.下载文件. 接下来通过代码进行说明. 解析url 通过用户输入url进行解析.如果解析的路径为空,则赋值为'/':如果端口号为空,则赋值为"80":下载文件的文件名可根据用户的意愿进行更改(输入'y'表示更改,输入

  • python实现音乐下载器

    本文实例为大家分享了python音乐下载器的具体代码,供大家参考,具体内容如下 import requests import urllib import json from tkinter import * import tkinter.messagebox from tkinter.filedialog import askdirectory class QQMusic(): def __init__(self): self.interface = Tk() self.interface.ti

  • Python编写一个优美的下载器

    本文实例为大家分享了Python编写下载器的具体代码,供大家参考,具体内容如下 #!/bin/python3 # author: lidawei # create: 2016-07-11 # version: 1.0 # 功能说明: # 从指定的URL将文件取回本地 ##################################################### import http.client import os import threading import time impo

  • 如何用python编写一个生成春联软件

    目录 前言 效果展示 代码 打包exe可执行文件 总结 前言 最近不是快过年了,Python写对联挺火的,但是代码又不是人人都用,那就直接写个界面打包一下呗~ 主要实现只要运行后输入上联下联.横批,然后自动生成春联保存在代码文件夹,如果要打印出来也是可以的. 效果展示 输入对联,选择路径后点击开始生成春联即可. 代码 需要导入的模块 # 网络数据获取相关模块 import io # python IO 处理模块 from PIL import Image # 图像处理模块 import requ

  • 基于PyQt5制作一个表情包下载器

    每次和朋友聊天苦于没有表情包,而别人的表情包似乎是取之不尽.用之不竭.作为一个程序员哪能甘愿认输,于是做了一个表情包下载器供大家斗图. 首先,还是介绍一下设计思路吧,和我们之前做的百度图片下载器2.0一样,使用pyqt5作为UI界面制作的框架,然后就是找一个表情包网站供我们可以下载很多的表情包. 表情包使用的网站是这个,大家也可以使用自己发现的表情包网站做下载. 话不多说,我们先说明一下使用到的python库有哪些. UI界面使用到的pyqt5模块是下面这几个,之前也是一直使用这几个库做UI界面

  • 使用Python编写一个最基础的代码解释器的要点解析

    一直以来都对编译器和解析器有着很大的兴趣,也很清楚一个编译器的概念和整体的框架,但是对于细节部分却不是很了解.我们编写的程序源代码实际上就是一串字符序列,编译器或者解释器可以直接理解并执行这个字符序列,这看起来实在是太奇妙了.本文会用Python实现一个简单的解析器,用于解释一种小的列表操作语言(类似于python的list).其实编译器.解释器并不神秘,只要对基本的理论理解之后,实现起来也比较简单(当然,一个产品级的编译器或解释器还是很复杂的). 这种列表语言支持的操作: veca = [1,

  • Python3使用TCP编写一个简易的文件下载器功能

    利用Python3来实现TCP协议,和UDP类似.UDP应用于及时通信,而TCP协议用来传送文件.命令等操作,因为这些数据不允许丢失,否则会造成文件错误或命令混乱.下面代码就是模拟客户端通过命令行操作服务器.客户端输入命令,服务器执行并且返回结果. TCP(Transmission Control Protocol 传输控制协议):是一种面向连接的.可靠的.基于字节流的传输层通信协议,由IETF的RFC 793定义. 使用TCP编写一个简易的文件下载器要求:需编写文件下载器服务端和文件下载器客户

  • Python编写一个验证码图片数据标注GUI程序附源码

    做验证码图片的识别,不论是使用传统的ORC技术,还是使用统计机器学习或者是使用深度学习神经网络,都少不了从网络上采集大量相关的验证码图片做数据集样本来进行训练. 采集验证码图片,可以直接使用Python进行批量下载,下载完之后,就需要对下载下来的验证码图片进行标注.一般情况下,一个验证码图片的文件名就是图片中验证码的实际字符串. 在不借助工具的情况下,我们对验证码图片进行上述标注的流程是: 1.打开图片所在的文件夹: 2.选择一个图片: 3.鼠标右键重命名: 4.输入正确的字符串: 5.保存 州

  • java编写一个花名随机抽取器的实现示例

    一.程序效果 还记得以前上课的时候,老师会用自己写的一个抽取器抽取同学回答问题,当时想着我也要做一个,假期没事干,自学了java,闲来无聊,我也写一个,但是写的没有老师好,哈哈,好了说一下思路,先把界面布置好,然后逐一实现每个按钮的功能,其实也没什么难的. 二.需要用到的包 import java.awt.*; import javax.swing.*; import java.awt.event.*; import java.io.*; import java.util.*; 三.代码 1.相

  • python爬虫中的url下载器用法详解

    前期的入库筛选工作已经由url管理器完成了,整理的工作自然要由url下载器接手.当我们需要爬取的数据已经去重后,下载器的主要任务的是这些数据下载下来.所以它的使用也并不复杂,不过需要借助到我们之前所学过的一个库进行操作,相信之前的基础大家都学的很牢固.下面小编就来为大家介绍url下载器及其使用的方法. 下载器的作用就是接受URL管理器传递给它的一个url,然后把该网页的内容下载下来.python自带有urllib和urllib2等库(这两个库在python3中合并为urllib),它们的作用就是

  • 如何用Python编写一个电子考勤系统

    实验项目简介 学校现在需要实现一个电子考勤系统,考虑到你们班已经学过大数据应用开发语言Python,准备让你们实现部分学生端考勤功能.经过和老师的沟通,你了解到: (1) 目前该系统已经被学长实现了部分功能,你们只需要完成剩余功能即可,需要你们完成的功能会使用 #todo的形式进行标注, todo后面会列出这个地方的功能,形式如下. (2) 学生信息存储在stu_infos.csv文件中,第一行是列名行,后面每一行都是一个学生的信息,包含学号,姓名,密码.内容形式如下: (3) 考勤记录最终会被

  • 基于Python编写一个语音合成系统

    目录 背景 语音合成系统 准备工作 步骤 代码实现 背景 一直对语音合成系统比较感兴趣,总想能给自己合成一点内容,比如说合成小说,把我下载的电子书播报给我听等等. 语音合成系统 其实就是一个基于语音合成的工具,但是这个东西由于很多厂家都提供了API的形式,因此开发难度大大降低,只需要调用几个API即可实现属于自己的语音合成工具:麻雀虽小,五脏俱全.往大了说,这就是一个小型的语音合成系统. 准备工作 首先我们电脑上需要安装 Anaconda Python 3.7 visual studio cod

随机推荐