环境配置
# 没有安装 selenium 库,可以通过以下命令进行安装
pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple
去半自动化
半自动化的体现:滑块验证码
想要绕过滑块验证验证,文章可以参考破解滑动验证码最新版本(97%左右通过率) - Damon- - 博客园 (cnblogs.com)
半自动化代码实现
登入阶段
from selenium.webdriver import Edge
from selenium.webdriver.common.by import By
driver = Edge()
driver.maximize_window()
driver.get('https://onlineweb.zhihuishu.com/')
driver.find_element(By.NAME, 'username').send_keys('你的智慧树账号')
driver.find_element(By.NAME, 'password').send_keys('你的智慧树密码')
driver.find_element(By.CLASS_NAME, 'wall-sub-btn').click()
# 等待验证
课程读取
import time
# url 为你的课程link
driver.get('https://studyvideoh5.zhihuishu.com/stuStudy?recruitAndCourseId=485b5159415e4859454a5859584351425d')
# 取消界面弹窗
try:
time.sleep(0.5)
driver.find_element(By.CLASS_NAME, 'iconguanbi').click()
except:
print("弹窗已经解除或者请手动关闭")
# 获取视频列表
programs = driver.find_elements(By.CLASS_NAME, 'cataloguediv-c')
解决播放可能遇到的问题
class video_play:
def __init__(self, driver) -> None:
self.driver = driver
self.test_capture() # 捕捉答题窗口
def play(self, item):
# 前置准备 ------------------------------------------------------------------------------------------------
self.item = item
self.item.click()
time.sleep(2) # 切换缓冲时间
self.test_capture() # 捕捉答题窗口
self.video_title = self.driver.execute_script("return arguments[0].parentNode;", self.item).text.split()
self.video_title = " ".join(self.video_title[:2])
section = self.section_check()
checked = self.finished_check()
if section == True:
print(self.video_title, "学习完成")
elif checked == True:
print(self.video_title, "视频学习完成")
# 学习模式 ------------------------------------------------------------------------------------------------
else:
print(self.video_title, "开始学习")
time.sleep(1) # 切换缓冲时间
self.click_display()
self.speed_change(1.5) # 倍速控制
while True:
checked = self.finished_check()
if checked == True:
print("\n" + self.video_title + ", 视频学习完成")
break
# 答题检测
self.test_capture(1)
self.progress_bar()
def speed_change(self, speed):
speedTab = {0.5:'speedTab05', 1:'speedTab10', 1.5:'speedTab15'}
self.driver.find_element(By.CLASS_NAME, 'speedBox').click()
self.driver.find_element(By.CLASS_NAME, speedTab[speed]).click()
def test_capture(self, option=0):
try:
answers = self.driver.find_elements(By.CLASS_NAME, 'item-topic')
answers[option].click()
diglog_footers = self.driver.find_elements(By.CLASS_NAME, 'dialog-footer')
index = [x.text for x in diglog_footers].index('关闭')
diglog_footers[index].click()
self.click_display()
except:
pass
def progress_bar(self):
try:
progress = self.item.find_element(By.CLASS_NAME, 'progress-num').text
print(f'\r{self.video_title}, 当前进度为: {progress}', end="")
except:
pass
def finished_check(self):
try:
self.item.find_element(By.CLASS_NAME, 'time_icofinish')
return True
except:
pass
def section_check(self):
try:
self.item.find_element(By.CLASS_NAME, 'small-lesson')
return True
except:
pass
def click_display(self):
self.driver.find_element(By.CLASS_NAME, 'videoArea').click()
剩下的交给时间
F = video_play(driver)
for item in programs:
F.play(item)
time.sleep(1)
# 给程序反应时间