用Python来自动刷智慧树网站的网课

时间:2024-03-12 11:49:21

学校最近让看什么网课,智慧树网站的,太无聊了,写个脚本刷下,这里是用Python+selenium实现的,也可以用js脚本,更简单,但是我这里刚好最近在学python,就顺便练习下,说下有几个点,

1.这里为了练习顺便把登陆功能也做了,注意有一个自动联想元素,需要定位并点击它

2.有两个弹窗,只解决了一个,另一个不知为什么定位不到,所以这里需要手动点击一次,

3.视频中间会有问题弹窗出现,不处理弹窗不会继续播放,这里使用循环不断判断能否定位到弹窗,定位到了就对弹窗进行处理,获取网页源代码并定位问题的name,之后定位并随便选择一个答案作答,

4.这里设置了1.5倍速播放,注意需要先控制鼠标移动到播放窗口处,才能定位到速度按钮

5.其实也可以直接启动浏览器之后,自己进行登录操作,然后运行指定代码,

6.注意需要更改代码中的学校,学号,密码为自己的信息

网站的url:     http://study.zhihuishu.com/learning/videoList;       具体到个人可能会有一些其他的参数,不过不影响

欢迎交流。。

具体代码如下:

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException, NoSuchFrameException
import time
from selenium.webdriver.common.action_chains import ActionChains
from bs4 import BeautifulSoup

if __name__ == \'__main__\':
    print(\'stART\')
    url = \'http://study.zhihuishu.com/learning/videoList;jsessionid=075B1012EC3EFA6EB79A19B1FF96EA44;jsessionid=709212495C7D26BCC1F884A2D4EEC2D9?recruitAndCourseId=4b585c5f4252415846425e5150\'
    browser = webdriver.Chrome()
    wait = WebDriverWait(browser, 10)
    browser.get(url)
    wait.until(EC.element_to_be_clickable((By.LINK_TEXT, \'学号\'))).click()
    wait.until(EC.presence_of_element_located((By.ID, \'quickSearch\'))).send_keys(\'学校名字\')
    wait.until(EC.presence_of_element_located((By.ID, \'clCode\'))).send_keys(\'学号\')
    wait.until(EC.presence_of_element_located((By.ID, \'clPassword\'))).send_keys(\'密码\')
    wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, \'#schoolListCode > li:nth-child(2)\'))).click()
    wait.until(EC.element_to_be_clickable((By.CLASS_NAME, \'wall-sub-btn\'))).click()
    wait.until(EC.presence_of_element_located((By.LINK_TEXT, \'确定\'))).click()
    # 这块手动点下我已统一
    flag = 0
    i = 1
    k = 1
    time.sleep(5)
    while True:
        if k == 1:
            print("播放地", i, \'个视频\')
            a = wait.until(EC.presence_of_element_located((By.CLASS_NAME, \'videoArea\')))
            ActionChains(browser).move_to_element(a).perform()
            speed = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, \'#vjs_mediaplayer > div.controlsBar > div.speedBox\')))
            speed.click()
            speed_15 = wait.until(EC.presence_of_element_located((By.CLASS_NAME, \'speedTab15\')))
            speed_15.click()
            k = 0
        while True:
            try:
                a = wait.until(EC.presence_of_element_located((By.CLASS_NAME, \'videoArea\')))
                ActionChains(browser).move_to_element(a).perform()
                isFinsh = (browser.find_element_by_class_name(\'passTime\').get_attribute(\'style\') == \'width: 100%;\')
                if isFinsh:
                    break
                browser.switch_to.frame(\'tmDialog_iframe\')
                print("弹窗出现")
                flag = 1
                break
            except NoSuchFrameException:
                pass
        if flag == 1:  # 关闭弹窗
            print("关闭弹窗")
            soup = BeautifulSoup(browser.page_source)
            name = soup.find(class_=\'answerOption\').input.attrs[\'name\']
            a = wait.until(EC.presence_of_element_located((By.NAME, name)))
            a.click()
            #browser.find_element_by_name(\'question561294\').click()
            browser.switch_to.default_content()
            browser.find_element_by_link_text(\'关闭\').click()
            print("关闭成功")
            flag = 0
        else:  # 播放下一个视频
            print("播放完了第", i, \'个视频\')
            i += 1
            browser.find_element_by_link_text(\'下一节\').click()
            isFinsh = False
            k = 1
            time.sleep(2)