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 運行結果如下