💥 4.0 功能介绍
3.x 是自主研发底层的初步尝试,很多地方摸着石头过河,存在一些不太成熟的地方。
经过一段时间的使用,积累一些经验之后,4.0 在 3.x 的基础上对底层进行了大幅重构,新增大量功能,改善运行效率和稳定性,优化项目结构,解决很多存在的问题。对比旧版本有质的提高。
但同时不少 api 发生了变化,不能完全兼容旧版本。
api 的变化有些是功能优化必需的改变,有些则是本人对命名简洁的执念,趁着大版本的更新顺便把长期不太满意的命名给改了。
给使用者造成一定不便感到抱歉,但长痛不如短痛,趁着项目用的人不多,干脆舍弃历史包袱果断改掉。
有些原来的写法在 4.0.0 中还能正常使用,但 IDE 会提示无效,将在以后的版本中完全删除。推荐尽快更新为新写法。
本节仅简述功能变化,具体使用方法详见各对应章节。
✅️ 新的抓包功能
3.2 中,抓包功能主要由 FlowViewer 和wait.data_packets()
提供。
FlowViewer 是本人的一个练手作品,写得比较随意,技术也还没到家。存在漏抓、信息不全、api 不够合理的问题。
4.0 中,每个页面对象都内置了监听器,能力全面升级,api 也更合理。
📌 旧 api 变化
- 弃用 FlowViewer,以后也不会再升级
- 删除
wait.set_targets()
- 删除
wait.stop_listening()
方法 - 删除
wait.data_packets()
方法 DrissionPage.common
路径删除FlowViewer
📌 新 api
- 每个标签页对象(包括
ChromiumFrame
)新增listen
属性,内置监听功能 - 用
listen.start()
和listen.stop()
启动和停止监听 - 用
listen.wait()
阻塞等待数据包 - 用
listen.steps()
同步获取监听结果 - 增加
listen.wait_silent()
等待所有请求完成(包含 targets 以外的) - 监听结果结构优化,request 和 response 数据分开存放
📌 示例
下面示例可直接运行查看结果。这个示例会计时,用于与下个示例对比。
from DrissionPage import ChromiumPage
from TimePinner import Pinner
from pprint import pprint
page = ChromiumPage()
page.listen.start('api/getkeydata') # 指定监听目标并启动监听
pinner = Pinner(True, False)
page.get('http://www.hao123.com/') # 访问网站
packet = page.listen.wait() # 等待数据包
pprint(packet.response.body) # 打印数据包正文
pinner.pin('用时', True)
输出:
{'hao123.new.shishi.bangdan.recom': [{'index': '1',
'pure_title': '以色列和哈马斯移交首批被扣押人员'},
{'index': '2',
'pure_title': '听到免签政策法国外长笑了'},
......
用时:3.3114853000151925
✅️ 新的页面访问逻辑
3.x 中存连接存在以下主要问题:
- 浏览器页面对象
get()
方法的timeout
参数只对加载阶段生效,无法覆盖连接阶段; - 加载策略
none
模式没有实际用处。
这两个问题都在 4.0 中解决,且能够让用户自主控制终止连接的时机。 另外还对连接逻辑进行了优化,避免卡死情况出现。
📌 api 变化
- 页面对象
page_load_strategy
属性改名为load_mode
set.load_strategy
改为set.load_mode
📌 行为变化
get()
方法的timeout
参数现在可覆盖整个过程timeout
参数对非get()
方法触发的加载(如点击链接)也能生效SessionPage
和WebPage
的 s 模式,如收到空数据,也会重试SessionPage
的get()
方法可以指向本地文件
📌 新的none
加载模式
旧版中,none
加载策略是当页面连接成功就立刻停止加载,这在实际使用时没有什么意义。
新版中,这个模式改成:除非 加载完成,否则程序不会主动将其停止(即使已超时),同时连接状态不再阻塞程序,而允许用户进行状态判断,主动停止加载。
这样提供给用户非常大的自由度,可等到关键数据包或元素出现就主动停止页面加载,大幅提升执行效率。
📌 示例
我们继续使用上一个示例的代码,但把加载模式设为none
,且获取到数据时主动停止加载。
from DrissionPage import ChromiumPage
from TimePinner import Pinner
from pprint import pprint
page = ChromiumPage()
page.set.load_mode.none() # 设置加载模式为none
page.listen.start('api/getkeydata') # 指定监听目标并启动监听
pinner = Pinner(True, False)
page.get('http://www.hao123.com/') # 访问网站
packet = page.listen.wait() # 等待数据包
page.stop_loading() # 主动停止加载
pprint(packet.response.body) # 打印数据包正文
pinner.pin('用时', True)
输出:
{'hao123.new.shishi.bangdan.recom': [{'index': '1',
'pure_title': '以色列和哈马斯移交首批被扣押人员'},
{'index': '2',
'pure_title': '听到免签政策法国外长笑了'},
......
用时:1.2575092000188306
可见节省了2秒时间 。 当网站要访问一些不稳定资源时,节省的时间相当客观,也能提高程序的稳定性。
✅️ 新的下载管理功能
在旧版中,下载管理功能存在以下问题:
- 浏览器下载管理和内置下载器
DownloadKit
的配置都使用download_set
属性进行设置,容易造成混淆。 - 浏览器下载任务不能在下载前指定文件名
- 该功能有随着浏览器版本更新失效的风险
4.0 对浏览器下载管理功能进行了完完全全的重构,结构更为合理,功能更多。 同时,内置下载器的设置和浏览器下载任务设置进行了分离。
📌 api 变化
- 页面对象删除
download_set
属性 - 增加
set.download_path()
方法 - 增加
set.download_file_name()
方法
📌 新增功能
- Tab 对象和 Frame 对象也支持
download()
方法 - 每个 Tab 对象可单独设置下载路径和重命名文件名
- 可拦截浏览器下载任务并获取其信息
- 可取消浏览器下载任务、获取下载进度、等待任务完成
- 可设置遇到文件夹已存在时的处理方式