作品分享

学习了一周python,写个文件下载器实践一下,技术含量不高,主要是用作练习

效果展示

1.png
2.png

只能接受格式正常的链接,暂时就这样了吧,如果之后遇到了相关需求可能会回来改进

源代码展示


import os
import urllib
import requests
import time

class DLer:  #Downloader下载器
    DL_route = r'Download/'#下载的文件存放路径
    file_type = None #下载的文件类型
    
    def __init__(self):
        if not os.path.exists(self.DL_route):  #检查下载路径是否存在,不存在则生成
            os.makedirs(self.DL_route)
            
    def __url_check(self):  #网址格式检查
        try:
            web = requests.get(self.url, timeout=3.0) #发送请求检测链接是否正常
            if web.status_code == 200:
                return True
            else:
                return False
        except:
            return False
    
    def __type_handling(self):#处理文件种类(后缀)
        url_len = len(self.url)
        flag = 0
        for x in range(0,url_len):
            if self.url[url_len-1-x] == '.':#逆序检查url,找出能区分后缀的“.”
                flag = url_len-1 - x
                self.file_type = self.url[int(flag):]
                break
            elif self.url[url_len-1-x] == r'/':#如果找到‘/’,文件类型置空
                self.file_type = ''
                break;
            
    def __file_handling(self): #处理文件
        r = requests.get(self.url)
        cnt = 0
        while(True):
            if os.path.exists(self.DL_route + str(cnt) + str(self.file_type)):#给下载文件以数字命名
                cnt += 1
            else:
                break
        with open(self.DL_route + str(cnt) + str(self.file_type),'wb') as f:#以二进制写入
            f.write(r.content)

    def download(self,url):
        self.url = str(url)
        if self.__url_check():
            print('开始下载...')
            self.__type_handling()
            self.__file_handling()
            return True
        else:
            return False

    
a = DLer()#创建一个下载器a
DL_url = input('请输入下载链接:')
tick1 = time.time()
if a.download(DL_url):
    tick2 = time.time()
    print('下载完成,共耗时'+str(round(tick2-tick1,3))+'秒')
    print ('下载的文件已存放在'+str(os.getcwd())+r'/'+a.DL_route)
else:
    print('下载失败,请检查您的网络状况或检查链接是否正确')

源代码下载

下载器.zip

This is just a placeholder img.