python编写下载器可暂停_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()

这是测试结果:

201804151446354.png

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持聚米学院。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/575832.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

fork()调用使子进程先于父进程被调度

由于内核使用写时复制机制,fork之后父子进程是共享页表描述符的,如果让父进程先执行,那么有很大几率父进程会修改共享页表指向的数据,那么内核此时必须给父进程分配并复制新的页表供父进程修改使用,那么如果子进程被创…

修改页面后获得flag_简单的CTF-从JS中获取flag

本文是一篇从合天网安实验室进行实验操作的笔记,一次非常简单地从JS中获取到flag的操作。1. 进入题目页(10.1.1.219:20123)看到一段话,还有一句很明显的提示语句“The evil url is the passkey”,翻译出来就是损坏的url就是flag。下面的英文…

文本框获取和失去焦点默认值问题

1. HTML控件<input id"txtName" type"text" value"默认值" /> <script src"script/jquery-1.7.1.min.js" type"text/javascript"></script><script type"text/javascript">$(function ()…

mac 源生安装mysql_Django执行源生mysql语句实现过程解析

1.使用extra方法解释&#xff1a;结果集修改器&#xff0c;一种提供额外查询参数的机制说明&#xff1a;依赖model模型使用方式&#xff1a;用在where后:Book.objects.filter(publisher_id"1").extra(where["titlepython学习1"])用在select后Book.objects.…

poj 3131 Cubic Eight-Puzzle 双向广搜 Hash判重

挺不错的题目&#xff0c;很锻炼代码能力和调试能力~ 题意&#xff1a;初始格子状态固定&#xff0c;给你移动后格子的状态&#xff0c;问最少需要多少步能到达&#xff0c;如果步数大于30&#xff0c;输出-1。 由于单向搜索状态太多&#xff0c;搜到二十几就会爆了&#xff0c…

mysql 优化rand_mysql优化--巧用rand(),with rollup,help__update2014.1.13

巧用rand()提取随机行&#xff1a;mysql中rand()获取0-1之间的一个随机数.这个函数和order by能把数据随机排序。随机从表中取出十条数据:select * from tablename order by rand() limit 10;此方法确实很方便&#xff0c;但是效率上却慢的惊人&#xff0c;切勿使用。SELECT * …

server2003 IIS 错误 解决

网页无法打开总显示&#xff1a;无法找到该页您正在搜索的页面可能已经删除、更名或暂时不可用。 --------------------------------------------------------------------------------请尝试以下操作&#xff1a;确保浏览器的地址栏中显示的网站地址的拼写和格式正确无误。 如…

mysql web备份软件_GitHub - toolzone/mysql_web_backup: mysql数据库自动备份,web网站自动备份shell脚本...

注意&#xff1a;Mysql_backup.sh 为 mysql 自动备份 脚本&#xff0c;配合 crontab命令 用来管理需要周期性执行任务Web_backup.sh 为 web文件 自动备份 脚本&#xff0c;配合 crontab命令 用来管理需要周期性执行任务Mysql_backup.sh 里&#xff1a;* 把 username 替换为mysq…

快速下载助手1.1--添加断点下载

在上一章中实现了多线程的断点下载&#xff0c;将快速下载助手添加断点下载功能&#xff0c;明天实现了速率统计功能 效果图如下&#xff1a; 打印信息如下&#xff1a; 欢迎使用快速下载助手-->并不是线程多就下载的快! 文件夹已经存在 默认的线程个数&#xff1a;3 保存路…

mysql查询自定义数据_实现自定义查询的数据库设计及实现(一)

需求先说一下需求&#xff1a;实现用户自定义的查询&#xff0c;用户可以自定义要查询的列、自定义条件条件、自定义排序。除了查询使用外&#xff0c;还可以使用于各个需要根据条件进行约束的业务&#xff0c;如权限&#xff1b;本设计和实现&#xff0c;很大部分是通过数据库…

poj 1321 棋盘问题

题目&#xff1a; http://poj.org/problem?id1321 八皇后问题&#xff0c;用dfsj即可。 源代码&#xff1a; 1 #include <iostream>2 #include<stdio.h>3 #include<cstring>4 using namespace std;5 int a[10][10];6 int visit[10];7 int n,k,sum;8 __int64…

php mysql-proxy报错_MySQL-proxy代理导致PHP PDO::ATTR_EMULATE_PREPARES的预处理出错,MySQL报General error: 1243错误...

背景&#xff1a;用的ThinkPHP5的框架。(相比之前的3.2版本&#xff0c;版本5都用了PDO处理数据库)症状&#xff1a;SQLSTATE[HY000]: General error: 1243 Unknown prepared statement handler (1) given to mysqld_stmt_execute具体的错误SQL&#xff0c;可能是任何一条正常的…

异步分页ajax

****jsp页面代码 <% page language"java" pageEncoding"utf-8"%> <% taglib prefix"s" uri"/struts-tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.or…

python函数模块_06.Python函数和模块

函数基础目标函数的快速体验函数的基本使用函数的参数函数的返回值函数的嵌套调用在模块中定义函数函数的快速体验1.1 快速体验所谓函数&#xff0c;就是把 具有独立功能的代码块 组织为一个小模块&#xff0c;在需要的时候 调用函数的使用包含两个步骤&#xff1a;定义函数 —…

浙江大学PAT上机题解析之1008. 数组元素循环右移问题 (20)

1008. 数组元素循环右移问题 (20) 时间限制 400 ms内存限制 32000 kB代码长度限制 8000 B判题程序 Standard一个数组A中存有N&#xff08;N>0&#xff09;个整数&#xff0c;在不允许使用另外数组的前提下&#xff0c;将每个整数循环向右移M&#xff08;M>0&#x…

mysql11导入数据_MySQL专题11之MySQL导出数据、MySQL导入数据

1、MySQL导出数据- MySQL中你可以使用SELECT...INTO OUTFILE语句来简单的导出数据到文本文件中。a、使用SELECT...INTO OUTFILE- 以下实例中我们将数据库runoob_tbl数据导出到/tmp/tutorials.txt文件中&#xff1a;mysql> SELECT * FROM runoob_tbl-> INTO OUTFILE /tm…

向量叉乘判断两向量之间是顺时针还是逆时针

转自http://blog.163.com/shiliping_007/blog/static/25772011201071744031933/ 向量积 a x b (^n) * |a| * |b| * sin<a, b>, 其中^n是同时垂直于a/b且符合右手定则的单位向量。若已知向量a (ax, ay, az), b (bx, by, bz); 则 a x b (ay * bz - by * az, az * bx - …

java 生成随机数_Java 生成随机数的 N 种方法

原标题&#xff1a;Java 生成随机数的 N 种方法www.baeldung.com/java-generating-random-numbers1.引言本文将探讨用 Java 生成随机数的不同方法。2.Java APIJava API 提供了几种随机数生成方法。让我们一起来了解一下。2.1.java.lang.MathMath 类中的 random 方法返回一个 [0…

剑指offer--面试题13

题目&#xff1a;以O(1)的时间复杂度删除单链表中的某个节点 自己所写代码如下&#xff1a; //以O(1)时间删除链表节点 //要求&#xff1a;单向链表&#xff0c;头指针&#xff0c;待删节点指针//链表节点 struct ListNode {int m_nValue;ListNode* m_pNext; }; //O(n)的解法&a…

重启java_让Java程序自动重启的实现方法(推荐)

要让一个java程序自动重启还真不容易的&#xff0c;重启分两步&#xff0c;首先是结束程序&#xff0c;这个简单&#xff0c;只要运行System.exit()就可以了。然后是启动&#xff0c;这个就难了&#xff0c;这个时候程序都已经结束了&#xff0c;就像一个人死了就不可能再自己站…