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 相关文章推荐
Python实现的几个常用排序算法实例
Jun 16 Python
python检测是文件还是目录的方法
Jul 03 Python
浅析python递归函数和河内塔问题
Apr 18 Python
使用python 爬虫抓站的一些技巧总结
Jan 10 Python
python OpenCV学习笔记直方图反向投影的实现
Feb 07 Python
python write无法写入文件的解决方法
Jan 23 Python
如何在Windows中安装多个python解释器
Jun 16 Python
opencv 图像礼帽和图像黑帽的实现
Jul 07 Python
Python 实现简单的客户端认证
Jul 29 Python
python爬虫多次请求超时的几种重试方法(6种)
Dec 01 Python
利用python进行数据加载
Jun 20 Python
Python matplotlib多个子图绘制整合
Apr 13 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.MVC的模板标签系统(一)
2006/09/05 PHP
PHP session会话操作技巧小结
2016/09/27 PHP
php基于 swoole 实现的异步处理任务功能示例
2019/08/13 PHP
Laravel 类和接口注入相关的代码
2019/10/15 PHP
Laravel框架实现即点即改功能的方法分析
2019/10/31 PHP
PHP基于phpqrcode类生成二维码的方法示例详解
2020/08/07 PHP
繁简字转换功能
2006/07/19 Javascript
js与jquery中获取当前鼠标的x、y坐标位置的代码
2011/05/23 Javascript
ExtJS4如何给同一个formpanel不同的url
2014/05/02 Javascript
js动态修改表格行colspan列跨度的方法
2015/03/30 Javascript
JavaScript DOM 对象深入了解
2016/07/20 Javascript
JavaScript实战之带收放动画效果的导航菜单
2016/08/16 Javascript
重新认识vue之事件阻止冒泡的实现
2018/08/02 Javascript
简述vue状态管理模式之vuex
2018/08/29 Javascript
mpvue写一个CPASS小程序的示例
2018/09/04 Javascript
jQuery实现为table表格动态添加或删除tr功能示例
2019/02/19 jQuery
vue动态绘制四分之三圆环图效果
2019/09/03 Javascript
Javascript实现html转pdf高清版(提高分辨率)
2020/02/19 Javascript
python使用xlrd实现检索excel中某列含有指定字符串记录的方法
2015/05/09 Python
Python中列表和元组的相关语句和方法讲解
2015/08/20 Python
浅谈Python单向链表的实现
2015/12/24 Python
一行python实现树形结构的方法
2019/08/09 Python
使用jupyter notebook将文件保存为Markdown,HTML等文件格式
2020/04/14 Python
Html5 FileReader实现即时上传图片功能实例代码
2014/09/01 HTML / CSS
台湾生鲜宅配:大口市集
2017/10/14 全球购物
文秘专业自荐信
2013/10/14 职场文书
建筑装饰学院室内设计专业个人自我评价
2013/12/07 职场文书
巡警年度自我鉴定
2014/02/21 职场文书
扩大国家免疫规划实施方案
2014/03/21 职场文书
市场营销调查计划书
2014/05/02 职场文书
高中升旗仪式演讲稿
2014/09/09 职场文书
2015学校六五普法工作总结
2015/04/22 职场文书
员工拾金不昧表扬稿
2015/05/05 职场文书
2015年秋季小学开学典礼主持词
2015/07/16 职场文书
mybatis 解决从列名到属性名的自动映射失败问题
2021/06/30 Java/Android
python绘制简单直方图(质量分布图)的方法
2022/04/21 Python