Python selenium模拟手动操作实现无人值守刷积分功能


Posted in Python onMay 13, 2020

经常为学校的各种刷分而发愁,得知开学无望,日后还要刷课,索性自动化一次,学而不用乃愚昧 聪慧

四大模块

初始化

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,最终效果图

声明:图片没有别的意思,个人感觉很欢喜,图片转自------百度图片

Python selenium模拟手动操作实现无人值守刷积分功能

总结

到此这篇关于Python selenium模拟手动操作实现无人值守刷积分功能的文章就介绍到这了,更多相关Python selenium刷积分内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python3.2中的字符串函数学习总结
Apr 23 Python
基于asyncio 异步协程框架实现收集B站直播弹幕
Sep 11 Python
详解python中的json的基本使用方法
Dec 21 Python
Python3实现的简单验证码识别功能示例
May 02 Python
教你利用Python玩转histogram直方图的五种方法
Jul 30 Python
Django中使用MySQL5.5的教程
Dec 18 Python
python-OpenCV 实现将数组转换成灰度图和彩图
Jan 09 Python
python GUI库图形界面开发之PyQt5结合Qt Designer创建信号与槽的详细方法与实例
Mar 08 Python
Python使用graphviz画流程图过程解析
Mar 31 Python
Win 10下Anaconda虚拟环境的教程
May 18 Python
python如何处理程序无法打开
Jun 16 Python
只需要这一行代码就能让python计算速度提高十倍
May 24 Python
PyQt5 控件字体样式等设置的实现
May 13 #Python
Python tkinter实现简单加法计算器代码实例
May 13 #Python
Django权限设置及验证方式
May 13 #Python
PyQt5 文本输入框自动补全QLineEdit的实现示例
May 13 #Python
django自带的权限管理Permission用法说明
May 13 #Python
Python基于jieba, wordcloud库生成中文词云
May 13 #Python
django admin 根据choice字段选择的不同来显示不同的页面方式
May 13 #Python
You might like
php断点续传之如何分割合并文件
2014/03/22 PHP
php str_getcsv把字符串解析为数组的实现方法
2017/04/05 PHP
在laravel中实现将查询的对象转换为多维数组的函数
2019/10/21 PHP
JavaScript中令你抓狂的魔术变量
2006/11/30 Javascript
JS查看对象功能代码
2008/04/25 Javascript
使用Post提交时须将空格转换成加号的解释
2013/01/14 Javascript
jQuery制作仿腾讯web qq用户体验桌面
2013/08/20 Javascript
Js操作Select大全(取值、设置选中等等)
2013/10/29 Javascript
用js将内容复制到剪贴板兼容浏览器
2014/03/18 Javascript
纯js实现遮罩层效果原理分析
2014/05/27 Javascript
JavaScript中变量声明有var和没var的区别示例介绍
2014/09/15 Javascript
浅谈Nodejs观察者模式
2015/10/13 NodeJs
解析Node.js异常处理中domain模块的使用方法
2016/02/16 Javascript
JavaScript:Date类型全面解析
2016/05/19 Javascript
浅谈AngularJs指令之scope属性详解
2016/10/24 Javascript
EasyUI折叠表格层次显示detailview详解及实例
2016/12/28 Javascript
Node.js 的模块知识汇总
2017/08/16 Javascript
Node.js中DNS模块学习总结
2018/02/28 Javascript
vuejs点击class变化的实例
2018/09/05 Javascript
用vscode开发vue应用的方法步骤
2019/05/06 Javascript
node.js制作一个简单的登录拦截器
2020/02/10 Javascript
简单谈谈Python流程控制语句
2016/12/04 Python
详解将Pandas中的DataFrame类型转换成Numpy中array类型的三种方法
2019/07/06 Python
深入浅析python 中的self和cls的区别
2020/06/20 Python
python 利用toapi库自动生成api
2020/10/19 Python
Evisu官方网站:日本牛仔品牌,时尚街头设计风格
2016/12/30 全球购物
德国内衣、泳装和睡衣网上商店:Bigsize Dessous
2018/07/09 全球购物
Maisons du Monde德国:法国家具和装饰的市场领导者
2019/07/26 全球购物
雅诗兰黛加拿大官网:Estee Lauder加拿大
2019/07/31 全球购物
说出一些常用的类,包,接口
2014/09/22 面试题
大学生怎样写好自荐信
2014/02/25 职场文书
升国旗演讲稿
2014/09/05 职场文书
疾病证明书
2015/06/19 职场文书
工商行政处罚决定书
2015/06/24 职场文书
浅谈mysql增加索引不生效的几种情况
2021/06/23 MySQL
JavaScript声明变量和数据类型的转换
2022/04/12 Javascript