Python如何实现考试自动答题功能
这篇文章主要介绍“Python如何实现考试自动答题功能”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python如何实现考试自动答题功能”文章能帮助大家解决问题。
一、准备环境
1)运行环境
开发环境:
Python3、Pycharm社区版。
import requests ---> 数据请求模块 pip install requests import refrom selenium import webdriver ---> 自动测试模块 pip install selenium==3.141.0 <指定版本安装>。
谷歌浏览器 以及 谷歌驱动 <版本和浏览器版本相对应> 环境没有安装的同学, 可以去安装。
2)模块安装
第三方库的安装方式如下:
一般安装:pip install +模块名
镜像源安装:pip install -i pypi.douban.com/simple/+模块名…
(还有很多国内镜像源,这里是豆瓣的用习惯了,其他镜像源可以去看下之前文章都有的)
二、代码展示
1)爬虫实现思路
一. 数据来源分析 --> 通过浏览器 开发者工具 抓包分析
明确需求: - 明确采集的网站是什么
题目答案页面: https://tiba.jsyks.com/Post/2c15b.htm
分析这两个数据怎么获取
数据来自于 --> 答案页面
第一题: https://tiba.jsyks.com/Post/2c15b.htm
问题: 获取1701道题目 --> 分析每个题目答案页面URL构成
第一题: https://tiba.jsyks.com/Post/2c15b.htm
第二题: https://tiba.jsyks.com/Post/8ac1a.htm
第三题: https://tiba.jsyks.com/Post/e97d7.htm 2c15b / 8ac1a / e97d7
所以 只需要获取所有答案页面ID, 即可获取所有题库 。
2)自动答题主程序
# 导入自动化测试模块 --> 重点 3.141.0 版本from selenium import webdriver# 导入pandasimport pandas as pd# 导入正则import redf = pd.read_csv('题库.csv')key = []value = []# 获取每一道题目for i in df['Problem']: # 问题作为键 # 把题目添加到列表里面 key.append(i)# 获取每一道题目答案for j in df['Answer']: # 问题作为值 # 把答案添加到列表里面 value.append(j)# 把两个列表合并成字典dic = dict(zip(key, value))"""1. 打开浏览器 Chrome 浏览器 谷歌 webdriver.Chrome('驱动路径') I. 驱动选择 根据你自己浏览器版本, 选择驱动版本, 最相近即可 驱动只有32 II. 驱动路径写法 1. 不写路径 - 驱动和你代码在一起 - 驱动和你python安装目录在一起 2. 写路径 绝对路径"""driver = webdriver.Chrome()# 2. 访问网站driver.get('https://www.jsyks.com/kms-fzks')driver.maximize_window()"""答题操作: 1. 题库 <获取出来了> 读取csv文件, 把题目内容以及答案读取出来1701道题,要读1701次啊? 可以把问题作为字典键, 答案作为字典值 根据问题, 可以获取答案定位元素, 获取数据内容"""print(dic)for page in range(50): Questions = driver.find_element_by_css_selector('#ExamTit').text # \d+ 匹配数字 获取题目 Question = re.findall('\d+. (.*)', Questions)[0] answer = dic[Question] # 多选题, 答案肯定大于1 if len(answer) == 1: # 判断答案内容 选择选项 if answer == '对': # 定位对元素, 进行点击操作 driver.find_element_by_css_selector('#TX1 #btnDa11').click() elif answer == '错': driver.find_element_by_css_selector('#TX1 #btnDa12').click() elif answer == 'A': driver.find_element_by_css_selector('#TX2 #btnDa21').click() elif answer == 'B': driver.find_element_by_css_selector('#TX2 #btnDa22').click() elif answer == 'C': driver.find_element_by_css_selector('#TX2 #btnDa23').click() elif answer == 'D': driver.find_element_by_css_selector('#TX2 #btnDa24').click() # 点击下一题 driver.find_element_by_css_selector('#actArea #btnNext2').click() elif len(answer) > 1: # 多选 for x in answer: if x == 'A': driver.find_element_by_css_selector('#TX2 #btnDa21').click() elif x == 'B': driver.find_element_by_css_selector('#TX2 #btnDa22').click() elif x == 'C': driver.find_element_by_css_selector('#TX2 #btnDa23').click() elif x == 'D': driver.find_element_by_css_selector('#TX2 #btnDa24').click() driver.find_element_by_css_selector('#actArea #btnNext2').click()driver.find_element_by_css_selector('#actArea #btnNext3').click()driver.find_element_by_css_selector('#Tip_Msg span input:nth-child(1)').click()
3)题库主程序
import requestsimport reimport csvimport concurrent.futuresimport parseldef AnswerID(): f = open('答案ID.txt', encoding='utf-8') answer_id_list = [answer_id for answer_id in f.read().split(',')] return answer_id_listdef GetResponse(html_url): headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36' } html_data = requests.get(url=html_url, headers=headers).text return html_datadef GetContent(AnswerID): AnswerUrl = f'https://tiba.jsyks.com/Post/{AnswerID}.htm' html_data = GetResponse(html_url=AnswerUrl) selector = parsel.Selector(html_data) problem = selector.css('#question a::text').get() answer = selector.css('#question h2 b::text').getall() if len(answer) == 0: answer = selector.css('#question h2 u::text').get() AnswerDict = { 'Problem': problem, 'Answer': answer, } return AnswerDictdef main(page): AnswerDict = GetContent(AnswerID=page) csv_writer.writerow(AnswerDict) print(AnswerDict)if __name__ == '__main__': # GetContent(AnswerID='8502e') answer_id_list = AnswerID() f = open('科目四题库.csv', mode='a', encoding='utf-8', newline='') csv_writer = csv.DictWriter(f, fieldnames=['Problem', 'Answer']) csv_writer.writeheader() exe = concurrent.futures.ThreadPoolExecutor(max_workers=7) for answer_id in answer_id_list: exe.submit(main, answer_id) exe.shutdown()
三、效果展示
1)自动答题
2)自动上交试卷
很多人问为什么只有96分没得100分?
因为题库下载的题目答案是错误的修正之后就可以啦!
关于“Python如何实现考试自动答题功能”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网行业资讯频道,小编每天都会为大家更新不同的知识点。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341