[Python] Python+selenium宪法小卫士活动题库及自动答题源码分享

该源码主要利用python+selenium来进行爬取题库和自动答题。
主要思路和代码步骤如下:
首先打开网址:https://static.qspfw.com/xf2020/learn_practice_list.html 
然后找到登录按钮,同时按下shift+ctrl+i,打开控制台,找到登录按钮的位置信息,然后复制xpath,以备用
<ignore_js_op> 
点击 登录按钮后跳转到登录页面
<ignore_js_op> 
同理,找到 用户名,密码和登录的xpath信息,以备用
处理弹窗
<ignore_js_op> 
登录后找到 在线学习的xpath
<ignore_js_op> 
之后找到待学习的课程等过程及xpath就不再赘述,方法相同,一步步寻找

爬取题库
进入答题页面,可以同理找到 问题的xpath和选项的xpath
<ignore_js_op> 
选择任意一个选项,等待页面刷新,正确选项会变成绿色,且class变成‘item success’,
刚才选择的错误选项的class变成‘item error‘,
因此可以根据class的变化获得正确答案
【尝试获取class='item success'但失败了,还未寻找到解决办法,故采用另一种方法】
选择A后,采集选项的class值,如果是‘item error’的话就跳过,选择B,当不是‘item error’时就是正确答案。
【耗费时间比直接获取class=‘item success’多3倍】
然后选择下一题依次答题的xpath,答题结束后选择 学习下一主题的xpath进行跳转
将采集到的题目和正确选项答案保存到文件中,题库爬取完成

将题库导入到程序中,然后进入答题页面
题库格式为【题目/A/选项】
获得题目的xpath位置,找到其文本信息,将该文本和题库列表进行搜索
当题库中有该题目时,确定其索引位置,正确答案的索引值为其值+1,获得正确答案
然后进行判断,根据正确答案,选择要选择选项的xpath,然后进行选择,
完成该题目后选择下一题,
全部完成后提交。
关闭提交后的弹窗。

源码如下:

 
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
import time    #导入时间库
from selenium import webdriver
 
 
 
 
 
 
""" 账号密码 """
name = "账号"
password = "密码"
 
"""网址"""
url = "https://static.qspfw.com/xf2020/learn_practice_list.html"
 
chromedriver = 'chromedriver.exe'   #浏览器内核位置
chome_options = webdriver.ChromeOptions()
wd = webdriver.Chrome(chromedriver, chrome_options=chome_options)   #浏览器
wd.delete_all_cookies()  # 删除cookies
wd.maximize_window()  # 将浏览器最大化
wd.implicitly_wait(10)   #网页无响应或找不到标签等,最长尝试10秒
wd.get(url)
element = wd.find_element_by_xpath('//*[@id="login"]')   #登录按键
element.click()
element = wd.find_element_by_xpath('//*[@id="username"]')   #用户名
element.send_keys(name)
element = wd.find_element_by_xpath('//*[@id="password"]')    #密码
element.send_keys(password)
time.sleep(3)   #延迟3秒
element = wd.find_element_by_xpath('/html/body/div[2]/div/form/a')   #登录
element.click()  #点击
time.sleep(2)   #延迟2秒
 
 
 
#有时候会出现弹窗,显示 服务器忙或登录成功等弹窗,需要关闭
"""关闭浏览器弹窗"""
try:
    a = wd.switch_to.alert     #  切换alert
    print(a.text)                    # 获取弹窗上的文本
    a.accept()                       # 确认,相当于点击[确定]按钮
    # a.dismiss()                      # 取消,相当于点击[取消]按钮
except:
    pass
 
 
#有时页面会出现“服务器错误”弹窗,关闭后再次登录才行,如果不需就注释掉
# """再次登录"""
# try:
#     element = wd.find_element_by_xpath('/html/body/div[2]/div/form/a')
#     element.click()
# except:
#     pass
#
#用户未认证状态下会出现认证弹窗,如果不需就注释掉
# """关闭认证弹窗"""
# try:
#     element = wd.find_element_by_xpath('/html/body/div[5]/div/table/tbody/tr[1]/td/button')
#     element.click()
# except:
#     pass
 
 
 
"""跳转 在线学习"""
 
element = wd.find_element_by_xpath('/html/body/section/div[2]/div[2]/div[1]/div[2]/div[3]/div[1]/img')
element.click()
print("在线学习")
time.sleep(5)
 
'''    以下代码用于获取题库及答案
"""跳转 课程-练习   获得所有题库"""
 
 
for b in range(3,8):
    course_xpath = '//*[@id="columnList"]/div[' + str(b) + ']/div/div[2]/div[1]'
    practice_xpath = '//*[@id="columnList"]/div[' + str(b) + ']/div/div[2]/div[3]/div[2]'
    element = wd.find_element_by_xpath(course_xpath)
    course = element.text
    print(f"打开课程 {course}")
    practice = wd.find_element_by_xpath(practice_xpath)
    practice.click()
 
    """获得该课程题库"""
    for num in range(1,31): #练习题目是30题,因此依次答题
        question = wd.find_element_by_xpath('//*[@id="exam_question"]').text    #获得题目
        print(question)   #打印
 
        for i in range(1,5): # 4个选项
            choose_xpath = '//*[@id="exam_answer"]/div[' + str(i) + ']/span[2]'   #选项的xpath
            choose = wd.find_element_by_xpath(choose_xpath)  #选择第i个
 
            choose.click()    #点击选项
            time.sleep(3)   #延时3秒
            all_answer_xpath = '//*[@id="exam_answer"]/div[' + str(i) + ']'   #选项选择后的xpath
            all_answer = wd.find_element_by_xpath(all_answer_xpath)
            answer_class_name = all_answer.get_attribute('class')   #获得class
            print(answer_class_name)  #查看
            if answer_class_name == "item  error" or answer_class_name == "item error":   #如果是错误就
                pass    #跳过
 
            #不知道为什么直接定位by_class_name(“item success”)无法找到,只好有这样的办法来通过判断class的值来确定答案
            #用by_class_name(“item success”)直接定位效率更高
            elif answer_class_name == "item success" or answer_class_name =="item  success":  #如果是正确
                answers = ['A','B','C','D']  # A,B,C,D
                answer = answers[i-1]   #在列表中的顺序
                answer_text = choose.text
                print(answer)  #打印
                print(answer_text)
            try:  #尝试
                #当class=="item  error"时没有answer,故需要用try
 
                with open("宪法题库.txt","a") as f:
                    f.write(question + "/" + answer +"/" + answer_text + "/")   #写入题目和答案
            except:
                pass #跳过
        if num < 30:
            next = wd.find_element_by_id('next_question')  #下一题
            next.click()   #点击
            time.sleep(0.1)
        else:
            pass
 
    back_learn_list = wd.find_element_by_xpath('/html/body/section/div/div[2]/div[2]/span')  #返回主题列表xpath
    back_learn_list.click()   #点击
    time.sleep(3)  #延迟3秒
 
'''
 
 
 
"""导入题库"""
file = "宪法题库_全.txt"    #题库文件路径
questions = open(file,"r").read()   #文本格式打开
print(questions)
question_list = questions.split('/')    #用split()函数根据 / 进行切片,生成题库列表
 
 
"""跳转 综合测评"""
element = wd.find_element_by_xpath('//*[@id="toEvaluation"]')
element.click()
print("进入综合测评,即将开始答题……")
 
"""跳转 开始答题页面"""
element = wd.find_element_by_xpath('/html/body/section/div/div[2]/div/div[2]/div[3]/span'#开始答题
print(element.text)
element.click()   #点击
 
 
 
 
for i in range(1,11):   #一共10道题目,循环10次
    element = wd.find_element_by_xpath('//*[@id="exam_question"]')    #找到题目信息的xpath
    print(element.text)  #打印查看
    question = element.text   #吧问题文本赋值给question
    question = question.strip()   #删除两端空字符
    if question in question_list:    #如果题目再题库列表中
        print(question_list.index(question))    #打印所在索引编号
        answer = question_list[question_list.index(question)+1]    #答案的索引编号是问题索引编号+1
        print(answer)   #打印答案
        if answer == "A":   #如果是A
            answer_xpath = '//*[@id="exam_answer"]/div[1]/span[2]'   #A项的xapth
        elif answer == "B"#如果是B
            answer_xpath = '//*[@id="exam_answer"]/div[2]/span[2]'   #B项的xpath
        elif answer == "C":
            answer_xpath = '//*[@id="exam_answer"]/div[3]/span[2]'
        elif answer == "D":
            answer_xpath = '//*[@id="exam_answer"]/div[4]/span[2]'
         
        time.sleep(3)   #延时3秒,模拟人工操作选择
        answer_element = wd.find_element_by_xpath(answer_xpath)   #找到证选项的xpath
        answer_element.click()   #点击
         
        next_xpath = '/html/body/section/div/div[2]/div/div[2]/div[4]/div[2]/div[2]'  #下一题的xpath
        next_element = wd.find_element_by_xpath(next_xpath)  #找到下一题
        next_element.click()   #点击
 
 
submit_element = wd.find_element_by_id("submit")   #提交按钮
submit_element.click()   #点击提交
 
 
"""关闭浏览器交卷成功弹窗"""
try:
    a = wd.switch_to.alert     #  切换alert
    print(a.text)                    # 获取弹窗上的文本
    a.accept()                       # 确认,相当于点击[确定]按钮
    # a.dismiss()                      # 取消,相当于点击[取消]按钮
except:
    pass





链接:https://pan.baidu.com/s/1tKPO0oK0z2bb7ldIos6-Hw 
提取码:bltb 

posted @ 2020-12-12 20:10  naya2016  阅读(2527)  评论(0编辑  收藏  举报