首页 > 文章列表 > 如何用Python编写考试自动化答题程序

如何用Python编写考试自动化答题程序

Python
365 2023-05-02

Python如何实现考试自动答题功能

一、准备环境

1)运行环境 

 开发环境:

Python3、Pycharm社区版。

import requests  ---> 数据请求模块 pip install requests  

import re

from selenium import webdriver ---> 自动测试模块 pip install selenium==3.141.0  <指定版本安装>。

谷歌浏览器 以及 谷歌驱动 <版本和浏览器版本相对应> 环境没有安装的同学, 可以去安装。

 2)模块安装

第三方库的安装方式如下: 

一般安装:pip install +模块名 

镜像源安装:pip install -i pypi.douban.com/simple/+模块名&hellip;

 (还有很多国内镜像源,这里是豆瓣的用习惯了,其他镜像源可以去看下之前文章都有的)

二、代码展示 

1)爬虫实现思路

一. 数据来源分析 --> 通过浏览器 开发者工具 抓包分析    

1. 明确需求:        - 明确采集的网站是什么            

题目答案页面: https://tiba.jsyks.com/Post/2c15b.htm

2.  分析这两个数据怎么获取    

数据来自于 --> 答案页面 

第一题: 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

# 导入pandas

import pandas as pd

# 导入正则

import re



df = 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 requests

import re

import csv

import concurrent.futures

import parsel



def AnswerID():

    f = open('答案ID.txt', encoding='utf-8')

    answer_id_list = [answer_id for answer_id in f.read().split(',')]

    return answer_id_list





def 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_data





def 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 AnswerDict





def 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分?

因为题库下载的题目答案是错误的修正之后就可以啦!