俗话说得好,学无止境,活到老学到老,浅尝辄止或半途而废,就学不到高深的技艺。我可以用自身经历告诉你,这句话说的没毛病。
退伍回来10个多月,奈何没有相关的软件测试工作经验和经历,而且毕业四五年没碰过了软件专业了,加之现在疫情的变化无常,报培训班时间不够自由,所以回来边恶补专业知识,边找相关工作。只能是四处碰壁,让我学习的欲望更加强烈。
话不多说,因为某免费课上的一些学习视频总是缺三少两,而且好多都不在一个地方,要看完看全比较耗费时间,也很容易漏掉一些知识点,于是我便想将视频都下载下来,这个免费视频网站上的课程只能在手机上下载,但是有网页版,所以找资料自己捣鼓,正好将前期学习的部分知识应用其中,将视频自动下载下来了,接下来就将我的自动下载视频经验分享给大家。
目 录
一、分析网站元素,下载视频数据
1、分析网站元素
2、下载视频数据
二、下载视频同时重命名
1、自动打开迅雷软件
三、全部代码
1、迅雷自动下载视频并重命名主代码
2、迅雷自动下载视频并重命名函数代码
四、知识技能点
一、分析网站元素,下载视频数据
1、分析网站元素
(1)视频网址(找你需要下载的视频网址哦)
(2)页面元素(F12:找你视频名称、视频元素所在的元素)
视频选集列表元素(含有视频名称、每个视频的网站地址(但不是下载视频地址))
<div class="course-list" data-v-8ea4e40c data-v-46cb2ba1></div>
视频下载地址元素(我这个在播放视频所在的div元素里)
<video class="vjs-tech" id="vjs_video_3_html5_api" tabindex="-1" autoplay="" src="https://xxx.com/xxx.mp4"></video>
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()
(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
愿你我都能为中华民族的伟大复兴尽一份绵薄力量,让中华文化的根扎根在中国这片绿水青山之上,让新一代中华儿女传承与发扬!!!
---无名之辈