Python實現(xiàn)視頻下載與合成的示例代碼
模塊使用
requests >>> pip install requests (數(shù)據(jù)請求 第三方模塊)
re # 正則表達式 去匹配提取數(shù)據(jù)
json
開發(fā)環(huán)境
Python 3.8 解釋器
Pycharm 2021.2 版本 建議
win + R 輸入cmd 輸入安裝命令 pip install 模塊名 如果出現(xiàn)爆紅 可能是因為 網(wǎng)絡連接超時 切換國內(nèi)鏡像源
案例實現(xiàn)
1.明確需求
采集內(nèi)容, 先分析一個視頻是從哪里獲取
通過開發(fā)者工具進行抓包分析, 分析視頻數(shù)據(jù)可以從哪里獲取內(nèi)容 格式 m3u8視頻內(nèi)容
當我們網(wǎng)站視頻格式 是m3u8的時候, 有一個專門存放所有ts視頻片段的文件
2.代碼實現(xiàn)步驟
- 發(fā)送請求
- 獲取數(shù)據(jù)
- 解析數(shù)據(jù)
- 保存數(shù)據(jù)
1. 發(fā)送請求, 對于視頻播放頁面url地址發(fā)送請求
2. 獲取數(shù)據(jù), 獲取服務器返回response響應數(shù)據(jù)
3. 解析數(shù)據(jù), 提取我們想要的數(shù)據(jù)內(nèi)容 視頻標題 以及 m3u8 鏈接
4. 發(fā)送請求, 對于 m3u8 鏈接 發(fā)送請求
5. 獲取數(shù)據(jù), 獲取服務器返回response響應數(shù)據(jù)
6. 解析數(shù)據(jù), 提取所有ts文件url [視頻片段]
7. 保存數(shù)據(jù), 把所有視頻保存下來, 然后合成為一個整體視頻內(nèi)容
實現(xiàn)代碼
import requests # 數(shù)據(jù)請求模塊 pip install requests 在cmd里面 輸入命令
import re # 導入正則表達式模塊 內(nèi)置模塊
import json
import pprint # 格式化輸出模塊
for page in range(1, 17):
print(f'--------------------正在采集第{page}頁的數(shù)據(jù)內(nèi)容--------------------')
list_url = 'https://www.acfun.cn/u/45321802'
# 批量 ctrl + R 選中目標
data = {
'quickViewId': 'ac-space-video-list',
'reqID': page + 1,
'ajaxpipe': '1',
'type': 'video',
'order': 'newest',
'page': page,
'pageSize': '20',
't': '1649944573765',
}
headers = {
# 'cookies': '你的cookie',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.75 Safari/537.36'
}
# get請求 有一個params參數(shù)
# post請求 data 參數(shù)
response = requests.get(url=list_url, params=data, headers=headers)
# print(response.text)
id_list = re.findall('a href=.*?ac(.*?)"', response.text)
for index in id_list:
video_id = index.replace('\\', '')
"""
1. 發(fā)送請求, 對于視頻播放頁面url地址發(fā)送請求
用python代碼去模擬瀏覽器 對于 url地址發(fā)送請求
video
"""
url = f'https://www.acfun.cn/v/ac{video_id}' # 確定請求url地址
# 請求頭 用偽裝python代碼, 為了被服務器識別出來 是爬蟲程序 一種簡單反反爬手段 當你加ua 得到數(shù)據(jù)的時候, 可能要cookie
# 需要登陸才能獲得數(shù)據(jù)的, 需要加cookie 用戶信息, 常用于檢測是否登陸賬號
headers = {
# 'cookies': '你的cookie',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.75 Safari/537.36'
}
# 通過requests模塊里面get請求方式, 對于url地址發(fā)送請求, 并且攜帶上headers請求頭偽裝, 最后用response自定義變量接收返回數(shù)據(jù)
response = requests.get(url=url, headers=headers)
# 2. 獲取數(shù)據(jù)
# print(response.text)
# 3. 解析數(shù)據(jù) 通過re模塊里面findall的方法 在response.text里面去找尋 標題數(shù)據(jù) re.S 匹配換行
# 正則表達式提取出來的數(shù)據(jù)返回都是列表數(shù)據(jù)類型 實現(xiàn)過程不重要, 方式方法很多, 你喜歡用哪個都可以 只要可以取到數(shù)據(jù)都OK
title = re.findall('<title >(.*?) - AcFun彈幕視頻網(wǎng) - 認真你就輸啦 \(\?ω\?\)ノ- \( ゜- ゜\)つロ</title>', response.text)[0]
video_info = re.findall('window.pageInfo = window.videoInfo = (.*?);', response.text)[0]
# print(video_info) # 字符串轉(zhuǎn)成字典 怎么轉(zhuǎn) 最穩(wěn)妥查看數(shù)據(jù)類型 直接用 type() 這個函數(shù)去查看
json_data = json.loads(video_info)
# pprint.pprint(json_data)
# 字典取值 根據(jù)冒號左邊的內(nèi)容(鍵) 提取冒號右邊的內(nèi)容(值)
m3u8_url = \
json.loads(json_data['currentVideoInfo']['ksPlayJson'])['adaptationSet'][0]['representation'][0]['backupUrl'][0]
# print(title)
# print(m3u8_url)
# 通過requests模塊里面get請求方式, 對于m3u8_url地址發(fā)送請求, 并且攜帶上headers請求頭偽裝, 獲取響應體文本數(shù)據(jù), 用m3u8_data自定義變量接收數(shù)據(jù)
m3u8_data = requests.get(url=m3u8_url, headers=headers).text
# split() 字符串分割
m3u8_data = re.sub('#E.*', '', m3u8_data).split()
# print(m3u8_data)
for ts in m3u8_data:
ts_url = 'https://ali-safety-video.acfun.cn/mediacloud/acfun/acfun_video/' + ts
ts_content = requests.get(url=ts_url, headers=headers).content
# ab 是什么意思 a追加保存, b 二進制數(shù)據(jù) ab 以二進制數(shù)據(jù)追加保存
with open('video\\' + title + '.mp4', mode='ab') as f:
f.write(ts_content)
print('視頻保存完成: ', title)
到此這篇關于Python實現(xiàn)視頻下載與合成的示例代碼的文章就介紹到這了,更多相關Python視頻下載 合成內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python中CSV文件(逗號分割)實戰(zhàn)操作指南
CSV文件默認以英文逗號做為列分隔符,換行符作為行分隔符,下面這篇文章主要給大家介紹了關于Python中CSV文件(逗號分割)的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下2022-07-07
python中利用zfill方法自動給數(shù)字前面補0
python中有一個zfill方法用來給字符串前面補0,非常不錯,下面小編給大家分享了實例代碼,非常不錯,具有參考借鑒價值,需要的朋友參考下吧2018-04-04

