Python selenium模拟手动操作实现无人值守刷积分功能
作者:smart_num_1 发布时间:2021-07-30 23:54:08
标签:Python,selenium,刷积分
经常为学校的各种刷分而发愁,得知开学无望,日后还要刷课,索性自动化一次,学而不用乃愚昧 聪慧
四大模块
初始化
from selenium import webdriver
if __name__ == '__main__':
driver = webdriver.Chrome()
url = 'https://pc.xuexi.cn/points/login.html?ref=https://pc.xuexi.cn/points/my-points.html'
driver.get(url = url)
文章有效阅读积分 + 文章时长积分
def article():
driver.get(url='https://www.xuexi.cn/d05cad69216e688d304bb91ef3aac4c6/9a3668c13f6e303932b5e0e100fc248b.html')
# 该网址只是众文章阅读中的其中一个类别,还有很多类别的文章供阅读,只需更换链接即可
article_lis = WebDriverWait(driver,100).until(EC.presence_of_all_elements_located((By.XPATH,'//span[@style=white-space: nowrap;]')))
# 显示等待 WebDriverWait(driver,100).until() 在这里等待,直到满足条件或等待时间超过100,即 用xpath找到符合属性style = "white-space: nowrap;" 的span节点;
print('共找到%s篇文章' % len(article_lis))
article_num = 0
# article_num 每天有效阅读上限为6篇文章,但为确保有效时长达到12分钟,所以多出2篇
for data in article_lis: # 遍历找到的文章列表进行模拟阅读
if article_num >= 8: # 当读够8篇时跳出循环,结束文章刷分
break
try:
loading_page(data)
print('已加载', data.text)
# 输出已刷文章,从而得出进度
article_num += 1
except:
continue
def loading_page(element = None):
element.click()
ele = driver.find_element_by_xpath('//a[contains(class,"search-icon")]')
ele.send_keys(Keys.PAGE_DOWN)
# 模拟页面滚动。采用的方法是找到 ‘搜索' 功能按钮,不点击,直接模拟点击按键 PAGE_DOWN
time.sleep(120)
# 每个页面停留两分钟,至少30秒。经测试,每隔30s 将会提交一个post请求,只有请求过后,有效阅读数才会 +1
return None
视频有效观看积分 + 视频时长积分
driver.get(url = 'https://www.xuexi.cn/4426aa87b0b64ac671c96379a3a8bd26/db086044562a57b441c24f2af1c8e101.html#11c4o0tv7nb-5')
# 同上,该网址只是众视频观看中的其中一个类别,还有很多类别的视频供观看,只需更换链接即可
video_lis = WebDriverWait(driver,100).until(EC.presence_of_all_elements_located((By.XPATH,'//div[@style="margin: 0px auto;"]/div/div')))
# 同上,显示等待
print('共找到%s篇文章' % len(video_lis))
video_long = 0
# 记录已经播放的时间
video_lis_1 = []
for data in video_lis:
video_lis_1.append(data.get_attribute('data-link-target'))
# 与文章不同的地方是,文章阅读是模拟点击,而视频播放获取网址,放到video_lis_1 中
for url_1 in video_lis_1: # 遍历视频列表,播放视频
if video_long >= 1080: #视频时长为18分钟,即1080秒,在播放时间超过18分后结束播放,其实也根据分钟判断,我也不知道为什么当时就用上了秒
break
try:
video.get(url = url_1)
tim_now = loading_video(driver = driver)
video_long += tim_now*60
# loading_video 返回的是已阅读分钟数,故*60
print('视频播放中,已播放时长%s秒'%video_num)
except:
continue
def loading_video(driver = None):
elem_first = WebDriverWait(driver, 100).until(EC.presence_of_all_elements_located((By.XPATH, '//span[@class="duration"]')))
elem_start = driver.find_element_by_xpath('//div[@class="outter"]')
elem_start.click()
# 打开网页后不自动播放,应该是因为是直接打开网址的原因
# 因为在此之前我也直接通过模拟点击打开网页,结果是自动播放的,但有一点儿不符合我当时的需求,故改为打开网页的方式
tim_num = (int(elem_first[0].text[0])*10 + int(elem_first[0].text[1]))
# 目的是获取视频的总时间,只取分钟数
if tim_num != 0: # 因为有些视频它根本不到一分钟,故加判断条件
time.sleep(tim_num * 60)
return tim_num
else:
time.sleep(60)
# 不足一分钟,不播放也要凑够一分钟
return 1
每日答题积分
def DaTi():
driver.get(url = 'https://pc.xuexi.cn/points/exam-practice.html')
elem_juje = WebDriverWait(driver,100).until(EC.presence_of_element_located((By.XPATH,'//div[@class="q-header"]')))
juje = elem_juje.get_attribute('innerText')
# 在每日答题中,有三类题,判断题、选择题、填空题,所以先获取题的类别
# 注意 特别需要注意的是 By.XPATH 和 xpath 文本获取稍有却别,By.XPATH 获取文本方式为.get_attribute('innerText')
time.sleep(1) # 等待一秒,其实也无所谓,但是为防止过快操作造成电脑卡顿,还是等待一秒。
if '选' in juje:
elem_tishi = WebDriverWait(driver, 100).until(EC.presence_of_element_located((By.XPATH, '//span[@class="tips"]')))
elem_tishi.click()
# 在答题中,答案在查看提示中以红色标记,所以首先要模拟点击查看答案,使答案加载
time.sleep(0.5)
elem_answer = WebDriverWait(driver, 100).until(EC.presence_of_all_elements_located((By.XPATH, '//div[@class="line-feed"]/font')))
# 提取红色标记的文字,即答案
time.sleep(0.5)
# 同样没什么实际意义
ans_lis = []
for elem in elem_answer:
ans_lis.append(elem.get_attribute('innerText'))
# 因为选择题嘛,不一定就是单选题,所以要存放这些答案,以便于在选项中找答案
print('得到答案')
time.sleep(0.5)
# 同样没什么实际意义
elem_juje.click()
# 再次模拟点击的原因是 此时 查看提示 框还处于打开状态,如果不关闭,会影响提交答案的操作
# 模拟点击网页,关闭 查看提示 框
time.sleep(0.5)
elem_xuanxiang = WebDriverWait(driver, 100).until(EC.presence_of_all_elements_located((By.XPATH, '//div[@class="question"]/div[@class="q-answers"]/div[contains(@class,"q-answer")]')))
# 获取所有的选项节点
for elem in elem_xuanxiang:
data = elem.get_attribute('innerText')[3:].replace('-','')
print(data)
for i in ans_lis:
if i in data:
elem.click()
ans_lis.remove(i)
# 根据依次A -- > D 遍历答案,将两者对照进行选择与否,所以满足要求后去除该答案
# 防止对选项多次点击造成取消选择或其他错误
time.sleep(0.5) #防止过快操作,每次选择后等待0.5秒
break
elem_next = WebDriverWait(driver, 100).until(EC.presence_of_element_located((By.XPATH,'//div[@class="action-row"]/button')))
elem_next.click()
# 模拟点击确定按钮跳转下一题
DaTi(driver)
elif '填' in juje:
elem_tishi = WebDriverWait(driver,100).until(EC.presence_of_element_located((By.XPATH,'//span[@class="tips"]')))
elem_tishi.click()
time.sleep(0.5)
elem_answer = WebDriverWait(driver,100).until(EC.presence_of_element_located((By.XPATH,'//div[@class="line-feed"]')))
time.sleep(0.5)
if '请观看视频' in elem_answer.get_attribute('innerText'):
input('手动选择答案后无需点击确定,在此输入回车继续')
elem_next = WebDriverWait(driver, 100).until(EC.presence_of_element_located((By.XPATH, '//div[@class="action-row"]/button')))
elem_next.click()
# 在填空题中会有观看视频的题目,而且查看提示中会写‘请观看视频'而不会直接给出答案,所以要人工选择
elem_answer = WebDriverWait(driver,100).until(EC.presence_of_all_elements_located((By.XPATH,'//div[@class="line-feed"]/font')))
answer = []
time.sleep(0.5)
for elem in elem_answer:
answer.append(elem.get_attribute('innerText'))
# 同样填空题中也有多个空的情况,所以将答案放在列表里
time.sleep(1)
elem_data = WebDriverWait(driver,100).until(EC.presence_of_all_elements_located((By.XPATH,'//input[@class="blank"]')))
# 找到每个空
for i in range(len(answer)):
elem_data[i].send_keys(answer[i])
time.sleep(0.5)
# 通过遍历空,将对应的答案写入
elem_data[0].click()
time.sleep(1)
# 模拟点击网页,因为在写完空后,不点击网页会有确定按钮为不可点的情况
elem_next = WebDriverWait(driver,100).until(EC.presence_of_element_located((By.XPATH,'//div[@class="action-row"]/button')))
elem_next.click()
DaTi(driver)
elif '判' in juje:# 同上,判断题不会直接给出答案,所以只能手动吧
input('手动选择答案后无需点击确定,在此输入回车继续')
elem_next = WebDriverWait(driver, 100).until(EC.presence_of_element_located((By.XPATH, '//div[@class="action-row"]/button')))
elem_next.click()
DaTi(driver)
结合PyQt5,最终效果图
声明:图片没有别的意思,个人感觉很欢喜,图片转自------百度图片
来源:https://blog.csdn.net/smart_num_1/article/details/106075929


猜你喜欢
- 乱码原因:源码文件的编码格式为utf-8,但是window的本地默认编码是gbk,所以在控制台直接打印utf-8的字符串当然是乱码了!解决方
- spines 模块详解matplotlib 设计了一个 spines模块,用于在创建 axes 时生成 Spine对象(坐标轴线)。spin
- 1. 想学asyncio,得先了解协程携程的意义:计算型的操作,利用协程来回切换执行,没有任何意义,来回切换并保存状
- 查看系统帮助help contentsmysql> help contents;You asked for help about he
- —1—如果你对本文的代码感兴趣,可以去 Github (文末提供)里查看。第一次运行的时候会报一个错误(还没找到解决办法),不过只要再运行一
- 本文实例为大家分享了Python实现图片格式转换的具体代码,供大家参考,具体内容如下碰上这样一个情景:我从网络上下载了一张表情包图片,存放在
- 定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。触发器是一个特殊的存储过程。
- 在一个Web App中,所有数据,包括用户信息、发布的日志、评论等,都存储在数据库中。在awesome-python-app中,我们选择My
- 我们通常情况下要统计数据库的连接数指的是统计总数,没有细分到每个IP上。现在要监控每个IP的连接数,实现方式如下:方法一:select SU
- 网站设计似乎朝着越来越复杂的方向发展。这部分源于显示器的逐步增大,随着宽屏显示器的增多,更有加剧网站页面复杂程度的趋势。但是我接触网站设计近
- 前言:python多进程,经常在使用,却没有怎么系统的学习过,官网上面讲得比较细,结合自己的学习,整理记录下官网:https://docs.
- 一、概述OLAP的系统(即Online Aanalyse Process)一般用于系统决策使用。通常和数据仓库、数据分析、数据挖掘等概念联系
- 今天在公司,经理让做一个滚动字幕。但是,不许生成gif图片。所以上网找了GIFEncoder这个类库。确实很好用,但是,应用过程中也出现了一
- python数组进行降维在深度学习训练过程中,我们有时候想要输出图片看看图片长什么样,但是训练时的图片格式一般都会多出一个批次的维度,如[1
- 前言 Tensorflow中可以使用tensorboard这个强大的工具对计算图、loss、网络参数等进行可视化。本文并不涉及对tensor
- 上周在去杭州betacafe的路上,有幸和绿人网梁宁和饭统网李耀东、千鸟一道,在出租车上聊起了地理和历史,其中有一个共同的观点是说,人们对事
- Oracle数据文件默认大小上限是32G,如果要数据文件大于32G,需要在数据库创建之初就设置好。表空间数据文件容量与DB_BLOCK_SI
- 1. 监测端口我们要引用的socket模块来校验端口是否被占用。1.1 socket是什么?简单一句话:网络上的两个程序通过一个双向的通信连
- 现在流行的静态博客/网站生成工具有很多,比如 Jekyll, Pelican, Middleman, Hyde 等等,StaticGen 列
- 自相关图是一个平面二维坐标悬垂线图。横坐标表示延迟阶数,纵坐标表示自相关系数偏自相关图跟自相关图类似, 横坐标表示延迟阶数,纵坐标表示偏自相