DrissionPage/docs/使用方法/下载文件.md
2022-01-30 12:51:36 +08:00

218 lines
6.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

selenium 缺乏对浏览器下载文件的有效管理,难以进行检测下载状态、重命名、失败管理。
使用 requests 下载文件能较好实现以上功能,但代码较为繁琐。
因此 DrissionPage 提供了高效可靠的下载工具,整合了两者优点,可从 selenium 获取登录信息,用 requests 进行下载。弥补了 selenium 的不足,使下载简洁高效。
?> 为了增强灵活性,该工具现在独立打包成一个库,叫 DownloadKit详细用法见[DownloadKit](https://gitee.com/g1879/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
```python
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)
```
显示:
```shell
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 的一致
返回:任务对象,可通过任务对象查看任务状态和结果
```python
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)
```
输出:
```shell
90% '下载中'
```
## 实时查看所有线程进度
多线程方式不会实时显示下载进度,可用`show()`方法把下载进度打印出来。
!> **注意:** <br> 若使用 pyCharm 运行,须在运行配置里勾选“模拟输出控制台中的终端”才能正常显示输出。
参数:
- asyn是否异步进行
返回None
```python
url = 'https://example.com/file/abc.zip'
mission = page.download.add(url, r'.\files')
page.download.show()
```
输出:
```shell
等待任务数0
线程097.41% D:\files\abc.zip
线程1空闲
线程2空闲
.....
```
## 等待任务结束
有时须要等待任务结束,以便获取结果,可用`wait()`方法。 当传入任务时,等待该任务结束并返回结果。不传入参数时等待所有任务结束,与`show()`方法一致。
参数:
- mission任务对象或任务`id`,为`None`时等待所有任务结束
- show是否显示进度
返回:
- 指定任务时,返回任务结果和信息组成的两位 tuple。`True`表示成功,`False`表示失败,`None`表示跳过。
- 不指定任务时,返回`None`
!> **注意:** <br> 若使用 pyCharm 运行,须在运行配置里勾选“模拟输出控制台中的终端”才能正常显示输出。
```python
url = 'https://www.baidu.com/img/PCfb_5bf082d29588c07f842ccde3f97243ea.png'
mission = page.download.add(url, save_path)
page.download.wait(mission)
```
输出:
```shell
urlhttps://www.baidu.com/img/PCfb_5bf082d29588c07f842ccde3f97243ea.png
文件名PCfb_5bf082d29588c07f842ccde3f97243ea_4.png
目标路径D:\files
100% 下载完成 D:\files\PCfb_5bf082d29588c07f842ccde3f97243ea_4.png
```
## 获取某个任务结果
`add()`方法返回的`Mission`对象,可查看该任务执行情况。
`Mission`对象属性:
- id任务 id
- file_name要保存的文件名
- path要保存的路径
- data任务数据
- state任务状态`'waiting'``'running'``'done'`三种
- rate任务进度以百分比显示
- info任务信息成功会返回文件绝对路径失败会显示原因
- result任务结果`True`表示成功,`False`表示失败,`None`表示跳过
```python
mission = page.download.add(url)
print(mission.state)
```
输出:
```python
running
```
## 下载设置
可使用以下属性进行配置:
```python
# 设置线程数,只能在没有任务在运行的时候进行
page.download.size = 20
# 设置保存路径,设置后每个任务会使用这个路径,也可添加任务时单独设置
page.download.goal_path = r'D:\tmp'
# 设置重试次数初始为3
page.download.retry = 5
# 设置失败重试间隔初始为5
page.download.interval = 2
# 设置存在文件名冲突时的处理方式,可选 'skip', 'overwrite', 'rename'
page.download.file_exists = 'skip'
```