python题库刷题训练软件_自动刷题机 Python 解释源码 超新泛雅
本文解释一下代码,如果有想要用机器刷题的(前提是能找的到答案),可以参考一下。
开发原因:作业又多又无聊自己不想做,干脆用机器刷题。
主要方法:主要用Python的selenium库实现刷题。
需要基础:Python你得会点吧 html你得会的吧 正则表达式你得会点吧
登录部分
导入以下包
from selenium import webdriver
#导入selenium的webdriver 如果这个看不懂的话请移步selenium教程
from fuzzywuzzy import fuzz
#计算相似度的工具,没听过也没关系,看到了自己查
import re
import random
定义一些变量
name='15000000'
#用户名
password='**********'
#密码
wrong=85
#准确率(百分比)
count=148
#总题数
wrong=count*(100-wrong)*0.01
#错题数
然后打开登录界面
dr=webdriver.Chrome()
#用chrome打开 Firefox同理
dr.get('http://passport2.chaoxing.com/login?fid=1400&refer=http://i.mooc.chaoxing.com/space/index.shtml')
自动输入用户名密码,手动输入验证码
dr.find_element_by_class_name("zl_input").send_keys(name)
dr.find_element_by_class_name("zl_input2").send_keys(password)
#上面是用class name定位的用户名密码位置(用F12找)
code=input('Verification code >>>')
dr.find_element_by_class_name("zc_input32").send_keys(code)
dr.find_element_by_class_name("zl_btn_right").click()
#手动输入验证码,并用相同方法填入,并点击登录
登录图
定位到作业部分
尝试点击《计算机网络基础》学测,(你会发现没用,待会解释为什么没用)
dr.find_element_by_xpath("/html/body/div/div[2]/div[2]/ul/li[2]/div[2]/h3/a").click()
#用xpath的方式定位超链接,并click。请自己补充一定的xpath知识。
下图是如何在chrome中找到元素xpath的方法(xpath 大概就是 一种唯一定位html元素的方式#我自己也不是很清楚)
image.png
用selenium定位元素是没有办法跨frame的,所以需要定位某元素时,dr必须在某frame中。所以需要找到对应的frame并层层切换过去。用F12找到课程所在frame的ID-->frame_content,然后
dr.switch_to_frame('frame_content')
#用这个方法切frame
dr.find_element_by_xpath("/html/body/div/div[2]/div[2]/ul/li[2]/div[2]/h3/a").click()
#再点击,会打开一个新标签页
打开新标签以后要把dr切换到新标签中
dr.switch_to_window(dr.window_handles[1])
#dr.window_handles是所有标签的句柄list
想办法点击进入题目页
hwxpath='/html/body/div[6]/div[1]/div[2]/div[3]/div/div[2]/h3/span[2]/a'
dr.find_element_by_xpath(hwxpath).click()
image.png
进去以后
image.png
处理题目
点进去以后发现 题目被三层frame嵌套所以要切进去:
dr.switch_to_frame(0)
dr.switch_to_frame(0)
dr.switch_to_frame(0)
#0就是切入当前frame下的第一个frame,虽然这样不是很规范,但是方便啊,无脑啊
好现在dr在题目的frame里了,现在要把所有的单选框放在一个列表里。我们用find_elements_by_tag_name方法(根据标签名寻找),因为所有的单选框都是。但是并不是所有的input标签都是单选框,看了看发现只有可见的input标签才是单选框。所以我们要做两件事,找到所有input,然后再在这里面挑出所有display的:
inputs=[]
for n in dr.find_elements_by_tag_name('input'):
if n.is_displayed():
inputs.append(n)
print(n,'ok')
上一步做完,所有的单选框都在inputs这个list里了,四个一组(ABCD)。然后用正则表达式从页面源码中提取出所有题目。
qs=re.findall('(\d*?)[\s\S]*?【单选题】([\s\S]*?)
',dr.page_source)
然后要找对应的答案,查了一下,发现,这个练习的所有题目来自一个题库,下载该题库,保存成answer.txt存在同一目录下。然后把问题和答案分别用正则表达式提取出来,一一对应。
image.png
with open(file,'r',encoding='utf-8') as f:
ass=f.read()
asq=re.findall('\d+ . (.*?)\n',ass)
asa=re.findall('答案:(.)',ass)
接下来就是匹配页面上的问题和下载的答案集了。但是因为页面源码和某些原因,题目可能会比答案多个空格少个字符什么的,所以有的时候不能完全匹配,就需要用模糊匹配和全匹配结合的方法。思路:先全匹配(因为快),如果不行,就计算两个题目的相似度,取相似度最高的。
asls=[]
for i in qs:
if i[1] in asq:
asls.append(asa[asq.index(i[1])])
else:
rls=[fuzz.ratio(i,ii) for ii in asq]
op=asa[rls.index(max(rls))]
asls.append(op)
#asls 里的结果大概就是这个样子['A','C','B'............'B']
然后我们要把所有的ABCD点上啊,第一个的A对应inputs里的0,B对应1......第二个的A对应4所以有公式——(ABCD的ASCII码-65+列表下标乘4)
asls=[ord(i)-65+e*4 for e,i in enumerate(asls)]
#列表推倒,不会的话自己用for写
#asls 里的结果大概就是这个样子[0,6,12........]
最后把inputs里的相应下标的inputs标签点击一下
for i in asls:
inputs[i].click()
当然,不能做全对吧,那就随机瞎点几个答案吧(错误率根据开始定义的错误率)
for i in range(int(wrong)):
random.choice(inputs).click()
全部解释完,撒花
下面贴全部源码
from selenium import webdriver
from fuzzywuzzy import fuzz
import re
import random
name='15000232'
password='a1008611'
wrong=85
count=148
wrong=count*(100-wrong)*0.01
dr=webdriver.Chrome()
dr.get('http://passport2.chaoxing.com/login?fid=1400&refer=http://i.mooc.chaoxing.com/space/index.shtml')
#open website
dr.find_element_by_class_name("zl_input").send_keys(name)
dr.find_element_by_class_name("zl_input2").send_keys(password)
code=input('Verification code >>>')
dr.find_element_by_class_name("zc_input32").send_keys(code)
dr.find_element_by_class_name("zl_btn_right").click()
#login
dr.switch_to_frame('frame_content')
dr.find_element_by_xpath("/html/body/div/div[2]/div[2]/ul/li[2]/div[2]/h3/a").click()
dr.switch_to_window(dr.window_handles[1])
#switch to frame and click 'SQL SERVER'
hwxpath='/html/body/div[6]/div[1]/div[2]/div[3]/div/div[2]/h3/span[2]/a'
dr.find_element_by_xpath(hwxpath).click()
dr.switch_to_frame(0)
dr.switch_to_frame(0)
dr.switch_to_frame(0)
inputs=[]
for n in dr.find_elements_by_tag_name('input'):
if n.is_displayed():
inputs.append(n)
print(n,'ok')
qs=re.findall('(\d*?)[\s\S]*?【单选题】([\s\S]*?)',dr.page_source)
file='answers.txt'
with open(file,'r',encoding='utf-8') as f:
ass=f.read()
asq=re.findall('\d+ . (.*?)\n',ass)
asa=re.findall('答案:(.)',ass)
asls=[]
for i in qs:
if i[1] in asq:
asls.append(asa[asq.index(i[1])])
else:
rls=[fuzz.ratio(i,ii) for ii in asq]
op=asa[rls.index(max(rls))]
asls.append(op)
asls=[ord(i)-65+e*4 for e,i in enumerate(asls)]
for i in asls:
inputs[i].click()
for i in range(int(wrong)):
random.choice(inputs).click()
当然你们做的题和我的不一样,所以要自己改改,这个程序并不是很健全,因为我懒就这样。
python题库刷题训练软件_自动刷题机 Python 解释源码 超新泛雅相关推荐
- python刷快手极速版_自动刷快手极速版脚本当前页面出现
很简单的,现在就尝试一下吧 wait:线程不再活动,不再参与调度,进入 wait set 中,因此不会浪费 CPU 资源,也不会去竞争锁了,这时的线程状态即是 WAITING可以根据提示在属性页中直接 ...
- python量化实战 顾比倒数线_顾比倒数线 主图源码
好股票软件下载网(www.goodgupiao.com)提示:您正在下载的是:顾比倒数线 主图源码 P:=21; WH1:=IF(L=LLV(L,P),L,DRAWNULL); WH2:=CONST( ...
- Python爬虫爬取表情包+Autojs微信自动导入表情包脚本(附源码)
废话不多说直接开始 Python爬取表情包 一.检查网页源码 发现可以找到图片地址,直接请求图片地址下载图片 二.打开开发者工具(F12) 通过xpath提取p标签下的img标签src属性为图片地址 ...
- php题库app_2020新版PHP在线考试系统在线测试练习做试题网站源码 带手机端
功能与优点: 1.强化训练测验,对知识点进行单独练习 : 2.随机组卷练习,系统自动抽取题目进行练习 : 3.手工组卷联系,通过教师平台手工组卷形成考卷进行模拟练习 : 4.支持主客观题型并存,主观题 ...
- 人脸检测颜值软件_百度AI人脸识别测颜值源码
百度AI人脸识别测颜值由百度AI官方推出百度AI人脸识别测颜值源码,目前已将人脸识别氛围V2和V3两个接口,使用前需要参考相应的文档权限来选择接口类型.今天为大家带来的源码,就是让大家能够了解学习到百 ...
- 1000道Python题库系列分享23(61个填空题)
封面图片:<玩转Python轻松过二级>,董付国,清华大学出版社 ================= 本期题目,参考答案在文末: 温馨提示 关注本公众号"Python小屋&quo ...
- 1000道Python题库系列分享13(22道填空题)
上期题目链接:1000道Python题库系列分享十二(9道编程题) 上期题目答案: 本期题目: --------董付国老师Python系列教材-------- 1)<Python程序设计(第2版 ...
- 计算机c语言二级题库及答案txt,计算机二级c语言题库及答案
计算机二级c语言题库及答案Tag内容描述: 1.2016年计算机二级c语言题库及答案一.选择题(每小题1分,共40小题,共40分)1.设循环队列的存储空间为Q(1:35),初始状态为front=rea ...
- 真题园-最全的免费海量历年真题试卷下载及答案解析的真题题库网站,无需注册!找真题,上真题园!爱学习,找真题!
真题园-www.zhentiyuan.com,网站全新上线,最全的免费海量历年真题试卷下载及答案解析的真题题库网站,无需注册!找真题,上真题园!爱学习,找真题! 真题园成立于2014年5月,是一个可以 ...
最新文章
- mysql整形溢出报错_MySQL整型数据溢出的解决方法
- NOIP2017 列队
- wxWidgets:wxControl类用法
- Kaggle API
- java 服务器 文件写入文件_java 从服务器下载文件并保存到本地
- c++设置单元格填充色_格式函数text,设置自定义格式的万金油
- 重载(overload)与重写(override)的区别
- 【Java】浅谈关键词transient的使用
- c语言实现队列基本算法,【算法】队列的C语言实现
- OpenCV-Python实战(23)——将OpenCV计算机视觉项目部署到云端
- python round_python round()
- 再谈IE的浏览器模式和文档模式[转]
- React脚手架安装
- 创建简单vue项目 / Webpack创建vue项目
- 2019腾讯后台开发详细面试流程
- 荷兰国旗问题python_荷是什么意思 荷字五行属什么
- html表格只设外边框,只设内边框
- 伤害世界服务器连接失败_伤害世界服务器怎么架设_伤害世界服务器架设图文教程_玩游戏网...
- IBM车库创新:为科技创新头号工程打造共创引擎
- Python: dict vs defaultdict
热门文章
- 第03章 成人感冒不是大事,少往急诊跑
- css网页布局之定位流,JavaScript
- 打卡-2023-4-2
- linux删除目录下文件|删除文件保持目录结构|各种删除方法总结
- python 库函数ppt_《Python电子教案5-1 函数和代码复用》.ppt
- CentOS如何查看本机ip
- nova7se乐活版升级鸿蒙,华为nova7SE乐活版有什么缺点-华为nova7SE乐活版优缺点介绍...
- 半入耳式真无线蓝牙耳机测评,南卡和漫步者蓝牙耳机哪个音质更好?
- 如何控制HTML中DIV的加载顺序
- 走!本周六,看放空、媛媛和C姐去,Cocos官方分享会!