概述
前面我们已经大致了解了selenium的用法,DerssionPage同selenium一样,也是一个基于Python的网页自动化工具。
DrissionPage既可以实现网页的自动化操作,也能够实现收发数据包,也可以把两者的功能合二为一。
DressionPage的有点在于既可以兼顾selenium自动操作网页的便捷性,还不需要像selenium那样配置chromedriver,也不需要过一段时间更新chrome浏览器和chromedriver。同时DrissionPage可以同requests一样高效,不需要担心js逆向等问题。
简单的来说,DressionPage能够高效的实现所见即所爬,语法简洁优雅,代码量少,对新手友好。DrissionPage最大的优势在于它是最新新出的网页自动化测试工具,现阶段针对他的反爬虫措施几乎没有。
安装DrissionPage
和安装requests模块一样,在pycharm终端中输入如下的pip命令,在网络正常的情况下就可以正常使用该模块的相关功能。
pip install DrissionPage
如果想要升级到最新的版本,执行如下的命令:
pip install DrissionPage --upgrade
如果想要安装指定的版本,执行如下的命令:
pip install DrissionPage==4.0.0b17
我这里安装的是当前最行的版本,如下图所示:
入门指南
DrissionPage提供的功能放在如下的路径中:
from DrissionPage import * # 浏览器类、配置类、页面类
from DrissionPage.errors import * # 错误类
from DrissionPage.common import * # 辅助工具类
from DrissionPage.items import * # 衍生对象,用于类型判断
看到这里,相信大家也是很懵圈。不要着急,接下来慢慢分析,我也是第一次使用DrissionPage模块。
浏览器类
from DrissionPage import Chromium
Chromium是浏览器类,浏览器类主要用于连接浏览器,管理标签页及其他浏览器有关的操作。Chromium相当于总管,可以作为浏览器入口,使用它产生的Tab对象去操作每一个标签页。
页面类
from DrissionPage import ChromiumPage
(1)ChromiumPage是将浏览器对象和第一个标签页对象封装在一起,用于控制浏览器。ChromiumPage简化了操作,使用效果与直接使用Chromium对象基本一致。不同之处在于,ChromiumPage生成的标签页对象是ChromiumTab,不能切换模式。
from DrissionPage import WebPage
(2)WebPage与ChromiumPage类似,不同之处在于WebPage产生的Tab对象是可以切换模式的,即既可以控制浏览器,也可以收发数据包。
from DrissionPage import SessionPage
(3)SessionPage用于收发数据包,是对requests和lxml进行封装实现的。SessionPage将网络连接和结果解析封装成页面,操作逻辑和其他页面保持一致。
配置工具
from DrissionPage import ChromiumOptions
(1)ChromiumOptions类用于设置浏览器的启动参数,这些参数只有在启动浏览器有用,接管已经存在的浏览器是不起作用的。
from DrissionPage import SessionOptions
(2)SessionOptions类用于设置Session对象启动参数,用于配置Session Page或webPage的s模式的连接参数。
from DrissionPage.common import Settings
(3)Settings用全局的配置,如找不到元素是否抛出异常。
辅助工具
from DrissionPage.common import Keys
(1)Keys:按键类,用于键入 ctrl、alt 等按键。
from DrissionPage.common import By
(2)By:同selenium一样。
其他工具
wait_until
:可等待传入的方法结果为真make_session_ele
:从 html 文本生成ChromiumElement
对象configs_to_here
:把配置文件复制到当前路径get_blob
:获取指定的 blob 资源tree
:用于打印页面对象或元素对象结构from_selenium
:用于对接 selenium 代码from_playwright
:用于对接 playwright 代码
异常
from DrissionPage.errors import ElementNotFoundError
异常放在DrissionPage.errors
路径。
衍生对象
from DrissionPage.items import SessionElement
from DrissionPage.items import ChromiumElement
from DrissionPage.items import ShadowRoot
from DrissionPage.items import NoneElement
from DrissionPage.items import ChromiumTab
from DrissionPage.items import MixTab
from DrissionPage.items import ChromiumFrame
Tab、Element 等被其它对象生成的对象,开发过程中需要类型判断时需要导入这些类型。
设置语言
DrissionPage的报错信息及提示支持中文和英文,设置中文提示的方法如下:
from DrissionPage.common import SettingsSettings.set_language('zh_cn') # 设置为中文时,填入'zh_cn'Settings.set_language('en') # 默认是英文提示
准备工作
测试是否能够通过DrissionPage启动浏览器,我们这里采用的Chrome。对应的代码如下:
from DrissionPage import Chromiumtab = Chromium().latest_tab
tab.get('https://DrissionPage.cn')
在pycharm中运行上述代码,发现Chrome能够自动打开并且能够访问官网,说明我们的配置没有问题。
如果在程序运行的过程中报错,说明我们的Chrome路径设置有问题,
查找路径
(1)查找自身电脑中Chrome的路径,方法如下:
打开自己饿Chrome浏览器,在地址栏中输入chrome://version,回车。在加载中的页面中看“执行性文件”一栏,其后面就是我们需要的Chrome路径。
设置路径
设置路径的方法一:
设置路径的方法二:
设置的方法大家可以参考官网的教程,非常的方便,这里不再赘述
🌏 准备工作 | DrissionPage官网
操作浏览器
from DrissionPage import Chromium# 启动或接管浏览器,并创建标签页对象
tab = Chromium().latest_tab # 创建一个Chromium对象,用于连接浏览器,并用latest_tab获取一个标签页对象
# 跳转到登录页面
tab.get('https://gitee.com/login') # get()方法用于访问参数中的网址。它会等待页面完全加载,再继续执行后面的代码。默认是等待10秒
# 定位到账号文本框,获取文本框元素
ele = tab.ele('#user_login') # 通过html代码中的id的名字
# 输入对文本框输入账号
ele.input('1234567')
# 定位到密码文本框并输入密码
tab.ele('#user_password').input('1234567') # 通过链式操作直接输入对应的文本
# 点击登录按钮
tab.ele('@value=登 录').click() # 通过value值确定元素 @表示按属性名查找
基本概念
网页自动化的两种形式:
(1)直接服务器发送数据包,获取需要的数据;
(2)控制浏览器和网页进行交互。
基本使用逻辑如下:无论是控制浏览器还是收发数据,操作逻辑基本一致。
- 创建页面对象
- 从页面对象中获取元素对象
- 对元素对象读取或操作,实现数据获取和页面控制
最主要的对象有两种:页面对象和其生成的元素对象
主要对象
浏览器和标签页对象:
- Chromium:浏览器对象,用于连接浏览器,管理标签页以及其他浏览器有关的操作
- MixTab:浏览器标签页对象,由Chromium对象产生,一个对象控制一个实际的标签页
- ChromiumTab:也是标签页对象,由ChromiumPage对象产生,不可切换收发数据包模式
元素对象:
ChromiumElement
:浏览器元素对象SessionElement
:静态元素对象ChromiumFrame
:<iframe>
元素对象,兼有标签页对象和元素特性ShadowRoot
:shadow-root 元素对象
Page对象:
ChromiumPage
:能管理浏览器本身的标签页对象,可用作程序入口WebPage
:类似于ChromiumPage
,整合浏览器控制和收发数据包于一体的页面对象SessionPage
:单纯用于收发数据包的页面对象,可单独使用(不会启动新浏览器窗口)
称呼:
MixTab
、ChromiumTab
统称为 Tab 对象ChromiumPage
、WebPage
和SessionPage
统称为 Page 对象- Page 对象、Tab 对象和
ChromiumFrame
统称为页面对象
工作模式
MixTab和WebPage既可以控制浏览器对象,也可以用数据包的方式访问网络。通俗的讲前者就是如同selenium的工作模式,后者就是requests的工作模式,也就是前面所说的网页自动化的两种形式。
在DrissionPage中,者两种工作模式分为d模式和s模式,页面对象可以在这两种工作模式之间切换,但任一时间只能是一种工作模式。
d模式用于控制浏览器对象,不仅可以读取浏览器获取到的信息,还能对页面进行操作,如点击、填写、开关标签页、改变元素属性、执行 js 脚本等等。d 模式功能强大,但运行速度受浏览器制约非常缓慢,而且需要占用大量内存。
s模式基于数据包进行读取或发送,不能对页面进行操作,不能运行 js。爬取数据时,如网站数据包较为简单,应首选 s 模式。
模式切换
MixTab
和WebPage
对象可以在 d 模式和 s 模式之间切换,这通常用于以下情况:
- 当登录验证很严格,难以解构,如有验证码的时候,用浏览器处理登录,然后转换成 s 模式爬取数据。既避免了处理烧脑的 js,又能享受 s 模式的速度。
- 页面数据由 js 产生,且页面结构极其复杂,可以用 d 模式读取页面元素,然后把元素转成 s 模式的元素进行分析。可以极大地提高 d 模式的处理速度。
以上模式转换的思想非常重要。比如说一个网站需要requests携带cookie信息才可以请求到数据,倒是该网站的cookie获取非常困难(数据加密,或者验证码登录等),这时我们应该能够想到利用selenium完成网站的登录,获取cookie信息,然后再使用requests携带cookie信息完成数据请求。