DrissionPage/docs/使用方法/下载文件.md

5.7 KiB
Raw Blame History

selenium 缺乏对浏览器下载文件的有效管理,难以进行检测下载状态、重命名、失败管理。
使用 requests 下载文件能较好实现以上功能,但代码较为繁琐。
因此 DrissionPage 提供了高效可靠的下载工具,整合了两者优点,可从 selenium 获取登录信息,用 requests 进行下载。弥补了 selenium 的不足,使下载简洁高效。

?> 为了增强灵活性,该工具现在独立打包成一个库,叫 DownloadKit详细用法见DownloadKit

功能

  • 支持多线程同时下载多个文件
  • 自动管理下载列表,只要用add()方法添加任务,该工具会自动在多个线程中调度任务,无须等待
  • 支持 d 模式下用 requests 下载文件
  • 可指定下载路径,若路径不存在会自动创建文件夹
  • 重命名文件,可不填写扩展名,程序自动补充
  • 存在同名文件时,可选择重命名、覆盖、跳过等处理方式
  • 显示下载进度
  • 支持 post 方式
  • 支持自定义连接参数
  • 任务失败自动重试

单线程下载方式

MixPage对象的download属性是一个DownloadKit对象,为尽量与旧版兼容,该属性可直接调用。如page.download(url, path)
使用这个方式时效果与旧版一致,会阻塞程序直到任务结束,因此更加建议用后文讲述的多线程方法。

参数:

  • file_ur文件 url
  • goal_path存放路径填写到文件夹不填写文件名
  • rename重命名文件可不写扩展名不输入则用网络文件原名
  • file_exists若存在同名文件可选择'rename','overwrite','skip'方式处理,若选择重命名,会在文件名后面添加序号
  • post_datapost 方式的数据,这个参数不为None时自动转成 post 方式
  • show_msg是否显示下载信息和进度
  • retry重试次数与页面对象的设置一致默认 3 次
  • interval重试间隔时间与页面对象的设置一致默认 2 秒
  • **kwargs连接参数与 requests 的一致

返回:下载是否成功(bool)和状态信息(成功时信息为文件路径)的元组,跳过时第一位返回 None

from DrissionPage import MixPage

page = MixPage()
# 文件 url
url = 'https://www.baidu.com/img/flexible/logo/pc/result.png'  
# 存放路径
save_path = r'C:\download'  

# 重命名为img.png存在重名时自动在文件名末尾加上序号显示下载进度
res = page.download(url, save_path, 'img', 'rename', show_msg=True)
# 打印结果
print(res)

显示:

urlhttps://www.baidu.com/img/flexible/logo/pc/result.png
文件名img.png
目标路径C:\download
100% 下载完成 C:\download\img.png

(True, 'C:\\download\\img.png')

多线程下载方式

你可以往DownloadKit对象添加个数不限的下载任务,它会自动调配线程去完成这些任务。
当前默认为 10 个线程,以后的版本会增加修改线程数功能。

add()方法

参数:

  • file_ur文件 url
  • goal_path存放路径填写到文件夹不填写文件名
  • session可指定使用的Session对象,默认使用MixPage内置的Session对象
  • rename重命名文件可不写扩展名不输入则用网络文件原名
  • file_exists若存在同名文件可选择'rename','overwrite','skip'方式处理,若选择重命名,会在文件名后面添加序号
  • post_datapost 方式的数据,这个参数不为None时自动转成 post 方式
  • retry重试次数与页面对象的设置一致默认 3 次
  • interval重试间隔时间与页面对象的设置一致默认 2 秒
  • **kwargs连接参数与 requests 的一致

返回:任务对象,可通过任务对象查看任务状态和结果

from DrissionPage import MixPage

page = MixPage('s')
# 文件 url
url = 'https://www.baidu.com/img/flexible/logo/pc/result.png'  
# 存放路径
save_path = r'C:\download'  

# 返回一个任务对象
mission = page.download.add(url, save_path)

# 通过任务对象查看状态
print(mission.rate, mission.info)

输出:

90% '下载中'

show()方法

多线程方式不会实时显示下载进度,可用show()方法把下载进度打印出来。

!> 注意:
若使用 pyCharm 运行,须在运行配置里勾选“模拟输出控制台中的终端”才能正常显示输出。

参数:

  • asyn是否异步进行

返回None

url = 'https://example.com/file/abc.zip'
mission = page.download.add(url, r'.\files')
page.download.show()

输出:

等待任务数0
线程097.41% D:\files\abc.zip
线程1None None\None
线程2None None\None
.....

等待任务结束

有时须要等待任务结束,以便获取结果,可用wait()方法。 当传入任务时,等待该任务结束并返回结果,不传入参数时等待所有任务结束。

参数:

  • mission任务对象或任务id,为None时等待所有任务结束
  • show是否显示进度

返回:

  • 指定任务时,返回任务结果和信息组成的两位 tuple。True表示成功,False表示失败,None表示跳过。
  • 不指定任务时,返回None

!> 注意:
若使用 pyCharm 运行,须在运行配置里勾选“模拟输出控制台中的终端”才能正常显示输出。

url = 'https://www.baidu.com/img/PCfb_5bf082d29588c07f842ccde3f97243ea.png'
mission = page.download.add(url, save_path)
page.download.wait(mission)

输出:

urlhttps://www.baidu.com/img/PCfb_5bf082d29588c07f842ccde3f97243ea.png
文件名PCfb_5bf082d29588c07f842ccde3f97243ea_4.png
目标路径D:\files
100% 下载完成 D:\files\PCfb_5bf082d29588c07f842ccde3f97243ea_4.png