话很少说,先上图
该Python代码能够实现获取下载的文件名,下载文件的大小,下载速度等。ide
一、关于下载文件名的获取:代码里使用两种方式获取:
(1) 经过Content-Disposition属性,该属性是做为对下载文件的一个标识字段,存储着下载文件名
(2) 直接经过连接获取,例如:sw.bos.baidu.com/sw-search-sp/software/8b23f8846df3d/BaiduMusicSetup.exe 文件后面直接就是文件名称了。
二、关于下载文件大小的获取:直接从HTTP的响应信息中获取,在Content-Length中
三、requests.get(url)默认是下载在内存中的,下载完成才存到硬盘上,这样就没法获取当前下载进度了,因此要设置边下边存硬盘url
def downfile(self,filename): #下载文件 self.r = requests.get(self.url,stream=True) with open(filename, "wb") as code: for chunk in self.r.iter_content(chunk_size=1024): #边下载边存硬盘 if chunk: code.write(chunk)
import threading import os import requests import time import re import urllib def view_bar(num, total): #显示进度条 rate = num/total rate_num = int(rate * 100) number=int(50*rate) r = '\r[%s%s]%d%%' % ("#"*number, " "*(50-number), rate_num, ) print("\r {}".format(r),end=" ") #\r回到行的开头 class Getfile(): #下载文件 def __init__(self,url): self.url=url #self.filename=filename self.re=requests.head(url,allow_redirects=True) #运行head方法时重定向 def getsize(self): try: self.file_total=int(self.re.headers['Content-Length']) #获取下载文件大小 return self.file_total except: print('没法获取下载文件大小') exit() def getfilename(self): #获取默认下载文件名 filename='' if 'Content-Disposition' in self.re.headers: n=self.re.headers.get('Content-Disposition').split('name=')[1] filename=urllib.parse.unquote(n,encoding='utf8') elif os.path.splitext(self.re.url)[1]!='': filename=os.path.basename(self.re.url) return filename def downfile(self,filename): #下载文件 self.r = requests.get(self.url,stream=True) with open(filename, "wb") as code: for chunk in self.r.iter_content(chunk_size=1024): #边下载边存硬盘 if chunk: code.write(chunk) time.sleep(1) #print ("\n下载完成") def downprogress(self,filename): self.filename=filename self.file_size=0 self.file_total=self.getsize() while self.file_size<self.file_total: #获取当前下载进度 time.sleep(1) if os.path.exists(self.filename): self.down_rate=(os.path.getsize(self.filename)-self.file_size)/1024/1024 self.down_time=(self.file_total-self.file_size)/1024/1024/self.down_rate print (" "+str('%.2f' %self.down_rate+"MB/s"),end="") self.file_size=os.path.getsize(self.filename) print (" "+str(int(self.down_time))+"s",end="") print (" "+str('%.2f' %(self.file_size/1024/1024))+"MB",end="") view_bar(self.file_size, self.file_total) if __name__ == '__main__': url = input("输入网址:") while not re.match('^(https?|ftp)://.+$',url): url = input("网址格式错误,请从新输入:") file1=Getfile(url) file_total=file1.getsize() filename=file1.getfilename() if filename=='': filename=input('没法获取下载文件名,请自行输入:') print ("下载的文件为:"+str('%.2f' % (file_total/1024/1024))+"MB") print ("开始下载文件:"+filename) t1 = threading.Thread(target=file1.downfile,args=(filename,)) t1.start() file1.downprogress(filename)
源代码也上传到 http://down.51cto.com/data/2445550 命令行
此次是用Python类的形式来写代码,写的时候有点不太习惯,但是更改或者维护代码的时候,感受挺方便。
这代码只是在dos命令行下运行的,接下来的任务是使用tkinter增长GUI界面3d