python超星尔雅学习通利用selenium一键建题库和一键做题

python超星尔雅学习通利用selenium一键建题库和一键做题

前言

本文内代码适用的作业

  • 多章节

  • 大量单选,多选和判断题

  • 作业内题目乱序

  • 题目内选项乱序

  • 没有主观题

    实现过程主要分为两块,一块是登录其他已经完成作业的账号,爬取其所有已完成作业的题目与答案,并保存为txt文件;另一块是登录自己的账号,爬取题目信息与txt内题库进行比对,实现一键自动完成作业。

    功能方面同样可以使用requests库达到目的,相关原理与 https://blog.csdn.net/m0_47926132/article/details/106957460?utm_source=app
    内容同理。

一键建立题库脚本

导入库

from selenium import webdriver
import time

模拟登录

    def initiate(self):
        self.usernm1 = input("请输入您的手机号")
        self.passwd1 = input("请输入您的密码")
        driver = webdriver.Chrome()
        url = 'http://passport2.chaoxing.com/login?fid=1467&refer=&newversion=true'
        driver.get(url)
        self.login(driver)
    def login(self,driver):
        usernm = driver.find_element_by_class_name("ipt-tel")
        usernm.send_keys(self.usernm1)
        passwd = driver.find_element_by_class_name("ipt-pwd")
        passwd.send_keys(self.passwd1)
        login = driver.find_element_by_class_name("btn-big-blue")
        login.click()
        input("请将页面切换至课程作业页面后在输入框按回车键")
        file = open('c.txt', 'w')
        self.getChapter(driver,file)

爬取题目

        def getChapter(self,driver,file):
        handles = driver.window_handles
        driver.switch_to.window(handles[-1])
        chapters = driver.find_elements_by_class_name("Btn_blue_1")
        current_Chapter = 0
        print("开始获取章节题目")
        while current_Chapter < len(chapters):
            a = 0
            b = 0
            c = 0
            d = 0
            handles = driver.window_handles
            driver.switch_to.window(handles[-1])
            chapters = driver.find_elements_by_class_name("Btn_blue_1")
            chapters[current_Chapter].click()
            time.sleep(1)
            title = driver.find_element_by_css_selector("li.cur")
            test = driver.find_elements_by_css_selector("div.CeYan>div.ZyBottom>div.TiMu>div.Zy_TItle>div.clearfix>div:first-child")
            num = len(test)
            choices = driver.find_elements_by_css_selector("div.CeYan>div.ZyBottom>div.TiMu>ul>li>i")
            choices_2 = driver.find_elements_by_css_selector("div.CeYan>div.ZyBottom>div.TiMu>ul>li>a")
            myanswer = driver.find_elements_by_css_selector("div.TiMu>div.Py_answer>span:first-child")
            choose_a = driver.find_elements_by_css_selector("div.TiMu>div.Py_answer>span>i.font20")
            i = 0
            file.write(title.text + "开始\n")
            while i < num:
                try:
                    file.write(test[a].text + "\n" + choices[b].text + choices_2[b].text + "\n" + choices[b+1].text+ choices_2[b+1].text +"\n" + choices[b+2].text + choices_2[b+2].text +"\n" + choices[b+3].text+choices_2[b+3].text + "\n" + myanswer[d].text + "\n\n")
                    a+=1
                    b+=4
                    d+=1
                except:
                    if choose_a[c].text == "√":
                        choose_a[c] = "对"
                    elif choose_a[c].text == "×":
                        choose_a[c] = "错"
                    file.write(test[a].text + "\n" + choose_a[c] + "\n\n")
                    a+=1
                    c+=1
                i += 1
            file.write(title.text + "结束\n")
            driver.back()
            current_Chapter += 1
        driver.quit()

完整代码

from selenium import webdriver
import time

class GetMooc():
    def initiate(self):
        usernm = input("请输入您的手机号")
        passwd = input("请输入您的密码")
        driver = webdriver.Chrome()
        url = 'http://passport2.chaoxing.com/login?fid=1467&refer=&newversion=true'
        driver.get(url)
        self.login(driver)
    def login(self,driver):
        usernm = driver.find_element_by_class_name("ipt-tel")
        usernm.send_keys(usernm)
        passwd = driver.find_element_by_class_name("ipt-pwd")
        passwd.send_keys(passwd)
        login = driver.find_element_by_class_name("btn-big-blue")
        login.click()
        input("请将页面切换至课程作业页面后在输入框按回车键")
        file = open('c.txt', 'w')
        self.getChapter(driver,file)
    def getChapter(self,driver,file):
        handles = driver.window_handles
        driver.switch_to.window(handles[-1])
        chapters = driver.find_elements_by_class_name("Btn_blue_1")
        current_Chapter = 0
        print("开始获取章节题目")
        while current_Chapter < len(chapters):
            a = 0
            b = 0
            c = 0
            d = 0
            handles = driver.window_handles
            driver.switch_to.window(handles[-1])
            chapters = driver.find_elements_by_class_name("Btn_blue_1")
            chapters[current_Chapter].click()
            time.sleep(1)
            title = driver.find_element_by_css_selector("li.cur")
            test = driver.find_elements_by_css_selector("div.CeYan>div.ZyBottom>div.TiMu>div.Zy_TItle>div.clearfix>div:first-child")
            num = len(test)
            choices = driver.find_elements_by_css_selector("div.CeYan>div.ZyBottom>div.TiMu>ul>li>i")
            choices_2 = driver.find_elements_by_css_selector("div.CeYan>div.ZyBottom>div.TiMu>ul>li>a")
            myanswer = driver.find_elements_by_css_selector("div.TiMu>div.Py_answer>span:first-child")
            choose_a = driver.find_elements_by_css_selector("div.TiMu>div.Py_answer>span>i.font20")
            i = 0
            file.write(title.text + "开始\n")
            while i < num:
                try:
                    file.write(test[a].text + "\n" + choices[b].text + choices_2[b].text + "\n" + choices[b+1].text+ choices_2[b+1].text +"\n" + choices[b+2].text + choices_2[b+2].text +"\n" + choices[b+3].text+choices_2[b+3].text + "\n" + myanswer[d].text + "\n\n")
                    a+=1
                    b+=4
                    d+=1
                except:
                    if choose_a[c].text == "√":
                        choose_a[c] = "对"
                    elif choose_a[c].text == "×":
                        choose_a[c] = "错"
                    file.write(test[a].text + "\n" + choose_a[c] + "\n\n")
                    a+=1
                    c+=1
                i += 1
            file.write(title.text + "结束\n")
            driver.back()
            current_Chapter += 1
        driver.quit()
if __name__ == '__main__':
    samuel = GetMooc()
    samuel.initiate()

一键做题脚本

导入库

from selenium import webdriver
import time
import re

模拟登录

    def initiate(self):
        file = open('c.txt', 'r')
        self.load(file)
    def load(self,file):
        file = file.read()
        self.web(file)
    def web(self,file):
        usernma = input("请输入您的账号")
        passwda = input("请输入您的密码")
        driver = webdriver.Chrome()
        url = 'http://passport2.chaoxing.com/login?fid=1467&refer=&newversion=true'
        driver.get(url)
        usernm = driver.find_element_by_class_name("ipt-tel")
        usernm.send_keys(usernma)
        passwd = driver.find_element_by_class_name("ipt-pwd")
        passwd.send_keys(passwda)
        login = driver.find_element_by_class_name("btn-big-blue")
        login.click()
        input("请进入毛概课程的作业页面 然后在此界面点击回车")
        self.request(driver, file)

爬取题目

    def request(self,driver,file):

        handles = driver.window_handles
        driver.switch_to.window(handles[-1])
        chapters = driver.find_elements_by_css_selector("div.titOper>p.clearfix>a.Btn_red_1")
        current_Chapter = 0
        while current_Chapter < len(chapters):
            a = 0
            b = 0
            handles = driver.window_handles
            driver.switch_to.window(handles[-1])
            chapters = driver.find_elements_by_css_selector("div.titOper>p.clearfix>a.Btn_red_1")
            chapters[current_Chapter].click()
            time.sleep(2)
            tests = driver.find_elements_by_css_selector("div.ZyBottom>div.TiMu>div.Zy_TItle>div:nth-child(2)")

题库比对

            for test in tests:
                choices = driver.find_elements_by_css_selector("ul.Zy_ulTop>li>a.after")
                test = test.text
                if "(" in test:
                    test = re.sub('\(', "\(", test)
                    test = re.sub('\)', "\)", test)
                if "?" in test:
                    test = re.sub('\?', "\?", test)
                if "." in test:
                    test = re.sub('\.', "\.", test)
                try:
                    # result = re.findall(test + r"\nA、(.*?)\nB、(.*?)\nC、(.*?)\nD、(.*?)\n"+ r"我的答案:|正确答案:" + r"(.*?)\n", file)
                    result = re.findall(test + r"\nA、(.*?)\nB、(.*?)\nC、(.*?)\nD、(.*?)\n"+ r"[我正][的确]答案:"+ r"(.*?)\n", file)
                    print(test)
                    print(result)
                    myanswer = result[0][4]

做题操作

					choices = driver.find_elements_by_css_selector("ul.Zy_ulTop>li>a.after")
                    if "A" in myanswer:
                        for item in choices[b:b+4]:
                            if item.text in result[0][0]:
                                item.click()
                    if "B" in myanswer:
                        for item in choices[b:b+4]:
                            if item.text in result[0][1]:
                                item.click()
                    if "C" in myanswer:
                        for item in choices[b:b+4]:
                            if item.text in result[0][2]:
                                item.click()
                    if "D" in myanswer:
                        for item in choices[b:b+4]:
                            if item.text in result[0][3]:
                                item.click()
                    b += 4

                except:
                    result = re.findall(test + r"\n(.*?)\n", file)
                    choices = driver.find_elements_by_css_selector("div.TiMu>ul.Zy_ulBottom>li>input")
                    if result[0] == "对":
                        choices[a].click()
                        a += 2
                    elif result[0] == "错":
                        choices[a+1].click()
                        a += 2
                        # by_css_selector("div.AlertCon02>div.con03>div.marTop30>a.bluebtn")
            time.sleep(1)
            submit = driver.find_element_by_css_selector("div.ZY_sub>a.Btn_blue_1")
            submit.click()
            time.sleep(3)

完整代码

from selenium import webdriver
import time
import re

class DoMooc():
    def initiate(self):
        file = open('c.txt', 'r')
        self.load(file)
    def load(self,file):
        file = file.read()
        self.web(file)
    def web(self,file):
        usernma = input("请输入您的账号")
        passwda = input("请输入您的密码")
        driver = webdriver.Chrome()
        url = 'http://passport2.chaoxing.com/login?fid=1467&refer=&newversion=true'
        driver.get(url)
        usernm = driver.find_element_by_class_name("ipt-tel")
        usernm.send_keys(usernma)
        passwd = driver.find_element_by_class_name("ipt-pwd")
        passwd.send_keys(passwda)
        login = driver.find_element_by_class_name("btn-big-blue")
        login.click()
        input("请进入毛概课程的作业页面 然后在此界面点击回车")
        self.request(driver, file)
    def request(self,driver,file):

        handles = driver.window_handles
        driver.switch_to.window(handles[-1])
        chapters = driver.find_elements_by_css_selector("div.titOper>p.clearfix>a.Btn_red_1")
        current_Chapter = 0
        while current_Chapter < len(chapters):
            a = 0
            b = 0
            handles = driver.window_handles
            driver.switch_to.window(handles[-1])
            chapters = driver.find_elements_by_css_selector("div.titOper>p.clearfix>a.Btn_red_1")
            chapters[current_Chapter].click()
            time.sleep(2)
            tests = driver.find_elements_by_css_selector("div.ZyBottom>div.TiMu>div.Zy_TItle>div:nth-child(2)")
            for test in tests:
                choices = driver.find_elements_by_css_selector("ul.Zy_ulTop>li>a.after")
                test = test.text
                if "(" in test:
                    test = re.sub('\(', "\(", test)
                    test = re.sub('\)', "\)", test)
                if "?" in test:
                    test = re.sub('\?', "\?", test)
                if "." in test:
                    test = re.sub('\.', "\.", test)
                try:
                    # result = re.findall(test + r"\nA、(.*?)\nB、(.*?)\nC、(.*?)\nD、(.*?)\n"+ r"我的答案:|正确答案:" + r"(.*?)\n", file)
                    result = re.findall(test + r"\nA、(.*?)\nB、(.*?)\nC、(.*?)\nD、(.*?)\n"+ r"[我正][的确]答案:"+ r"(.*?)\n", file)
                    print(test)
                    print(result)
                    myanswer = result[0][4]
                    choices = driver.find_elements_by_css_selector("ul.Zy_ulTop>li>a.after")
                    if "A" in myanswer:
                        for item in choices[b:b+4]:
                            if item.text in result[0][0]:
                                item.click()
                    if "B" in myanswer:
                        for item in choices[b:b+4]:
                            if item.text in result[0][1]:
                                item.click()
                    if "C" in myanswer:
                        for item in choices[b:b+4]:
                            if item.text in result[0][2]:
                                item.click()
                    if "D" in myanswer:
                        for item in choices[b:b+4]:
                            if item.text in result[0][3]:
                                item.click()
                    b += 4

                except:
                    result = re.findall(test + r"\n(.*?)\n", file)
                    choices = driver.find_elements_by_css_selector("div.TiMu>ul.Zy_ulBottom>li>input")
                    if result[0] == "对":
                        choices[a].click()
                        a += 2
                    elif result[0] == "错":
                        choices[a+1].click()
                        a += 2
                        # by_css_selector("div.AlertCon02>div.con03>div.marTop30>a.bluebtn")
            time.sleep(1)
            submit = driver.find_element_by_css_selector("div.ZY_sub>a.Btn_blue_1")
            submit.click()
            time.sleep(3)
if __name__ == '__main__':
    samuel = DoMooc()
    samuel.initiate()
    input("按回车退出")

注意事项(重要)

  • 代码复制即可用
  • 在模拟登录完成后需要手动将页面切换至需要爬取题库&一键做题的课程作业页面,然后在控制台里按下回车
  • 为避免由于个人操作失误或代码运行错误造成不可挽回的错误,我在代码提交每章作业部分设置了手动操作部分,为了操作者能确保代码完成了所有题目。

运行操作过程与结果

爬出的题库文件截图
python超星尔雅学习通利用selenium一键建题库和一键做题_第1张图片
一键做题代码运行过程GIF图

你可能感兴趣的:(python)