吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 10952|回复: 50
收起左侧

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

  [复制链接]
创造太阳 发表于 2020-12-11 13:29
本帖最后由 创造太阳 于 2020-12-11 13:43 编辑

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

爬取题库
进入答题页面,可以同理找到 问题的xpath和选项的xpath
QQ图片20201211130524.png
选择任意一个选项,等待页面刷新,正确选项会变成绿色,且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,然后进行选择,
完成该题目后选择下一题,
全部完成后提交。
关闭提交后的弹窗。

源码如下:

[Python] 纯文本查看 复制代码
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



题库: 宪法题库_全.txt (48.88 KB, 下载次数: 186)
链接:https://pan.baidu.com/s/1tKPO0oK0z2bb7ldIos6-Hw
提取码:bltb
复制这段内容后打开百度网盘手机App,操作更方便哦

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 创造太阳 发表于 2020-12-11 15:22
bamyoo 发表于 2020-12-11 14:56
是不是题库不全,不自动答题啊。

给的测试账号好像是三年级的,其他年级的就把爬取题库那块代码取消注释爬一下就可以了。
 楼主| 创造太阳 发表于 2021-1-26 15:19
kai3322 发表于 2021-1-26 11:00
创造太阳 发表于 2021-1-25 18:55
取消python中的弹窗相关代码的注释,不是注释对方网站的
用哪个库?

import time    #导入时间库
from selenium import webdriver
52soft 发表于 2020-12-11 13:41
红尘客栈。 发表于 2020-12-11 13:46
来晚了一步,手动答的
XuYiXin 发表于 2020-12-11 13:47
抓请求接口,直接读返回值选择多好啊!!
freedown 发表于 2020-12-11 13:55
不错,这个可以有。
dzxiang 发表于 2020-12-11 13:56
太需要这个了,操作起来试试看
时光稀释 发表于 2020-12-11 14:00
感觉是不是有点过分了。每个视频后面有30题课后习题,给个3、5题意思意思不就行了。

上次手动答了300多题。谢谢分享!下次试试
872269113 发表于 2020-12-11 14:01
求成品啊
bamyoo 发表于 2020-12-11 14:15
来晚了啊,已经手动打完了。
sharokku4869 发表于 2020-12-11 14:17
厉害了,学些了,感谢大佬
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-9-1 21:40

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表