刷课脚本

刷课脚本

# coding:utf-8
import time
import random
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
import warnings
 
warnings.filterwarnings('ignore')

def sleep_sed_num():
    """设置随机睡眠时间"""
    sed = random.uniform(2, 3)
    time.sleep(sed)


def login():
    """登录操作"""
    username = 'xxx'
    password = 'xxx'

    print('用户登录...')
    opt = webdriver.ChromeOptions()  # 创建浏览器
    print('\t' + "浏览器已打开")
    driver = webdriver.Chrome(options=opt)
    driver.get('http://xxx.xxx.xxx.xxx/user/login')  # 打开目标网址
    print('\t' + "登录网页已打开")
    driver.maximize_window()  # 窗口最大化
    sleep_sed_num()  # 停留几秒
    inputs = driver.find_elements_by_tag_name("input")
    for input_ in inputs:
        if input_.get_attribute("type") == "text":
            input_.send_keys(username)
            print('\t' + '用户名已输入')
            sleep_sed_num()
        if input_.get_attribute("type") == "password":
            input_.send_keys(password)
            print('\t' + '密码已输入')
    print('\t' + '请在 10 秒内输入验证码!')
    time.sleep(10)
    ele_btn_login = driver.find_element_by_class_name("login_btn")
    ele_btn_login.click()
    sleep_sed_num()
    print('\t' + '您已登录\n\n')
    return driver


def play_video(driver, website, count_courses):
    """播放视频"""
    driver.get(website)
    sleep_sed_num()
    # 获取课程的名称
    course_name = driver.find_element_by_xpath('//div[@class="video_cont"]//h2').text
    print('课程名称:', course_name)

    for i in range(1, count_courses + 1):
        # 判断视频是否播放完成,同时获取视频的链接
        a = driver.find_element_by_xpath('/html/body/div[2]/div[2]/div[4]/ul/li[%d]/a' % i)  # 定位到a标签
        href = a.get_attribute('href')  # 获取a标签下的视频链接,即href属性值
        style = a.get_attribute('style')  # 获取a标签下的style属性值,用于判断视频是否播放完成
        video_name = a.text  # 获取a标签下的文本值,即当前视频的名称

        course_time_span = driver.find_element_by_xpath(
            '/html/body/div[2]/div[2]/div[4]/ul/li[%d]/span' % i).text  # 获取视频长度

        print('\t视频名称:','%d/%d'%(i, count_courses), video_name)

        course_end_time = int(time.time()) + 3600 * int(course_time_span[0:2]) + 60 * int(course_time_span[3:5]) + int(
            course_time_span[6:8]) + 30  # 在视频长度的基础上延长30秒,即使视频的强制结束时间

        if 'red' in style:  # 判断视频是否播放完成,规则:视频名称是否变红色
            print('\t\t视频已完成\n')
            continue
        print('\t  预计播放时间:', jitime.strftime("%Y-%m-%d %H:%M:%S", time.localtime(int(time.time()))), ' ==> ',
              time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(course_end_time)))
        driver.get(href)
		
		# 弹窗检测 超过结束时间后强制结束当前视频
        count_continue = 0
        while True:
            if time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(course_end_time)) \
                    < time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(int(time.time()))):
                print('\t\t视频已完成')
                break
            time.sleep(1)
            try:
                WebDriverWait(driver, 2, 0.5).until(
                    EC.presence_of_all_elements_located((By.CLASS_NAME, "public_submit")))
                time.sleep(1)
                driver.find_element_by_class_name('public_submit').click()
                count_continue += 1
                print('\t\t已关闭【继续】弹窗次数:', count_continue, '\t',
                      time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(int(time.time()))))
                time.sleep(5)
            except:
                pass


websites = [
    ['http://xxx.xxx.xxx.xxx/fzdx/play?v_id=3510&r=video&t=2', 8],  # [课程1链接,视频个数]
    ['http://xxx.xxx.xxx.xxx/fzdx/play?v_id=3518&r=video&t=2', 7],  # [课程2,视频个数]
    ['http://xxx.xxx.xxx.xxx/fzdx/play?v_id=3526&r=video&t=2', 16],  # [课程3,视频个数]
    ['http://xxx.xxx.xxx.xxx/fzdx/play?v_id=3528&r=video&t=2', 4],  # [课程4,视频个数]
    ['http://xxx.xxx.xxx.xxx/fzdx/play?v_id=3555&r=video&t=2', 6],  # [课程5,视频个数]
    ['http://xxx.xxx.xxx.xxx/fzdx/play?v_id=3563&r=video&t=2', 4],  # [课程6,视频个数]
    ['http://xxx.xxx.xxx.xxx/fzdx/play?v_id=3568&r=video&t=2', 2],  # [课程7,视频个数]
    ['http://xxx.xxx.xxx.xxx/fzdx/play?v_id=3601&r=video&t=2', 4],  # [课程8,视频个数]
    ['http://xxx.xxx.xxx.xxx/fzdx/play?v_id=3608&r=video&t=2', 5],  # [课程9,视频个数]
    ['http://xxx.xxx.xxx.xxx/fzdx/play?v_id=3508&r=video&t=2', 8],  # [课程10,视频个数]
    ['http://xxx.xxx.xxx.xxx/fzdx/play?v_id=3509&r=video&t=2', 20],  # [课程11,视频个数]
    ['http://xxx.xxx.xxx.xxx/fzdx/play?v_id=3512&r=video&t=2', 11],  # [课程12,视频个数]
    ['http://xxx.xxx.xxx.xxx/fzdx/play?v_id=3544&r=video&t=2', 12],  # [课程13,视频个数]
    ['http://xxx.xxx.xxx.xxx/fzdx/play?v_id=3564&r=video&t=2', 3],  # [课程14,视频个数]
    ['http://xxx.xxx.xxx.xxx/fzdx/play?v_id=3579&r=video&t=2', 2],  # [课程15,视频个数]
]
if __name__ == '__main__':
    driver = login()
    for i in range(len(websites)):
        play_video(driver, websites[i][0], websites[i][1])

脚本还可以继续进行优化,可优化点:
1. 不必输入代刷课程的网址和视频个数,自动获取即可
2. 如果在视频强制结束时间内课程没有刷完,自动将视频结束时长延长,重新播放该视频
3. 有个界面会更好吧

你可能感兴趣的:(爬虫,爬虫,selenium,python)