让代码模拟人工,自动检索答案并选择正确的选项,还是挺有趣的
前言
语言:Python
编辑器:PyCharm
模块:DrissionPage
DrissionPage是一款集成了Selenium和Requests的优点,能够同时实现“写得快”和“跑得快”。能够在不同须要时切换相应模式,并提供一种人性化的使用方法,提高开发和运行效率。同时这个模块还以网页为单位封装了常用功能,提供非常简便的操作和语句,十分的好用。
了解具体用法可以查看DrissionPage这里就不赘述了。
示例分析
下面我们就以驾考的一个网站,来介绍一下实现自动答题的思路要怎么实现?
1、打开示例页面:
首先我们先打开示例网址:科目一模拟考试_c1科目一模拟考试2023最新版_驾驶员模拟考试
2、分析页面特点:
我们进行数据采集和处理之前,首先要分析一下页面的特点以及页面的结构,这里我们可以用F12查看页面元素(查看本题分析,得到分析页网址:https://tiba.jsyks.com/Post/d1493.htm)
打开分析页面网址,我们可以看到题目的答案和解析(这里只用到答案)
3、查找规律特点
我们可以通过F12查看多个页面来确认和验证,题目的结构已经答案的规律,找到相似性(找到规律才能进行代码实现)
通过分析我们可以发现这样几个规律:
①:模拟考试中每个题目都在一个li标签下面
②:每个li标签的c属性都对应这个题目的解析地址的参数
https: //tiba.jsyks.com/Post/c4849.htm 这里的和上面的li标签的c属性一致
③:答案都是在一个Id为question的div标签的u标签内
④:题目解析中选择题的顺序和问题中的顺序一致(这点决定了代码是好写还是非常好写)
1)顺序一致时,只需要根据答案的做相似度匹配即可,也就是,解析中选A,模拟测试时也选A就行了
2)顺序随机时,就需要将解析中的ABCD,匹配出对应的答案文本,然后在用文本去匹配不同的选项,然后得到正确的答案即可。
下面就选择其中一个题目,来分析一下:
题目中可以得到解析地址的参数为:f9016,
通过查看解析页面,可以看到选项的顺序一致,另外在u标签中可以看到答案的选项
实现逻辑
通过上面的分析,我们基本掌握了页面的特点和规律,下面我们就完整梳理一下实现的思路
1、获取页面数据、得到全部题目的集合
2、遍历每个li标签
3、根据li标签中获取的解析地址,获取解析的答案
4、根据解析得到的答案,选择对应的选项
5、遍历完全部题目后,提交试卷得到结果
代码实现
①:导入相关模块的库
from DrissionPage import ChromiumPage,SessionPage,WebPage
from time import sleep
②:定义获取解析页面的方法
def getAnswer(code):
pg=SessionPage()
pg.get(f'https://tiba.jsyks.com/post/{code}.htm')
answ=pg.ele('#question').ele('t:u').text
return answ
如果是判断题,会返回:对/错
如果是选择题,会返回:题目选项的编号,例如:A/B/C/D
③:编写页面操作的实现代码
page=ChromiumPage()
# 访问目标页面
page.get('https://www.jsyks.com/kmy-mnks')
page.wait.load_start() # 保证元素都加载出来
div_content = page.ele('t:div@@class=mBoxL')
ul_element = div_content.ele('t:ul@@class=Content')
li_list = ul_element.eles('t:li')
for item in li_list:
# sleep(1)
ans=getAnswer(item.attr("c"))
print(f"当前的题目为:{item.ele('t:strong').text} \n答案为:{ans}")
if ans == '对':
print(item.ele('text:正确').html)
item.ele('text:正确').click()
elif ans == '错':
print(item.ele('text:错误').html)
item.ele('text:错误').click()
else:
item.ele(f'text:{ans}、').click()
需要对获取到的答案做简单的处理,(试题中,都是判断和单选):
如果是对,就转换选项的正确;
如果是错,就对应选项的错误;
如果是选项,就对应选项的序号。
完整的代码如下:
from DrissionPage import ChromiumPage,SessionPage,WebPage
from time import sleep
def getAnswer(code):
pg=SessionPage()
pg.get(f'https://tiba.jsyks.com/post/{code}.htm')
answ=pg.ele('#question').ele('t:u').text
return answ
if __name__ == '__main__':
page=ChromiumPage()
# 访问目标页面
page.get('https://www.jsyks.com/kmy-mnks')
page.wait.load_start() # 保证元素都加载出来
div_content = page.ele('t:div@@class=mBoxL')
ul_element = div_content.ele('t:ul@@class=Content')
li_list = ul_element.eles('t:li')
for item in li_list:
# sleep(1)
ans=getAnswer(item.attr("c"))
print(f"当前的题目为:{item.ele('t:strong').text} \n答案为:{ans}")
if ans == '对':
print(item.ele('text:正确').html)
item.ele('text:正确').click()
elif ans == '错':
print(item.ele('text:错误').html)
item.ele('text:错误').click()
else:
item.ele(f'text:{ans}、').click()
print('全部回答完毕')
div_content.ele('t:u@@class=btnJJ').click()
效果演示
Python自动答题示例
写在最后
1、对于单选题,如果解析和试题的选项顺序一致,只需要按照序号去映射就行
2、对于单选题,如果解析中和试题中的顺序是随机的,就需要在解析中得到序号后,匹配到对应的选项的文本(例如:解析答案为D,就需要根据答案D去解析得到A图这个文本),然后用解析到的文本,去匹配选项,得到最终的正确选项。
2、如果出现多选题目或者其他情况,则需要根据具体的情况,做针对性的优化调整即可