python使用selenium全自动刷学习视频教程

使用selenium进行全自动刷学习视频的教程

一、目的

可以将烦人的观看学习视频的操作丢在一旁,专心的做自己喜欢做的事情。让selenium帮你完成,体验selenium带来的识别观看答题一条龙服务。

二、实现思路

  1. 先人工的体验一番观看视频的流程(包括但不限于:登录、进入页面、查看课程、查看课程所有章节视频、观看课程视频、完成答题操作、记录观看视频中遇到的所有弹框情况、记录观看完视频所表现的特点)
  2. 对以上体验的流程进行更深入的分析,对每个特征的html代码进行查看(浏览器中按F12),记录对应的元素classname、name、id等信息
  3. 规划程序的执行流程,对有可能出现的情况进行判断监测,做好页面未及时刷新,程序找不到元素时的应对措施(至关重要),对出现的bug问题进行记录,保持一个良好的心态(因为基本上视频都是不能加速的,有些更是不可以重复观看的,所以有些出现的情况得试好几个视频才会出现)
  4. 最后,coding

三、上代码(刚写的一个脚本示例)

我使用到的是Chrome的驱动,驱动下载地址:https://sites.google.com/a/chromium.org/chromedriver/downloads
根据Chrome的版本号下载对应的驱动。

1.首先开个Thread线程,在init中定义一些使用到的参数

class checkStatusThread(threading.Thread):
    def __init__(self):
        super(checkStatusThread, self).__init__()
        self.browser = webdriver.Chrome()
        # gd省专业技术人员继续教育系统(个人)登录url
        self.loginUrl = 'http://ggfw.gdhrss.gov.cn/ssologin/login?service=http%3A%2F%2Fggfw.gdhrss.gov.cn%2Fzjjyweb%2Fuser%2Findex.do'
        self.username = "xxx"
        self.password = "xxx"
        self.loginStatus = False
        self.checkClassStatus = False
        self.checkClassLoding = False
        self.watchStatus = False
        #课程列表
        self.classList = []
        self.classBtns = []
    def run(self):
        while True:
        	# 监测登录状态
            if not self.loginStatus:
                self.login()
            # 监测是否登录,判断是否可以进行课程检测
            if self.loginStatus and not self.checkClassStatus and not self.checkClassLoding:
                self.checkClass()
            # 监测是否可以进行视频的观看
            if self.loginStatus and  self.checkClassStatus and not self.checkClassLoding:
                self.watch()

2.登录的方法

    def login(self): #验证码识别有点难度,先不做自动登录,暂时使用人工输入验证码
        # 登录
        print('login')
        while not self.loginStatus:
            self.browser.get(self.loginUrl)
            self.browser.find_element_by_name('username').clear()
            self.browser.find_element_by_name('username').send_keys(self.username)
            time.sleep(1)
            self.browser.find_element_by_name('password').clear()
            self.browser.find_element_by_name('password').send_keys(self.password)
            self.vcode = input("请手动输入验证码:")
            self.browser.find_element_by_name('vcode').clear()
            self.browser.find_element_by_name('vcode').send_keys(self.vcode)
            time.sleep(1)
            self.browser.find_element_by_id("doPersonLogin").click()  # 这里登录
            time.sleep(3)
            #判断是否登录成功
            #首先判断是否有错误信息
            try:
                erro = self.browser.find_element_by_id('client_error_personal')
                print(erro.text)
            except:
                print("检测是否登录")
            checkNum = 0
            while checkNum <10:
                try:
                    cookie = self.browser.get_cookie("JSESSIONID")
                    if cookie['path'] == '/zjjyweb':
                        print("已登录")
                        self.loginStatus=True
                        break
                    else:
                        print('检测中', checkNum)
                        checkNum = checkNum + 1
                        time.sleep(1)
                except:
                    print('检测中',checkNum)
                    checkNum = checkNum+1
                    time.sleep(1)
        #前往公需课页面
        self.browser.find_element_by_id("treeDemo_13_a").click()

3.检测我的课程方法

    # 检查我的课程
    def checkClass(self):
        try:
            self.checkClassLoding = True
            courses = self.browser.find_elements_by_class_name('box-course')
            for course in courses:
                title = course.find_elements_by_class_name('box-course-title-cont')
                if title[0].text == "我的课程":
                    print(title[0].text)
                    courseList = course.find_elements_by_class_name('box-course-list')
                    print(len(courseList))
                    for courseItem in courseList:
                        # 添加我的课程到缓存列表中
                        self.classList.append(courseItem)
                    self.checkClassLoding = False
                    self.checkClassStatus = True

        except Exception as e:
            print("识别错误",e)

4.切换窗口句柄

    # 切换窗口句柄
    def getcurrentWin(self,num):
        handles = self.browser.window_handles
        # 将browser与新的页面绑定起来
        self.browser.switch_to_window(handles[num])

5.开始观看视频方法

    #开始观看视频
    def watch(self):
        for br in range(len(self.classList)):
            self.getcurrentWin(0)
            time.sleep(1)
            self.classList[br].find_elements_by_class_name("item-cont-descr-text-btn-choice")[0].click()
            # 更新窗口句柄
            self.getcurrentWin(-1)
            time.sleep(1)
            self.classBtns.append(self.browser.find_elements_by_class_name("append-plugin-tip"))
            try:
                if len(self.classBtns)>0:
                    #进入章节视频
                    self.browser.find_elements_by_class_name("append-plugin-tip")[0].click()
                    while True:
                        # 点击播放
                        while True:
                            try:
                                self.browser.find_elements_by_class_name('prism-big-play-btn')[0].click()
                                self.watchStatus = True
                                break
                            except:
                                time.sleep(1)
                        while self.watchStatus:
                            self.watchStatus = self.checkWatch()
                            time.sleep(5)
                        print("看完一个章节啦")
                        #获取当前页面的其他章节
                        newNum = 0
                        while newNum<15:
                            try:
                                self.newclassBtns = self.browser.find_elements_by_class_name("append-plugin-tip")
                                if len(self.newclassBtns)>1:
                                    # 进入章节视频
                                    self.newclassBtns[1].click()
                                    break
                            except:
                                time.sleep(2)
                                newNum= newNum+1
                                print("获取章节错误")
            except Exception as e1:
                print("观看时发生错误",e1)

6.监测在观看视频过程中遇到的情况的方法

    def checkWatch(self):
        percentNum = 0
        watchStatus = True
        percent = ""
        while percentNum<15:
            try:
                percent = self.browser.find_element_by_id('realPlayVideoTime').text
                print("观看进度%s/100" % (percent))
                break
            except:
                percentNum = percentNum+1
                time.sleep(3)
        if percentNum >10 or percent == "已完成":
            watchStatus = False
        # 判断是否需要重试刷新
        try:
            operation = self.browser.find_elements_by_class_name('prism-error-operation')
            operation[0].find_elements_by_class_name("prism-button-refresh")[0].click()
            print("已刷新重试")
            # 点击播放
            while True:
                try:
                    self.browser.find_elements_by_class_name('prism-big-play-btn')[0].click()
                    break
                except:
                    time.sleep(1)
        except:
            eee=1
        # 判断问题
        try:
            panel = self.browser.find_elements_by_class_name('panel')
            panduan = panel[0].find_elements_by_class_name('exam-subject-text-queanswar-answer')[0]
            panduan.find_element_by_name('panduan').click()
            print("选择第一个选项")
            time.sleep(1)
            panel[0].find_elements_by_class_name('reply-sub')[0].click()
            chooseStatus = False
            while not chooseStatus:
                try:
                    self.browser.find_elements_by_class_name('l-btn-small')[0].click()
                    chooseStatus = True
                except:
                    time.sleep(3)
        except:
            eee = 2
        return watchStatus

四、结尾

每个对应的网站所使用到的应对机制都有差别,但是用到的技术基本没怎么变化

发布了6 篇原创文章 · 获赞 4 · 访问量 2561
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览