retreive()被认为是个老旧函数,可能会在将来抛弃。
urllib.request.urlretrieve(url, filename=None, reporthook=None, data=None)
Exceptions和函数urlopen()相同。
具体文档,参见https://docs.python.org/3/library/urllib.request.html#module-urllib.request

代码片段

from urllib.request import urlretrieve
import socket
import os
import sys

def  reporthook(blocknum, bs, size):
    #  blocknum:已经下载的数据块       bs:数据块的大小      size:远程文件的大小
    per = 100.0 * blocknum * bs / size
    if per > 100 :
        per = 100
    sys.stdout.write('Download progress: %.2f%%  \r'%per)
    sys.stdout.flush()
class ClassName():
    def __init__(self):
        socket.setdefaulttimeout(30)

        def run(self):
               ...
           while True:
                .....
                try:
                    urlretrieve(url,localfile, reporthook= reporthook) 
                except socket.timeout:
                    self.redownload(url,localfile) 
                except Exception as e:
                    StatusCode=e.getcode()
                    if StatusCode == 404:
                        print(e)
                        break
                    self.redownload(url,localfile)

    def redownload(self,url,localfile):
        count = 1
        while count <= 5:
            try:
                urlretrieve(url,localfile, reporthook= reporthook)                                                
                break
            except socket.timeout:
                err_info = 'Reloading for %d time.....'%count if count == 1 else 'Reloading for %d times.....'%count
                print(err_info)
                count += 1
        if count > 5:
            print("download job failed!")