吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 9635|回复: 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] 纯文本查看 复制代码
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, 下载次数: 176)
链接: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, 2024-5-16 17:21

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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