Python實現(xiàn)考試自動答題的腳本分享
導(dǎo)語
對于新手而言,掌握好方向盤的打法非常重要,關(guān)系到我們能否順利通過駕考,拿到駕照。而開車時方向盤又是最重要的,握好方向盤等于是給自己的安全上了保險。
科目一考試為上機考試,100道題,題型為判斷題和單選題,以案例、圖片及動畫形式的題目為主,考試時間45分鐘,90分及以上過關(guān)。
最近這段時間天氣正正好,不冷不熱,是學(xué)習(xí)考駕照的好時機。想學(xué)的寶子,最好是現(xiàn)在這個季節(jié),要知道,當(dāng)年(咳咳咳...)也就是前年我學(xué)駕照的時候夏天曬的烏漆嘛黑的。
許多駕考學(xué)員們,雖說科二科三需要實體練車,但是科一科四都是理論知識點,那不得一次過。平常的話****我們可以利用碎片化的時間鞏固基礎(chǔ)知識, 爭取科科一次過!今天小編教大家一個小腳本啦——Python實現(xiàn)自動答題 價值 1000元 外包訂單項目案例。
一、準備環(huán)境
1)運行環(huán)境
開發(fā)環(huán)境:
Python3、Pycharm社區(qū)版。
import requests ---> 數(shù)據(jù)請求模塊 pip install requests import re from selenium import webdriver ---> 自動測試模塊 pip install selenium==3.141.0 <指定版本安裝>。
谷歌瀏覽器 以及 谷歌驅(qū)動 <版本和瀏覽器版本相對應(yīng)> 環(huán)境沒有安裝的同學(xué), 可以去安裝。
2)模塊安裝
第三方庫的安裝方式如下:
一般安裝:pip install +模塊名
鏡像源安裝:pip install -i pypi.douban.com/simple/+模塊名…
(還有很多國內(nèi)鏡像源,這里是豆瓣的用習(xí)慣了,其他鏡像源可以去看下之前文章都有的)
二、代碼展示
1)爬蟲實現(xiàn)思路
一. 數(shù)據(jù)來源分析 --> 通過瀏覽器 開發(fā)者工具 抓包分析
1. 明確需求: - 明確采集的網(wǎng)站是什么
題目答案頁面: https://tiba.jsyks.com/Post/2c15b.htm
2. 分析這兩個數(shù)據(jù)怎么獲取
數(shù)據(jù)來自于 --> 答案頁面
第一題: https://tiba.jsyks.com/Post/2c15b.htm
問題: 獲取1701道題目 --> 分析每個題目答案頁面URL構(gòu)成
第一題: 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)自動答題主程序
# 導(dǎo)入自動化測試模塊 --> 重點 3.141.0 版本 from selenium import webdriver # 導(dǎo)入pandas import pandas as pd # 導(dǎo)入正則 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('驅(qū)動路徑') I. 驅(qū)動選擇 根據(jù)你自己瀏覽器版本, 選擇驅(qū)動版本, 最相近即可 驅(qū)動只有32 II. 驅(qū)動路徑寫法 1. 不寫路徑 - 驅(qū)動和你代碼在一起 - 驅(qū)動和你python安裝目錄在一起 2. 寫路徑 絕對路徑 """ driver = webdriver.Chrome() # 2. 訪問網(wǎng)站 driver.get('https://www.jsyks.com/kms-fzks') driver.maximize_window() """ 答題操作: 1. 題庫 <獲取出來了> 讀取csv文件, 把題目內(nèi)容以及答案讀取出來 1701道題,要讀1701次啊? 可以把問題作為字典鍵, 答案作為字典值 根據(jù)問題, 可以獲取答案 定位元素, 獲取數(shù)據(jù)內(nèi)容 """ print(dic) for page in range(50): Questions = driver.find_element_by_css_selector('#ExamTit').text # \d+ 匹配數(shù)字 獲取題目 Question = re.findall('\d+. (.*)', Questions)[0] answer = dic[Question] # 多選題, 答案肯定大于1 if len(answer) == 1: # 判斷答案內(nèi)容 選擇選項 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 h1 b::text').getall() if len(answer) == 0: answer = selector.css('#question h1 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實現(xiàn)考試自動答題的腳本分享的詳細內(nèi)容,更多關(guān)于Python考試自動答題的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python+seaborn實現(xiàn)聯(lián)合分布圖的繪制
聯(lián)合分布(Joint Distribution)圖是一種查看兩個或兩個以上變量之間兩兩相互關(guān)系的可視化圖,在數(shù)據(jù)分析操作中經(jīng)常需要用到。本文將通過seaborn實現(xiàn)繪制聯(lián)合分布圖,需要的可以參考一下2023-02-02Python實戰(zhàn)之實現(xiàn)簡易的學(xué)生選課系統(tǒng)
又到了小伙伴們最喜歡的python實戰(zhàn)環(huán)節(jié),文中對實現(xiàn)簡易的學(xué)生選課系統(tǒng)作了非常詳細的代碼示例,對正在學(xué)習(xí)python的小伙伴們有很好的幫助,需要的朋友可以參考下2021-05-05