俗话说得好,学无止境,活到老学到老,浅尝辄止或半途而废,就学不到高深的技艺。我可以用自身经历告诉你,这句话说的没毛病。

        退伍回来10个多月,奈何没有相关的软件测试工作经验和经历,而且毕业四五年没碰过了软件专业了,加之现在疫情的变化无常,报培训班时间不够自由,所以回来边恶补专业知识,边找相关工作。只能是四处碰壁,让我学习的欲望更加强烈。

        话不多说,因为某免费课上的一些学习视频总是缺三少两,而且好多都不在一个地方,要看完看全比较耗费时间,也很容易漏掉一些知识点,于是我便想将视频都下载下来,这个免费视频网站上的课程只能在手机上下载,但是有网页版,所以找资料自己捣鼓,正好将前期学习的部分知识应用其中,将视频自动下载下来了,接下来就将我的自动下载视频经验分享给大家。


目    录

        一、分析网站元素,下载视频数据

        1、分析网站元素

        2、下载视频数据

        二、下载视频同时重命名

        1、自动打开迅雷软件

        三、全部代码

        1、迅雷自动下载视频并重命名主代码

        2、迅雷自动下载视频并重命名函数代码

        四、知识技能点


        一、分析网站元素,下载视频数据

        1、分析网站元素

        (1)视频网址(找你需要下载的视频网址哦)

        (2)页面元素(F12:找你视频名称、视频元素所在的元素)

       视频选集列表元素(含有视频名称、每个视频的网站地址(但不是下载视频地址))

<div class="course-list" data-v-8ea4e40c data-v-46cb2ba1></div>

python生成迅雷种子文件 python调用迅雷并下载_python

        视频下载地址元素(我这个在播放视频所在的div元素里)

<video class="vjs-tech" id="vjs_video_3_html5_api" tabindex="-1" autoplay="" src="https://xxx.com/xxx.mp4"></video>

python生成迅雷种子文件 python调用迅雷并下载_爬虫_02

     

        2、下载视频数据

         (1)将视频名称、视频网站地址和视频下载地址存储到文件中,方便后续操作

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author:bigbear
# datetime:2022/9/8 20:29
# software: PyCharm

"""
    自动下载视频需求:在某免费课网站中,自动操作将视频载到本地
    操作方法:
        1、需要下载的视频地址:https://xxx.com
        2、通过F12分析页面元素:选集中包含整个视频资源的链接和名称,需要保存下来
        <div class="course-list" data-v-8ea4e40c="" data-v-46cb2ba1=""></div>
        3、查看视频元素中含有唯一一个video元素,包含MP4格式链接视频地址
        <video class="" id="_api" tabindex="-1" autoplay="" src="https://xxx.com/xxx_sd.mp4"></video>
        4、将名称和视频地址对应存储到文件中
        5、自动控制迅雷软件进行下载和改名操作
        6、进一步自动化:
    可以将多个url地址、下载内容对应的元素定位方式、存储的文件,放于一个列表、字典中,数量过多可以放于文件中
"""
import json
import time

from selenium import webdriver
from selenium.webdriver.common.by import By

# 创建浏览器对象
driver = webdriver.Edge()
# 下载视频的URL地址
url = "https://xxx.com/newview/movie"
# 打开视频页面
driver.get(url)
# 获取选集中的链接元素列表
a_ele_list = driver.find_elements(by=By.CSS_SELECTOR, value="a[title*='xxx']")
# 初始化一个数据空列表和空字典
data, data_dict = [], {}
for a_ele in a_ele_list:
    """for循环遍历每个元素,获取其标题、视频页面链接"""
    data_dict["title"] = a_ele.get_attribute("title")
    data_dict["href"] = a_ele.get_attribute("href")
    data.append(data_dict.copy())
for data_dict in data:
    """for循环遍历视频页面链接并打开,获取其视频下载链接"""
    driver.get(data_dict["href"])
    mp4_link = driver.find_element(by=By.CSS_SELECTOR, value="video").get_attribute("src")
    data_dict["mp4_link"] = mp4_link
time.sleep(2)
# 关闭浏览器
driver.quit()
with open("rep_data_63.json", "w") as f:
    """将字典列表存储到文件中"""
    f.write(json.dumps(data, indent=2))

        二、下载视频同时重命名

        1、自动打开迅雷软件

        (1)先导入pywin32

pip install pywin32

         (2)打开迅雷软件并置于窗口最前面

# 打开迅雷软件
win32api.ShellExecute(1, "open", r"C:\Program Files (x86)\Thunder Network\Thunder\Program\Thunder.exe", "", "", 1)
time.sleep(1)
# 查找迅雷句柄,并将迅雷窗口显示到最前面
foreground_windows("迅雷")

        (3)重要的一步:先将下面这几个点位的坐标获取到

import time

from reptile_func import open_file, ctrl_clipboard, foreground_windows, MouseKeyboard

# 获取键鼠
mk = MouseKeyboard()
# 获取鼠标指针的当前位置(先打开迅雷软件,并点击新建,然后运行此文件,迅速将鼠标放置于需要获取坐标的位置)
time.sleep(5)
# mk.mouse_position()

python生成迅雷种子文件 python调用迅雷并下载_开发语言_03

python生成迅雷种子文件 python调用迅雷并下载_python生成迅雷种子文件_04

        (4)点击迅雷界面上新建按钮

# 点击新建
mk.click_mouse(994, 253)

        (5)将之前获取到的视频下载链接复制(注意:这里要求每行一条链接,所以提前将所有链接按行放置)

# 获取所有的视频下载链接
mp4_data = open_file("rep_data_63.json", "mp4_link")
mp4_str = "\n".join(mp4_data)
# 将数据复制到剪贴板上
ctrl_clipboard(mp4_str)

        (6)复制好以后粘贴到新建任务里

# 查找新建任务面板的句柄,并将新建任务面板显示到最前面
foreground_windows("新建任务面板")
# 点击添加链接框
mk.click_mouse(811, 406)
# 粘贴数据(ctrl+v)
mk.ctrl_v()

        (7)获取视频的标题

# 获取所有的视频下载链接
title_data = open_file("rep_data_63.json", "title")

        (8)每三行重命名以后鼠标自动向后滚动下直至修改完所有视频名(注意滚轮滚动一下就是换三行,数值是120增量,亲测)

index_value = 0
while True:
    if index_value < len(title_data):
        for i in range(len(title_data) // 3):
            for j in range(3):
                # 重命名
                ref_name(index_value, j)
                index_value += 1
            # 鼠标滚轮向上(后)滚动一个单位(120的增量)
            # ctypes.windll.LoadLibrary()
            win32api.mouse_event(win32con.MOUSEEVENTF_WHEEL, 1006, 612, -120)
            time.sleep(1)
    break

        (9)点击合并为任务组单选框,可以将下载视频放于一个文件夹收拢,还可以命名为方便自己寻找的名称

mk.click_mouse(761, 637)
# 修改任务组名(避免因为路径太长无法下载)
mk.k.type_string("qf")
mk.k.tap_key(mk.k.enter_key)
time.sleep(30)

        (10)点击立即下载(安心的等待下载完毕即可)

# 点击立即下载
mk.click_mouse(909, 830)

        至此,自动下载视频步骤基本结束。但是你肯定会觉得这也太简单了,我也会,但是我不只是这二百行代码就结束了,因为我把每一个步骤中能合并的代码都封装到函数里,方便类似的处理过程中直接调用即可。接下来是全部代码分享,方便互相学习借鉴。


        三、全部代码

        1、迅雷自动下载视频并重命名主代码

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author:bigbear
# datetime:2022/9/8 20:29
# software: PyCharm

"""
    需求:自动控制迅雷软件
    操作方法:
    1、先导入pywin32
    2、打开软件或文件win32api.ShellExecute()
        HWND  # 指定父窗口句柄
        Operation  # 指定动作,如edit、explore、open、find、print、NULL
        FileName  # 指定要打开的文件或程序
        Parameters  # 指定打开程序所需参数
        Directory  # 缺省目录
        ShowCmd  # 打开选项,可选值
    3、点击新建添加链接
    4、对视频重命名
    win32api.mouse_event((dwFlags, dx, dx, dwData, dwExtraInfo)
        dwFlags:控制鼠标事件
        dx:现在鼠标要进行操作位置的横坐标x(我理解的)
        dx:现在鼠标要进行操作位置的纵坐标y(我理解的)
        dwData:一般定义的滚轮一次三行,即增量设置为120,正值表示向下滚动(向前,即你面向的方向)、负值表示向上滚动(向后,即朝着你的方向)
        dwExtraInfo:与鼠标事件关联的附加值
    5、点击立即下载
"""
import time

import win32api
import win32con

from reptile_func import open_file, ctrl_clipboard, foreground_windows, MouseKeyboard


def ref_name(index, num):
    """修改文件名"""
    # 将数据复制到剪贴板上
    ctrl_clipboard(title_data[index])
    # 查找新建任务面板的句柄,并将新建任务面板显示到最前面
    foreground_windows("新建任务面板")
    # 点击第一行视频名进行修改
    mk.click_mouse(1006, 548 + num * 32)
    # 粘贴数据(ctrl+v)
    mk.ctrl_v()
    time.sleep(1)


# 打开迅雷软件
win32api.ShellExecute(1, "open", r"C:\Program Files (x86)\Thunder Network\Thunder\Program\Thunder.exe", "", "", 1)
time.sleep(1)
# 查找迅雷句柄,并将迅雷窗口显示到最前面
foreground_windows("迅雷")

# 获取键鼠
mk = MouseKeyboard()

# 点击新建
mk.click_mouse(994, 253)

# 获取所有的视频下载链接
mp4_data = open_file("rep_data_63.json", "mp4_link")
mp4_str = "\n".join(mp4_data)
# 将数据复制到剪贴板上
ctrl_clipboard(mp4_str)

# 查找新建任务面板的句柄,并将新建任务面板显示到最前面
foreground_windows("新建任务面板")

# 点击添加链接框
mk.click_mouse(811, 406)
# 粘贴数据(ctrl+v)
mk.ctrl_v()

# 获取所有的视频下载链接
title_data = open_file("rep_data_63.json", "title")
index_value = 0
while True:
    if index_value < len(title_data):
        for i in range(len(title_data) // 3):
            for j in range(3):
                # 重命名
                ref_name(index_value, j)
                index_value += 1
            # 鼠标滚轮向上(后)滚动一个单位(120的增量)
            # ctypes.windll.LoadLibrary()
            win32api.mouse_event(win32con.MOUSEEVENTF_WHEEL, 1006, 612, -120)
            time.sleep(1)
    break

# 点击合并为任务组单选框
mk.click_mouse(761, 637)
# 修改任务组名(避免因为路径太长无法下载)
mk.k.type_string("qf")
mk.k.tap_key(mk.k.enter_key)
time.sleep(30)

# 点击立即下载
mk.click_mouse(909, 830)

        2、迅雷自动下载视频并重命名函数代码

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author:bigbear
# datetime:2022/9/11 11:21
# software: PyCharm

"""
    需求:重复代码整理成函数,方便直接调用
"""
import json
import time

import win32clipboard
import win32con
import win32gui
from pykeyboard import PyKeyboard
from pymouse import PyMouse


def open_file(filename, one_key):
    """打开文件获取数据"""
    # 初始化一个获取数据的空列表
    get_data = []
    with open(filename) as f:
        # 打开文件以字典列表格式读取json数据
        f_data = json.load(f)
        for data_dict in f_data:
            # for循环遍历读取每一个字典中需要的键值
            k_value = data_dict[one_key]
            # 将键值添加到获取数据的列表的末尾
            get_data.append(k_value)
        return get_data


def ctrl_clipboard(data):
    """将数据复制到剪贴板上"""
    # 打开剪贴板
    win32clipboard.OpenClipboard()
    # 清空剪贴板
    win32clipboard.EmptyClipboard()
    # 剪贴板添加数据
    win32clipboard.SetClipboardData(win32con.CF_UNICODETEXT, data)
    # 等待1秒
    time.sleep(0.5)
    # 关闭剪贴板
    win32clipboard.CloseClipboard()
    # 等待1秒
    time.sleep(0.5)


def foreground_windows(win_name):
    """通过获取到的窗口句柄,将窗口最前置"""
    # 查找窗口句柄
    win_handle = win32gui.FindWindow(None, win_name)
    print(f"{win_name}窗口句柄:{win_handle}")
    if win_handle != 0:
        # 将窗口显示到最前面
        win32gui.SetForegroundWindow(win_handle)
    # 等待1秒
    time.sleep(1)


class MouseKeyboard:
    """键鼠操作"""

    def __init__(self):
        """获取鼠标和键盘"""
        self.m = PyMouse()  # 操作鼠标
        self.k = PyKeyboard()  # 操作键盘

    def mouse_position(self):
        """获取鼠标指针的当前位置"""
        m_pos = self.m.position()
        print(f"当前鼠标坐标:{m_pos}")
        return m_pos

    def click_mouse(self, m_pos_x, m_pos_y):
        """鼠标点击某坐标位置"""
        # 默认参数n=1代表左键,也可以设置为n=2代表右键、n=3代表滚轮
        self.m.click(m_pos_x, m_pos_y)
        # 等待1秒
        time.sleep(1)

    def ctrl_v(self):
        """粘贴数据(ctrl+v)"""
        # 第一种方法:先按住ctrl键、再按一下v键、最后松开ctrl键
        # self.k.press_key(self.k.control_key)
        # self.k.tap_key("v")
        # self.k.release_key(self.k.control_key)

        # 第二种方法:先按住ctrl键和v键、然后松开ctrl键和v键
        self.k.press_keys([self.k.control_key, "v"])

        # 等待1秒
        time.sleep(1)

    def other_keys(self, key="", n=1):
        """默认按一下某键"""
        if key == "2":
            self.k.tap_key(self.k.function_keys[2], n)
        elif key == "Down":
            self.k.tap_key(self.k.down_key, n)
        # 等待2秒
        time.sleep(2)

        四、知识技能点

WebDriver API---find_elements---Python+Selenium自动化测试

for循环中字典和列表操作---Pyhon-浅/深拷贝问题

windows官网文档---Technical documentation | Microsoft Docs


        愿你我都能为中华民族的伟大复兴尽一份绵薄力量,让中华文化的根扎根在中国这片绿水青山之上,让新一代中华儿女传承与发扬!!!

---无名之辈