Python3.x如何在线下载视频
说明:
1.本文中使用的视频解析器为“诺讯智能解析系统 https://www.nxflv.com”
2.前提:掌握python基本语法
3.实现方式多种多样,仅供参考
下载流程
1.获取目标资源地址
2.解析资源路径,获取解析后得到的信息
3.下载视频
如何解析资源,得到解析后的资源信息
①访问“诺讯智能解析系统https://www.nxflv.com/?type=demo”,输入在解析地址栏中输入目标url。
②使用F12打开调试面板(谷歌浏览器),点击搜索,选择Network Tab,过滤XHR选项,可以看到api.php,这就是加载解析后的视频API接口,分析一下请求头,可以从头中获取到请求地址和返回的信息。详细过程不做阐述,如图所示。
根据解析信息获取下载资源地址
从以上步骤获取到请求信息后,转换成python脚本代替手工访问获取视频下载地址。
"""
获取视频加载地址
"""
def get_url(self,target):
print("加载请求地址...")
# 封装请求头参数
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36"
}
# 封装请求参数
param = {
"url": target,
"other":str(base64.b64encode(quote(target, 'utf-8').encode("utf-8")), "utf-8"),
"ref":0,
"time":int(time.time())
}
# 调用API获取视频解析信息
response = requests.post(url=self.server,headers=headers,data=param,verify=False)
response.encoding = 'utf-8'
info = json.loads(response.text)
if info["code"] == 200:
tempUrl = base64.b64decode(info["url"])
url = tempUrl[3:].decode()
print("加载请求地址完成.")
return url
else:
print("加载请求地址失败.")
return "-1"
3.下载视频
此处使用的是request.urlretrieve(...)方法
"""
函数说明:回调函数,打印下载进度
Parameters: a b c - 返回信息
Returns: 无
"""
def Schedule(self, a, b, c):
per = 100.0 * a * b / c
if per > 100:
per = 1
sys.stdout.write("\t%.2f%% 已经下载的大小:%.2f MB 文件大小:%.2f MB\r" %(per, a*b/1024/1024, c/1024/1024))
sys.stdout.flush()
"""
下载视频
"""
def download(self,url,filename):
print("正在下载【%s】" % filename)
request.urlretrieve(url=url, filename=filename, reporthook=self.Schedule)
print('\n下载完成!')
4.整合代码
#!H:/worksoft/Python38/python.exe
# coding:utf-8
import sys,requests,json,time,base64
from urllib import request
from urllib.parse import quote
"""
使用诺讯智能解析系统爬取视频
Referer: https://www.nxflv.com/api.php
"""
class downloadvideo():
def __init__(self):
self.server = "https://www.nxflv.com/api.php"
"""
函数说明:回调函数,打印下载进度
Parameters: a b c - 返回信息
Returns: 无
"""
def Schedule(self, a, b, c):
per = 100.0 * a * b / c
if per > 100:
per = 1
sys.stdout.write("\t%.2f%% 已经下载的大小:%.2f MB 文件大小:%.2f MB\r" %(per, a*b/1024/1024, c/1024/1024))
sys.stdout.flush()
"""
获取视频加载地址
"""
def get_url(self,target):
print("加载请求地址...")
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36"
}
param = {
"url": target,
"other":str(base64.b64encode(quote(target, 'utf-8').encode("utf-8")), "utf-8"),
"ref":0,
"time":int(time.time())
}
response = requests.post(url=self.server,headers=headers,data=param,verify=False)
response.encoding = 'utf-8'
info = json.loads(response.text)
if info["code"] == 200:
tempUrl = base64.b64decode(info["url"])
url = tempUrl[3:].decode()
print("加载请求地址完成.")
return url
else:
print("加载请求地址失败.")
return "-1"
"""
下载视频
"""
def download(self,url,filename):
print("正在下载【%s】" % filename)
request.urlretrieve(url=url, filename=filename, reporthook=self.Schedule)
print('\n下载完成!')
if __name__ == '__main__':
dlv = downloadvideo()
video_url = '视频来源地址'
filename = '文件名称+后缀'
url = dlv.get_url(video_url)
if url != "-1":
dlv.download(url ,filename)
大工告成
使用cmd 运行结果如下