DrissionPage官网简介
官网地址:https://drissionpage.cn/
官网里面也有一些简单的案例分析,有兴趣的也可以自行体会着用
image.png (25.55 KB, 下载次数: 0)
下载附件
2024-6-21 10:38 上传
用DrissionPage的缘由
之前书写过一篇智慧职教教师自动批作业一些相关python代码示例以及简单的分析做参考
这个文章,我用的是
[color=]selenium,request这两个库为主
实际上我不太会分析加解密,所以一般用模拟浏览器登录的比较多
但是用下来发现前面提到的两个库极其的繁琐以及不太好用,直到有位热心人
[color=]@HalaTest
在评论区跟我说了一声试试看用
DrissionPage后,发现还有这个好玩的东西后,效率逐渐提升了很多
案例介绍
此次的案例的话,主要是模拟输入账号密码自动登录,不涉及到相关的加解密,主要是围绕着数据包以及浏览器界面的元素定位分析
在自动登录完成后进入”阅读“章节,进行模拟性质的挂机刷阅读分(后续写一篇新的贴子介绍)
正文
模拟登录分析
登录地址:学习通登陆地址
image.png (74.16 KB, 下载次数: 0)
下载附件
2024-6-21 10:51 上传
在登录地址页面的话,直接分析【账号】【密码】【登录】按钮
接下来打开浏览器的F12
先定位到【账号】
image.png (164.15 KB, 下载次数: 0)
下载附件
2024-6-21 10:53 上传
分析后可以发现元素内容如下
[HTML] 纯文本查看 复制代码
其中账号里面有一个
[color=]id="phone"
后续会用得到,这里记录一下
定位到【密码】
image.png (169.76 KB, 下载次数: 0)
下载附件
2024-6-21 10:56 上传
分析后可以发现元素内容如下
[HTML] 纯文本查看 复制代码
其中账号里面有一个
[color=]id="pwd"
后续会用得到,这里记录一下
定位到【登录】
image.png (163.97 KB, 下载次数: 0)
下载附件
2024-6-21 10:58 上传
分析后可以发现元素内容如下
[HTML] 纯文本查看 复制代码登录
其中账号里面有一个
[color=]id="loginBtn"
后续会用得到,这里记录一下
我们在获取到了必要的信息后,就可以直接模拟登录了,不需要考虑其他的
下面开始奉上代码
[Python] 纯文本查看 复制代码
from DrissionPage import WebPage,ChromiumOptions
# 创建配置对象
co = ChromiumOptions()
#匿名模式
co.incognito()
page = WebPage(chromium_options = co)
page.change_mode('d')
uname = str(input("请输入你的账号:"))
pwd = str(input("请输入你的密码:"))
#登录部分
login_url = "https://passport2.chaoxing.com/login?fid=&newversion=true&refer=https%3A%2F%2Fi.chaoxing.com"
page.get(login_url)
page.ele('#phone').input(uname)
page.ele('#pwd').input(pwd)
page.ele('#loginBtn').click()
page.listen.start("i.chaoxing.com/base")#自动监听地址为:i.chaoxing.com/base的数据包
#点击课程按钮
page.ele('@name=课程').click()
简单解释一下
[Python] 纯文本查看 复制代码
# 创建配置对象
co = ChromiumOptions()
#匿名模式
co.incognito()
page = WebPage(chromium_options = co)
page.change_mode('d')
这一串代码的话主要是
[color=]创建了一个无痕迹访问的浏览器
这样子便于后面不断测试的过程中不会因为第一次已登录而保留cookies等信息,确保
[color=]运行完成后清除掉登录缓存数据
具体配置相关信息可以在官网进行搜索,这里就不赘述了
下面这部分代码的话则是更好理解了
其中DrissionPage里面有个功能强大且简便的地方就在于查找元素方法
[color=]ele()
它支持多种方式查找可以参考下图,我这里用了
[color=]page.ele('#phone')
此类方法就是通过id查找对应的位置
不只是通过
[color=]id
,他还能根据
[color=]class,css,以及元素内包裹的文本元素进行查找,
详情可以翻阅一下官网文档,后续也会用到部分功能
image.png (161.53 KB, 下载次数: 0)
下载附件
2024-6-21 14:00 上传
[Python] 纯文本查看 复制代码
uname = str(input("请输入你的账号:"))
pwd = str(input("请输入你的密码:"))
#登录部分
login_url = "https://passport2.chaoxing.com/login?fid=&newversion=true&refer=https%3A%2F%2Fi.chaoxing.com"
page.get(login_url)
page.ele('#phone').input(uname)
page.ele('#pwd').input(pwd)
page.ele('#loginBtn').click()
page.listen.start("i.chaoxing.com/base")#自动监听地址为:i.chaoxing.com/base的数据包
#点击课程按钮
page.ele('@name=课程').click()
上面的程序还有一段
[color=]page.listen.start("i.chaoxing.com/base")
这个,就如注释的意思一样
他会自动监听数据包对应的地址,而这个地址的话,则是后面我们提取数据包里面的
[color=]UID
所需要用到的
提取课程
承接上面最后一行代码,登陆完成后点击了课程按钮,进入到了课程页面
检查元素可以看到,课程界面
[color=]id为courseList
,这样的话,我们可以通过
[color=]ele
进行
[color=]id
定位,再利用
[color=]children()
方法将该元素下的内容全部提取出来传递给
[color=]courseList
image.png (392.99 KB, 下载次数: 0)
下载附件
2024-6-21 14:16 上传
而UID方面,则是利用前面设置的数据包监听,通过page.listen.wait方法进行获取数据包,由于该数据包存在于cookies内,我就通过res.request.cookies的方式进行提取
image.png (32.15 KB, 下载次数: 0)
下载附件
2024-6-21 14:22 上传
image.png (425.32 KB, 下载次数: 0)
下载附件
2024-6-21 14:21 上传
[Python] 纯文本查看 复制代码
#提取课程
courseList = page.ele('#courseList').children()
#获取UID
res = page.listen.wait(timeout = 10)
cookie_s = res.request.cookies
for i in cookie_s:
if i['name'] == "UID":
uid = i['value']
#获取必要的后续可能用得到的参数
courseids = []
clazzids = []
personids = []
c_ids = []
c_names = []
for i in courseList:
courseids.append(i.attrs["courseid"])
clazzids.append(i.attrs["clazzid"])
personids.append(i.attrs["personid"])
c_ids.append("course_" + i.attrs["courseid"] + "_" + i.attrs["clazzid"])
t = i.ele("tag:span@class=course-name overHidden2")
c_names.append(t.attrs['title'])
print("**********获取到如下课程**********")
for i in c_names:
print(f"第{x+1}个课程:{i}")
x = x + 1
choose = int(input("请选择你要刷第几个课程:"))
可能会有疑惑
[color=]i.attrs
方法,这其实是直接提取了元素里面的属性值,毕竟加载完后,属性值都在元素里面了,这一点我觉得就是这个包好用的地方(主要是用多少其他包,也可能能有更好的包)
image.png (451.85 KB, 下载次数: 0)
下载附件
2024-6-21 14:27 上传
至此我们其实就已经提取完成了所有的课程至不同的变量里面,以及已经获取了必要的参数了
从登录到获取参数,没有涉及到加解密问题,只对网页页面以及数据包进行了简单的分析
奉上完整的部分源代码
[Python] 纯文本查看 复制代码from DrissionPage import WebPage,ChromiumOptions
# 创建配置对象(默认从 ini 文件中读取配置)
uid = ""
co = ChromiumOptions()
#匿名模式
co.incognito()
page = WebPage(chromium_options = co)
page.change_mode('d')
uname = str(input("请输入你的账号:"))
pwd = str(input("请输入你的密码:"))
#登录部分
login_url = "https://passport2.chaoxing.com/login?fid=&newversion=true&refer=https%3A%2F%2Fi.chaoxing.com"
page.get(login_url)
page.ele('#phone').input(uname)
page.ele('#pwd').input(pwd)
page.ele('#loginBtn').click()
page.listen.start("i.chaoxing.com/base")
#点击课程按钮
page.ele('@name=课程').click()
#提取课程
courseList = page.ele('#courseList').children()
#获取UID
res = page.listen.wait(timeout = 10)
cookie_s = res.request.cookies
for i in cookie_s:
if i['name'] == "UID":
uid = i['value']
#获取必要的后续可能用得到的参数
courseids = []
clazzids = []
personids = []
c_ids = []
c_names = []
for i in courseList:
courseids.append(i.attrs["courseid"])
clazzids.append(i.attrs["clazzid"])
personids.append(i.attrs["personid"])
c_ids.append("course_" + i.attrs["courseid"] + "_" + i.attrs["clazzid"])
t = i.ele("tag:span@class=course-name overHidden2")
c_names.append(t.attrs['title'])
print("**********获取到如下课程**********")
for i in c_names:
print(f"第{x+1}个课程:{i}")
x = x + 1
choose = int(input("请选择你要刷第几个课程:"))