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!")