本文主要是采用 python和selenium 来实现大学生网络某校的自动化视频课程学习,首先需要下载自己Chrome浏览器的版本驱动,然后运行脚本即可。当前版本的代码可能有一些小问题,欢迎各位大佬批评指正。本文及源代码仅限于学习交流,严禁用于商业用途!
一、Chrome驱动下载
1、查看Chrome版本
打开Chrome浏览器,在地址栏输入 chrome://version/
chrome://version/
如图所示,我们可以看到自己的Chrome的版本,“126.0.6478.57”。
2、下载驱动
点击下面的链接进入下载界面。(这个链接可能要科学上网工具)
ChromeDriver - WebDriver for Chrome - Downloads (chromium.org)
在“下载内容”界面下滑查找自己对应的版本,然后下载符合自己电脑配置的链接下载,如果下滑界面中没有自己想要的版本,则点击红色框的这个链接 。
打开红色框的链接后是以下界面,对照版本信息,只看前三位 “ 126.0.6478.* ” ,能对应上就行。
然后选择我们想要的驱动“chromedriver”,我的电脑是64位,所以我选择“win64”,然后将后面的链接复制到浏览器中就可以下载了。
3、驱动路径
我们把下载的压缩包解压,找到“chromedriver.exe”,并把它放置到与浏览器“Chrome.exe”相同的文件夹下。
我的是在:C:\Program Files\Google\Chrome\Application
然后在代码中写入:
from selenium import webdriver
# 无界面的浏览器
# option = webdriver.ChromeOptions()
# option.add_argument("headless")
# browser = webdriver.Chrome(options=option)
# 有界面的浏览器
browser = webdriver.Chrome()
二、代码部分
1、selenium的安装与使用
在环境中输入“ pip install selenium ”即可安装,安装后可能会出现版本不兼容的报错。
这种报错就按照要求上调或者下调(重新安装新版本的库)库的版本就可以了。
2、登录
首先,输入用户名和密码,实现登录。
def login():
# Find the login elements and login
try:
print("----------输入用户名和密码进行登录----------")
# 用户输入用户名和密码
input_username = input("请输入您的用户名:")
input_password = input("请输入您的密码:")
# input_username = "1"
# input_password = "2"
# 等待用户名和密码输入框可见
username = WebDriverWait(browser, 10).until(
EC.presence_of_element_located((By.XPATH, '//form[1]/div[1]/div[2]/div[1]/div[1]/input[1]'))
)
password = WebDriverWait(browser, 10).until(
EC.presence_of_element_located((By.XPATH, '//form[1]/div[1]/div[2]/div[1]/div[2]/input[1]'))
)
print("正在输入用户名 ...")
username.send_keys(input_username)
time.sleep(1) # 确保输入框切换到密码框
print("正在输入密码 ...")
password.send_keys(input_password)
time.sleep(1)
# 填写完成后自动点击进行登录
print("正在登录 ...\n")
login_button = WebDriverWait(browser, 10).until(
EC.element_to_be_clickable((By.XPATH, "//form[1]/div[1]/div[2]/div[1]/div[4]/button"))
)
login_button.click()
time.sleep(3)
if "login" not in browser.current_url:
print("成功登录,当前URL为:", browser.current_url)
realname = browser.find_element(By.CLASS_NAME, "red").text
print(realname)
else:
print("登录失败!请检查您的用户名和密码是否正确!")
# 判断是否密码错误,如果密码错误,会有一个提示,则重新输入账号密码
while True:
try:
error_message = WebDriverWait(browser, 10).until(
EC.presence_of_element_located((By.XPATH, '//form[1]/div[1]/div[2]/div[1]/div[2]/label'))
)
print("系统错误消息文本:", error_message.text) # 打印错误消息文本内容
if error_message.text == "用户名或密码错误" or error_message.text == "用户名或密码错误!":
print("用户名或密码错误,请重新输入")
input_username = input("请输入您的用户名:")
input_password = input("请输入您的密码:")
username.clear()
password.clear()
username.send_keys(input_username)
password.send_keys(input_password)
browser.find_element(By.XPATH, "//form[1]/div[1]/div[2]/div[1]/div[4]/button").click()
time.sleep(3)
if "login" not in browser.current_url:
break
else:
break
except Exception as e:
print(f"Error: {e}")
break
# Wait for login to complete
time.sleep(3)
except Exception as e:
print(f"Error logging in: {e}")
browser.close()
3、进入学习,检查专题课程列表
登录成功后,需要按照自己的课程来设置要刷哪几个部分。这里设置的是刷前面两个专题课程。如果只是刷完要求的时间,不用修改;如果要把全部课程都看完,把判断的值改成<150。
def start_courses():
# Find the study elements and study
try:
print("\n进入学习 ......")
study_button = WebDriverWait(browser, 10).until(
EC.presence_of_element_located((By.XPATH, '//body/div[2]/div[7]/div[2]/div[1]/div[2]/div[1]/div[2]/div[1]/div[3]/p[1]/a'))
)
browser.execute_script("arguments[0].click();", study_button)
time.sleep(3)
if len(browser.window_handles) > 1:
# 切换到新窗口
browser.switch_to.window(browser.window_handles[1])
print("切换到新窗口 ......")
print("查看专题课程列表 ......")
courses = browser.find_elements(By.CLASS_NAME, "xxk")
courses_completed = 0 # 初始化已完成课程数
while courses_completed < 2: # len(courses)
courses = browser.find_elements(By.CLASS_NAME, "xxk")
for course_index in range(2): # len(courses)
course = browser.find_elements(By.CLASS_NAME, "xxk")[course_index]
try:
course_title = course.find_element(By.TAG_NAME, "h2").text
print(f"\n🔴 检查课程: {course_title}")
progress_text = course.find_element(By.CLASS_NAME, "jd").text
progress_percentage = float(progress_text.replace('%', ''))
print(f">>>>>>>>>> 完成度: {progress_percentage}%")
if progress_percentage < 100.0:
courses_completed += 1 # 发现未完成课程
print(f"\n开始课程: {course_title}")
view_button = course.find_element(By.CLASS_NAME, "btnBig2")
view_button.click()
watch_video_and_complete(course_title)
# browser.switch_to.window(browser.window_handles[1]) # 切换回课程列表窗口
else:
print(f"✔ 已完成课程: {course_title}")
except Exception as e:
print(f"Error processing course {course_title}: {e}")
if courses_completed == 2: # len(courses)
print("所有课程已完成!")
browser.close()
break
else:
print("等待未完成课程 ...")
time.sleep(5) # 等待 60 秒后再次检查
else:
print("未切换到新窗口 ......")
except Exception as e:
print(f"Error studying: {e}")
browser.close()
4、进入课程,检查章节列表
进入专题,依次检查每个章节是否完成度100%,完成则跳过。
def watch_video_and_complete(course_title):
"""观看视频并完成课程"""
print(f"开始观看视频课程: {course_title}")
try:
course_list_div = WebDriverWait(browser, 30).until(
EC.presence_of_element_located((By.ID, "J_listContent"))
)
chapters_total = len(course_list_div.find_elements(By.CSS_SELECTOR, "tbody tr[class]"))
chapters_completed = 0 # 初始化已完成章节数
while chapters_completed < chapters_total:
chapters = course_list_div.find_elements(By.CSS_SELECTOR, "tbody tr[class]")
for chapter_index in range(len(chapters)):
# 每次循环迭代开始时,重新定位 chapter 元素
chapter = chapters[chapter_index]
try:
progress_elements = chapter.find_elements(By.CSS_SELECTOR, ".progressvalue")
if not progress_elements:
print("进度值元素未找到,跳过检查")
continue
progress_text = progress_elements[0].text
progress_percentage = float(progress_text.replace('%', ''))
if progress_percentage < 100.0:
print(f"\n>>> 开始章节: {chapter.text},完成度:{progress_percentage}%")
view_button = chapter.find_element(By.CLASS_NAME, "golearn")
# 使用JavaScript点击被覆盖的元素
browser.execute_script("arguments[0].click();", view_button)
browser.switch_to.window(browser.window_handles[-1])
WebDriverWait(browser, 10).until(
EC.presence_of_element_located((By.XPATH, "//body/div[2]/div[1]/div[2]/div[1]/ul[1]/li[1]/div[2]/ul/li"))
)
video_list = browser.find_elements(By.XPATH, "//body/div[2]/div[1]/div[2]/div[1]/ul[1]/li[1]/div[2]/ul/li")
# 播放视频列表
flag = watch_video_list(video_list)
if flag is True:
chapters_completed += 1 # 章节完成度+1
break # 跳出当前章节循环,重新获取章节列表
else:
chapters_completed += 1 # 章节完成度+1
print(f"\n章节 {chapter.text} 已完成,跳过")
except Exception as e:
print(f"处理章节时出错: {e}")
except Exception as e:
print(f"Error: {e}")
print(f"\n完成观看视频课程: {course_title}")
browser.back()
browser.refresh()
5、进入章节,检查视频列表
检查章节内的视频是否完成度100%,完成则跳过。这里视频播放速度设置为2.5倍。
def watch_video_list(video_list):
"""播放章节中的视频列表"""
for video_item in video_list:
# 创建并启动弹窗检查线程
popup_thread = threading.Thread(target=check_popup)
popup_thread.daemon = True # 设置为守护线程,主线程结束时自动退出
popup_thread.start()
progress_element = video_item.find_element(By.CLASS_NAME, "cvtb-MCK-CsCt-studyProgress")
progress_percentage = float(progress_element.text.replace('%', ''))
if progress_percentage < 100.0:
print(f"\n--> 视频 {video_item.accessible_name} 未完成,即将播放 ......")
video_item.click()
video_element = WebDriverWait(browser, 20).until(
EC.presence_of_element_located((By.TAG_NAME, "video"))
)
# 获取视频时长并转换为秒数
video_length_element = video_item.find_element(By.CLASS_NAME, "cvtb-MCK-CsCt-length")
video_length = video_length_element.text
hours, minutes, seconds = map(int, video_length.split(":"))
video_duration = (hours * 3600) + (minutes * 60) + seconds
time.sleep(5)
print(f"▶️正在播放:视频 {video_item.accessible_name} ......")
# 使用 JavaScript 设置播放速度
browser.execute_script("arguments[0].playbackRate = 2.5;", video_element)
# 等待视频播放完毕
print(f"▶️等待视频播放 {video_duration / 2.5} 秒 ......")
time.sleep(video_duration / 2.5)
print(f"视频播放完毕,即将检查进度 ......")
# 等待一段时间以确保视频播放完成
time.sleep(3)
progress_element = video_item.find_element(By.CLASS_NAME, "cvtb-MCK-CsCt-studyProgress")
progress_percentage = float(progress_element.text.replace('%', ''))
if progress_percentage < 100.0:
print(f"视频未完成,请重新播放")
video_item.click()
else:
print(f"视频 {video_item.accessible_name} 已完成")
else:
print(f"\n--> 视频 {video_item.accessible_name} 已完成,跳过")
continue
# 在播放完所有视频后刷新页面
browser.close()
browser.switch_to.window(browser.window_handles[-1])
browser.refresh()
return True
6、检查并关闭弹窗线程
观看20分钟就会有弹窗,关闭弹窗的线程每隔2秒检查一次是否出现弹窗。
def check_popup():
"""检查弹窗并关闭"""
while True:
try:
# 检查弹窗是否出现
rest_tip = WebDriverWait(browser, 5).until(
EC.presence_of_element_located((By.ID, "rest_tip"))
)
# 点击继续学习按钮
continue_button = rest_tip.find_element(By.TAG_NAME, "button")
continue_button.click()
print("已关闭弹窗,继续学习!")
except:
# print("未检测到弹窗")
pass
time.sleep(2) # 每隔 2 秒检查一次弹窗
7、main函数
欢迎各位大佬批评指正!欢迎各位评论关注留言!如需转载,请附上本文原文出处。
版权归原作者 菜狗裹裹 所有, 如有侵权,请联系我们删除。