Python3 多线程下载代码(2)

def Sec2Time(second):                        #将秒数转换为标准时间格式。以为有现成的函数,结果愣是没找到
    day=second//(3600*24)
    second-=day*3600*24
    hour=second//3600
    second -=hour*3600
    minute=second//60
    second-=minute*60
    if day == 0:
        if hour == 0:
            if minute == 0:
                return '{:0.2f}S.'.format(second)
            else:
                return '{:02}M:{:0.2f}S'.format(minute,second)
        else:
            return '{:02}H:{:02}M:{:0.2f}S'.format(hour,minute,second)
    else:
        return '{:03}D:{:02}H:{:02}M:{:0.2f}S'.format(day,hour,minute,second)

def GetUrlOpener(proxies={}):        #分析代理参数,返回url opener。完整代理格式:user/passwd@:8087。如格式不同,需要修改此分析函数
    if proxies:
        try:
            ap=proxies.split('@')
            if len(ap) > 1:
                auth=ap[0]
                addr=ap[1]
            else:
                addr=ap[0]
                auth=''
            if '://' in addr:
                ptype=addr[:addr.find('://')]
                phost=addr[addr.find('://')+3:]
            else:
                ptype='http'
                phost=addr
            proxy={ptype:ptype+'://'+phost}
            proxy_handler = urllib.request.ProxyHandler(proxy)
        except Exception as ex:
            print(ex)
            return urllib.request.build_opener()
        try:
            authlist=auth.split('/')
            if len(authlist) > 1:
                user=authlist[0]
                passwd=authlist[1]
                proxy_auth_handler = urllib.request.ProxyBasicAuthHandler()
                proxy_auth_handler.add_password('realm',phost,user,passwd)
                opener = urllib.request.build_opener(proxy_handler,proxy_auth_handler)
            else:
                opener = urllib.request.build_opener(proxy_handler)
            return opener
        except Exception as ex:
            print(ex)
            return urllib.request.build_opener(proxy_handler)
    else:
      # urlHandler=urllib.request.urlopen(url)
        return urllib.request.build_opener()

def GetUrlFileInfo(url,proxies={}):            #获取要下载的文件的信息,包括文件名,文件类型和文件大小
    scheme, netloc, path, query, fragment = urllib.parse.urlsplit(url)    #分析url
    filename=urllib.parse.unquote(path)      #如果url中的文件名部分存在中文,将其正确解码出来
    filename=filename.split('/')[-1]
    opener=GetUrlOpener(proxies)          #通过网络请求读取响应头部,根据头部获取文件信息。文件名以服务器返回的文件名信息为准
    urlHandler=opener.open(url)
    headers=urlHandler.info()
    if 'Content-Disposition' in headers:      #Content-Disposition字段有可能获取到文件名,不过可能是乱码,没找到解决办法</span>
        disposition=headers.get('Content-Disposition')
        if 'filename=' in disposition:
            filename = disposition.split('filename=')[1]
            if filename[0] == '"' or filename[0] == "'":
                filename = filename[1:-1]
    filename=urllib.parse.unquote(filename)
    if filename:
        (name,ext)=os.path.splitext(filename)
    else:
        (name,ext)=('Unknown','')
    if 'Content-Length' in headers:          #获取文件长度,如果获取失败,则只能使用单线程下载
        length=int(headers.get('Content-Length'))
    else:
        length=-1           
    (type, kind)=headers.get('Content-Type').split('/') #获取文件类型,备用
    infos=[(name,ext),(type,kind),length]
    return infos

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/c95006b696c4660aeccfac93cfed50c6.html