DrissionPage自动化框架的使用
前言
有人说,自动化框架降低了逆向的成本,当遇到不会的逆向,我用自动化解决问题,这其实是有道理的,哈哈哈~。但是,自动化框架其实也不一定能解决所有问题,比如selenium自动化框架也有其局限性,比如某些网站使用selenium自动化是获取不到的,这个网站就是个例子。你们可以用selenium试一下,我前面的笔记有讲到selenium自动化框架的使用。所以,今天我们来记录一下新的自动化框架,DrissionPage。
DrissionPage的使用
DrissionPage是自动化工具,DrissionPage不同于selenium的区别在于,他不需要安装驱动,他是直接作用于浏览器,同样的可以直接对浏览器进行操作,还可以直接监听动态接口可以直接获取动态接口。
1、准备工具及初步了解
下载DrissionPage包
pip install DrissionPage
DrissionPage是我们国人自己写的自动化框架,所以window系统用起来可能比Mac系统好,目前支持的浏览器:Chromium 内核(如 Chrome 和 Edge)。如果遇到不会的问题,可以直接在官网找到开发者的邮箱,然后去联系他,即使我们都不认识,但是大佬看到有价值的问题也是会去想方法解决的。
DrissionPage访问模式有 3种,它们通常是程序的入口:
- ChromiumPage:单纯用于操作浏览器的页面对象;
- WebPage:整合浏览器控制和收发数据包于一体的页面对象;
- SessionPage:单纯用于收发数据包的页面对象(类似于requests发请求)
2、ChromiumPage的使用(操作浏览器)
访问页面
导入chromiumPage对象
from DrissionPage import chromiumPage
page = chromiumPage()
#这里其实类似于requests请求,这样就初步自动化打开一个网页了
page.get('https://www.baidu.com')
初始化配置
# 其他操作:
option = ChromiumOptions.set_browser_path(r'Chrome或者Edge浏览器的路径')
# 浏览器页面最大窗口化
option.set_argument('--start-maximized')
# 设置窗口初始大小
option.set_argument('--window-size', '600,800')
# 设置不加载图片,声音
option.no_imgs(True).mute(True)
# 无头浏览器,就是后台在运行,但是不显示浏览器页面,这里只支持window系统
option.headless()
page = ChromiumPage(addr_or_opts=option)
# 窗口最大最小
page.set.window.max()
page.set.window.mini()
page.set.window.size(800, 800)
# 修改网页的请求头
page.set.headers({"User-Agent": "1024"})
元素定位
页面对象和元素对象都拥有 ele()和 eles()方法,用于获取其内部指定子元素。
- ele():用于定位单个的页面元素。
- eles():用于定位一组页面元素,获取到的是一组列表。
- DrissionPage 有自己单独的一套匹配规则,学习成本较高,可以直接把Selenium的匹配方法平移过来使用,可以节省学习成本
from DrissionPage import ChromiumPage
from DrissionPage.common import By
import random
import time
page = ChromiumPage()
page.get('https://www.baidu.com')
page.set.window.max()
# time.sleep(random.randint(1000, 2000)/1000)
page.ele((By.NAME, 'wd')).input('python')
# time.sleep(random.randint(1000, 2000)/1000)
page.ele((By.ID, 'su')).click()
a_list = page.eles((By.XPATH, '//a'))
print(a_list)
for a in a_list:
title = a.text
href = a.attr('href')
print(title, href)
iFrame切换
DrissionPage不同于selenium,他是直接访问页面全部的元素,所以不用切换,还是找到iframe中的元素,定位获取操作即可
元素监听
当页面抓包获取动态数据的时候,DrissionPage可以拦截接口数据(selenium不行,需要等待动态渲染重新获取页面元素),所以DrissionPage还是很nice的。
from DrissionPage import ChromiumPage
from DrissionPage.common import By
page = ChromiumPage()
page.get('找个网站试试')
page.listen.start('接口的后缀,域名后面那一块')
# 获取监听的网址数据,返回的是一个迭代器,参数count是监听次数,默认是无数次
yie = page.listen.steps(count=10)
for pack in yie:
print(pack.response.body)
page.ele((By.CLASS_NAME, 'btn-next')).click()
动作链的简单使用
顾名思义,就是操作网页的一个标签进行移动。拖拽左边的标签移动到右边的标签,代码如下:
from DrissionPage import ChromiumPage
from DrissionPage.common import By
page = ChromiumPage()
page.get('https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
"""
先获取左边的标签,然后通过action中的hold和release抓取拖拽
到指定的标签释放
"""
source = page.ele((By.ID, 'draggable'))
target = page.ele((By.ID, 'droppable'))
page.actions.hold(source).release(target)
#往右移动多少像素
page,action,hold(source).right(300)
#然后再释放
page,action,hold(source).release()
3、SessionPage的使用(收发数据包)
不同于ChromePage,SessionPage是没有浏览器窗口的,直接进行抓包获取数据的,了解即可。
from DrissionPage import SessionPage
pack = SessionPage()
url = 'https://adworld.xctf.org.cn/api/event/release_event/list/?page=1&page_size=20&search=&isSearch=false&event_status=&event_type='
pack.get(url)
print(pack.response.json())
4、WebPage
WebPage主要整合了上面两者,实现了两者之间的互通。具体可以看官网。