您好,登錄后才能下訂單哦!
這篇文章主要介紹“Python如何實現考試自動答題功能”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“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/+模塊名…
(還有很多國內鏡像源,這里是豆瓣的用習慣了,其他鏡像源可以去看下之前文章都有的)
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分?
因為題庫下載的題目答案是錯誤的修正之后就可以啦!
關于“Python如何實現考試自動答題功能”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。