Python 下载文件方法:click_download_file 函数
def click_download_file(self, urn, path):
'点击下载按钮,下载文件'
downloaded_files_success = list() # 下载成功的文件列表
downloaded_files_failed = list() # 下载失败的文件列表
links = self.browser.safe_get_link(By.CSS_SELECTOR, ATTACHMENT_VIEW_WINDOW_ELEMENT)
index = 0 # 下载链接索引
while index < len(links):
link = links[index]
# 获取文件名 文件大小
file_title, download_time_limit, file_size = self.file_title_data(link, urn)
self.browser.click_with_link(link)
self.download_alert() # 文件下载过大
logger.info(
'
>> 【urn = {}】文件名{}文件大小{},下载时间{}'.format(urn, file_title, file_size, download_time_limit))
time.sleep(download_time_limit) # 文件下载时间
# 文件下载
status = self.download_file_is_successfully(path, file_title, file_size)
if status:
downloaded_files_success.append(file_title) # 下载成功
index += 1 # 下载成功后继续下一个链接
else:
for i in range(3): # 下载失败 重试下载
self.browser.click_with_link(link)
self.download_alert() # 重试需要点击文件下载过大
time.sleep(download_time_limit)
status = self.download_file_is_successfully(path, file_title, file_size)
if status:
downloaded_files_success.append(file_title) # 重试成功
logger.info('
>> 【urn = {}】文件{}重试下载成功'.format(urn, file_title))
index += 1 # 重试成功后继续下一个链接
break
else:
logger.info('
>> 【urn = {}】文件{}重试下载失败'.format(urn, file_title))
downloaded_files_failed.append(file_title) # 下载失败
continue
if downloaded_files_failed:
logger.info('
>> 【urn = {}】下载失败文件列表:{}'.format(urn, downloaded_files_failed))
raise FileException(message=ErrorMsg.NO_DOWNLOADABLE_FILES, file_list=downloaded_files_failed)
if downloaded_files_success:
logger.info('
>> 【urn = {}】下载成功文件列表:{}'.format(urn, downloaded_files_success))
new_file_title = self.modify_file(path, urn, downloaded_files_success) # 下载成功修改文件名
return new_file_title
该函数使用 while 循环遍历下载链接,并针对每个链接进行下载操作。
函数功能:
- 获取所有下载链接
- 循环遍历每个链接
- 点击下载按钮
- 处理“文件下载过大”的提示
- 等待文件下载完成
- 验证文件是否下载成功
- 如果下载失败,尝试重试 3 次
- 记录下载成功和失败的文件
- 如果所有文件下载成功,修改文件名并返回新文件名
- 如果有文件下载失败,抛出异常
优化点:
- 使用
while循环遍历下载链接,避免使用for循环遍历后重新获取链接列表 - 添加
index变量,记录当前下载链接的索引,方便在下载成功或重试成功后继续下一个链接 - 优化代码结构,使代码更易于阅读和理解
原文地址: https://www.cveoy.top/t/topic/qhlC 著作权归作者所有。请勿转载和采集!