国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

python 爬蟲 m3u8 視頻文件 加密解密 整合mp4

這篇具有很好參考價(jià)值的文章主要介紹了python 爬蟲 m3u8 視頻文件 加密解密 整合mp4。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

一、完整代碼

完整代碼如下:

import requests
from multiprocessing import Pool
import re
import os
from tqdm import tqdm
from Crypto.Cipher import AES


# 創(chuàng)建臨時文件夾
dirs = 'ts_list_need_to_merge/'
os.makedirs(dirs, exist_ok=True)

headers = {
        'Accept': '*/*',
        'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
        'Connection': 'keep-alive',
        'Origin': 'http://www.kpd510.me',
        'Referer': 'http://www.kpd510.me/',
        'Sec-Fetch-Dest': 'empty',
        'Sec-Fetch-Mode': 'cors',
        'Sec-Fetch-Site': 'cross-site',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 Edg/116.0.1938.69',
        'sec-ch-ua': '"Chromium";v="116", "Not)A;Brand";v="24", "Microsoft Edge";v="116"',
        'sec-ch-ua-mobile': '?0',
        'sec-ch-ua-platform': '"Windows"',
    }



def parse_m3u8_text(m3u8_text):
    m3u8_text = m3u8_text.split()
    encode_info = [line for line in m3u8_text if line.startswith('#EXT-X-KEY:')][0]
    pattern = r"#EXT-X-KEY:METHOD=(.*),URI=\"(.*)\""  
    
    ## 獲得加密method 和 key.key的url
    match = re.search(pattern, encode_info)
    if match:
        method = match.group(1)
        key_url = match.group(2)
    else:
        raise '解析失敗'
    
    ## 獲得ts文件url
    ts_list = [line for line in m3u8_text if line.endswith('ts')]
    return method, key_url, ts_list

def decrypt_content_and_save_file(filename, content, decrypter):
    with open(filename, mode='wb') as f:
        f.write(decrypter.decrypt(content))


def merge_ts_to_mp4(filename, ts_file_list):
    with open(filename, mode='ab') as f1:
        for ts_file in ts_file_list:
            with open(ts_file, mode='rb') as f2:
                f1.write(f2.read())
    print(filename, '完成!')


def process_one_url(ts_url, key):
    decrypter = AES.new(key, AES.MODE_CBC)
    filename = dirs + os.path.split(ts_url)[-1]
    content = requests.get(ts_url, headers=headers).content
    decrypt_content_and_save_file(filename, content, decrypter)
    return filename


def download_method_1(ts_list, key):
    # 普通次序一個一個下載,耗時11分鐘
    ts_file_list = []
    for ts_url in tqdm(ts_list):
        filename = process_one_url(ts_url=ts_url, key=key)
        ts_file_list.append(filename)
    return ts_file_list


def download_method_2(ts_list, key, processes_nums=2):
	# 多進(jìn)程下載, 耗時1分鐘
    class CallBack:
        def __init__(self, nums) -> None:
            self.pbar = tqdm(total=nums)
            self.filenames = []
        
        def callback(self, filename):
            self.pbar.update(1)
            self.filenames.append(filename)
    
    callback = CallBack(len(ts_list))
    pool = Pool(processes=processes_nums)
    for ts_url in ts_list:
        pool.apply_async(process_one_url, (ts_url, key), error_callback=print, callback=callback.callback)
    pool.close()
    pool.join()
    callback.pbar.close()
    return [dirs + os.path.split(ts_url)[-1] for ts_url in ts_list]


if __name__ == "__main__":
    m3u8_url = 'https://play.bo262626.com/20231108/xV1bY9Cn/700kb/hls/index.m3u8'
    response = requests.get(m3u8_url, headers=headers)
    m3u8 = response.text
    method, key_url, ts_list = parse_m3u8_text(m3u8)
    
    key_url = 'https://play.bo262626.com' + key_url
    ts_list = ['https://play.bo262626.com' + item for item in ts_list]
    
    key = requests.get(key_url, headers=headers).content
    ts_file_list = download_method_2(ts_list, key=key, processes_nums=10)
    
    merge_ts_to_mp4('test.mp4', ts_file_list)

二、視頻分析

1. 認(rèn)識m3u8文件

m3u8的結(jié)構(gòu)詳細(xì)分析可以看這個鏈接m3u8 文件格式詳解 - 簡書 (jianshu.com),這里我們只簡要介紹一下;

相信無論多小白都應(yīng)該知道如何打開開發(fā)者模型解析得到下面的結(jié)果;

本地視頻利用python寫個mp4加密及解密,數(shù)據(jù)采集 Python爬蟲,python,爬蟲

要注意的是,只有預(yù)覽里面包含了ts信息的才算是我們需要的m3u8文件;大家可以看到左側(cè)有兩個index.m3u8,其中一個是沒有ts信息的,所以我們直接忽略掉;現(xiàn)在我們先下載來,再來具體分析一下m3u8文件以及里面的內(nèi)容分別表達(dá)什么意思;

下載代碼如下:

import requests
import re

headers = {
    'Accept': '*/*',
    'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
    'Connection': 'keep-alive',
    'Origin': 'http://www.kpd510.me',
    'Referer': 'http://www.kpd510.me/',
    'Sec-Fetch-Dest': 'empty',
    'Sec-Fetch-Mode': 'cors',
    'Sec-Fetch-Site': 'cross-site',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 Edg/116.0.1938.69',
    'sec-ch-ua': '"Chromium";v="116", "Not)A;Brand";v="24", "Microsoft Edge";v="116"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Windows"',
}

response = requests.get('https://play.bo262626.com/20231108/xV1bY9Cn/700kb/hls/index.m3u8', headers=headers)

m3u8 = response.text

m3u8文件的實(shí)質(zhì)是一個視頻的url列表,其中ts是計(jì)算器可以直接播放的視頻格式文件,但是直接下載是可能被加了密的文件,我們需要m3u8文件內(nèi)容信息進(jìn)行解密;

我們可以這樣理解,m3u8把一個完整的mp4視頻切割成了很多的小塊,每一個小塊在m3u8都是ts文件格式,并在m3u8中采取了加密的措施,至于為什么要加密,這里就不多介紹;

在一般的視頻爬取中,我們只需要考慮兩個部分,一個是EXT-X-KEY,一個是ts;

本地視頻利用python寫個mp4加密及解密,數(shù)據(jù)采集 Python爬蟲,python,爬蟲

其中EXT-X-KEY包含了ts的加密方式,ts包含了ts文件的下載地址;

在紅色部分也就是EXT-X-KEY部分,我們可以從METHOD中獲取到采取的加密方式是AES-128,同時看到URI的地址/20231126/10VkaJks/700kb/hls/key.key,這也就是AES加密密匙的地址:key.key,接下來我們寫一個文件來對m3u8文件解析,目的是提取出紅色部分和藍(lán)色部分;

代碼如下:

def parse_m3u8_text(m3u8_text):
    m3u8_text = m3u8_text.split()
    encode_info = [line for line in m3u8_text if line.startswith('#EXT-X-KEY:')][0]
    pattern = r"#EXT-X-KEY:METHOD=(.*),URI=\"(.*)\""  
    
    ## 獲得加密method 和 key.key的url
    match = re.search(pattern, encode_info)
    if match:
        method = match.group(1)
        key_url = match.group(2)
    else:
        raise '解析失敗'
    
    ## 獲得ts文件url
    ts_list = [line for line in m3u8_text if line.endswith('ts')]
    return method, key_url, ts_list

## 在這里我們直接把m3u8文本丟進(jìn)去就可以獲得
## method, key_url, ts_list
method, key_url, ts_list = parse_m3u8_text(m3u8)
## method = 'AES-128'
## key_url = '/20231108/xV1bY9Cn/700kb/hls/key.key'
## ts_list = ['...ts', '...ts', ...]

2. 獲取密鑰,構(gòu)建解密器

因?yàn)闃?gòu)建解密器我們需要密鑰,而密鑰存儲在key.key中,首先我們需要解析key_url獲取密鑰;

在這里可以明顯的看到key_url = '/20231108/xV1bY9Cn/700kb/hls/key.key'這不是一個完整的url,我們在這里加上獲取m3u8請求的主域名便好;

代碼如下:

headers = {
    'Accept': '*/*',
    'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
    'Connection': 'keep-alive',
    'Origin': 'http://www.kpd510.me',
    'Referer': 'http://www.kpd510.me/',
    'Sec-Fetch-Dest': 'empty',
    'Sec-Fetch-Mode': 'cors',
    'Sec-Fetch-Site': 'cross-site',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 Edg/116.0.1938.69',
    'sec-ch-ua': '"Chromium";v="116", "Not)A;Brand";v="24", "Microsoft Edge";v="116"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Windows"',
}

key_url = 'https://play.bo262626.com' + key_url
key = requests.get(key_url, headers=headers).content
# 這里我們得到key = b'388d590fabfeabcf' 是一個二進(jìn)制結(jié)果

得到了密鑰,再結(jié)合加密方式AES-128,我們就可以構(gòu)建一個解密器,構(gòu)建解密器代碼如下:

from Crypto.Cipher import AES
## 這里網(wǎng)絡(luò)爬取視頻一般是MODE_CBC模式
decrypter = AES.new(key, AES.MODE_CBC)

這里要提起的是網(wǎng)絡(luò)上的m3u8文件采取的加密一般是AES.MODE_CBC模式,在后續(xù)操作中如果這里出問題就換MODE一個一個試就好;

3. 下載ts文件

由于有許多的ts文件,我們有三種方法,第一是簡單的requests請求一個一個下,這也是最費(fèi)時的一種;第二個是多進(jìn)程或者多線程的方式下載;第三個是采用協(xié)程的方式;接下來我們一個個實(shí)現(xiàn);

在開始之間,ts_list存在同樣的問題,就是需要重構(gòu)url,這里代碼如下:

ts_list = ['https://play.bo262626.com' + item for item in ts_list]

# 這里得到:
# ['https://play.bo262626.com/20231108/xV1bY9Cn/700kb/hls/o3jSJ9mc.ts',
#  'https://play.bo262626.com/20231108/xV1bY9Cn/700kb/hls/GNHDlClJ.ts',
#  'https://play.bo262626.com/20231108/xV1bY9Cn/700kb/hls/zKym5c6V.ts',
#  'https://play.bo262626.com/20231108/xV1bY9Cn/700kb/hls/4ll4NQH3.ts',
#  'https://play.bo262626.com/20231108/xV1bY9Cn/700kb/hls/RwUOniSQ.ts' ...]

再測試一下解密器是否可以:

import os
from tqdm import tqdm

dirs = 'ts_list_need_to_merge/'
os.makedirs(dirs, exist_ok=True)


def decrypt_content_and_save_file(filename, content, decrypter):
    with open(filename, mode='wb') as f:
        f.write(decrypter.decrypt(content))


def process_one_url(ts_url, key):
    decrypter = AES.new(key, AES.MODE_CBC)
    filename = dirs + os.path.split(ts_url)[-1]
    content = requests.get(ts_url, headers=headers).content
    decrypt_content_and_save_file(filename, content, decrypter)
    return filename

process_one_url(ts_list[0], key)

## 打開視頻看是否能打開
## 如果能打開說明解密沒問題

直接requests: 代碼如下

def download_method_1(ts_list, key):
    # 這里弄一個filename_list 方便后續(xù)合并ts到mp4
    ts_file_list = []
    for ts_url in tqdm(ts_list):
        filename = process_one_url(ts_url=ts_url, key=key)
        ts_file_list.append(filename)
    return ts_file_list

# 下載測試
ts_file_list = download_method_1(ts_list, key)

實(shí)現(xiàn)挺慢的,不合理;

本地視頻利用python寫個mp4加密及解密,數(shù)據(jù)采集 Python爬蟲,python,爬蟲

多進(jìn)程: 代碼如下

def download_method_2(ts_list, key, processes_nums=2):
    class CallBack:
        def __init__(self, nums) -> None:
            self.pbar = tqdm(total=nums)
            self.filenames = []
        def callback(self, filename):
            self.pbar.update(1)
            self.filenames.append(filename)

    callback = CallBack(len(ts_list))
    pool = Pool(processes=processes_nums)
    for ts_url in ts_list:
        pool.apply_async(process_one_url, (ts_url, key), error_callback=print, callback=callback.callback)
    pool.close()
    pool.join()
    callback.pbar.close()
    return [dirs + os.path.split(ts_url)[-1] for ts_url in ts_list]

ts_file_list = download_method_2(ts_list, key=key, processes_nums=10)

爬取巨快,1分鐘下載20多分鐘的視頻;

本地視頻利用python寫個mp4加密及解密,數(shù)據(jù)采集 Python爬蟲,python,爬蟲

4. 合并ts文件為mp4

在完成前面的步驟后,直接ab的方式把所有的文件按順序加入就好;

def merge_ts_to_mp4(filename, ts_file_list):
    with open(filename, mode='ab') as f1:
        for ts_file in ts_file_list:
            with open(ts_file, mode='rb') as f2:
                f1.write(f2.read())

merge_ts_to_mp4('test.mp4', ts_file_list)

后續(xù)如果需要刪除'ts_list_need_to_merge/'這個臨時文件夾里面的所有內(nèi)容,直接運(yùn)行下面代碼

import send2trash

send2trash.send2trash('ts_list_need_to_merge/') # send2trash.send2trash(dirs)

三、總結(jié)

別在圖書館測試這段代碼!文章來源地址http://www.zghlxwxcb.cn/news/detail-829331.html

到了這里,關(guān)于python 爬蟲 m3u8 視頻文件 加密解密 整合mp4的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • ffmpeg 下載網(wǎng)上m3u8的視頻文件

    FFmpeg 是一個音視頻領(lǐng)域使用最廣泛的跨平臺開源庫。由C語言編寫,但廣泛的為 C/C++、C#、Java、Python 等主流編程語言所調(diào)用。它集合了幾乎所有的編碼解碼庫與流協(xié)議,幾乎能完美處理音視頻開發(fā)領(lǐng)域的所有需求。 方式一:源碼安裝 FFmpeg 通過編譯源碼安裝 FFmpeg 的優(yōu)點(diǎn)是可

    2023年04月09日
    瀏覽(15)
  • 【M3U8】python(流視頻數(shù)據(jù))

    【M3U8】python(流視頻數(shù)據(jù))

    現(xiàn)在大部分視頻客戶端都采用HTTP Live Streaming,而不是直接播放MP4等視頻文件(HLS,Apple為了提高流播效率開發(fā)的技術(shù))。HLS技術(shù)的特點(diǎn)是將流媒體切分為若干【TS片段】(比如幾秒一段),然后通過一個【M3U8列表文件】將這些TS片段批量下載供客戶端播放器實(shí)現(xiàn)實(shí)時流式播放

    2023年04月09日
    瀏覽(24)
  • 處理前端訪問m3u8視頻文件出現(xiàn)跨越問題

    一、后端模板渲染的方式,不需要處理,不會存在跨域問題 二、如果是前后端分離項(xiàng)目在 nginx 中配置跨域 1、 m3u8 文件存放在服務(wù)器地址為`/home/video-api/public/uploads/video 2、修改 nginx 的配置 3、客戶端在 js 代碼里面輸入視頻地址 http://【ip或者域名】/uploads/video/1686034066126185.m3u

    2024年02月09日
    瀏覽(29)
  • python 批量下載m3u8的視頻

    python 批量下載m3u8的視頻

    ?前些天發(fā)現(xiàn)了一個巨牛的人工智能學(xué)習(xí)網(wǎng)站,通俗易懂,風(fēng)趣幽默,忍不住分享一下給大家:點(diǎn)擊跳轉(zhuǎn) 目錄 一,貓抓獲取視頻地址 二,安裝配置ffmpeg 1,windows使用 2,python使用 三,碧站視頻 四,合并ts文件 1,背景 2,實(shí)現(xiàn) 4,缺點(diǎn) 五,下載m3u8視頻 1,背景 2,實(shí)現(xiàn)V1 3,實(shí)

    2024年02月13日
    瀏覽(21)
  • Python 實(shí)現(xiàn) m3u8 視頻下載

    Python 實(shí)現(xiàn) m3u8 視頻下載

    m3u8 是一種 基于文本的媒體播放列表文件格式 ,通常用于指定流媒體播放器播放在線媒體流。它是一個簡單的文本文件,其中包含多個由 URI 引用的媒體資源文件的 URL。m3u8 文件通常包含多個 ts 文件的鏈接,這些 ts 文件是實(shí)際的視頻和音頻數(shù)據(jù)文件,通常是通過 HTTP 協(xié)議傳

    2024年02月07日
    瀏覽(20)
  • Python爬取m3u8格式的視頻

    Python爬取m3u8格式的視頻

    聲明:本文只作學(xué)習(xí)研究,禁止用于非法用途,否則后果自負(fù),如有侵權(quán),請告知刪除,謝謝! 在某一天,群友分享了一些小視頻,手機(jī)端可以正常觀看,但是到了電腦上,輸入網(wǎng)址之后會下載下來一個m3u8格式的文件,這就讓我犯了難。所以我就研究了一下,并使用Python來

    2023年04月13日
    瀏覽(18)
  • 【python】多線程下載m3u8分段視頻

    1.說明 m3u8是一種傳輸數(shù)據(jù)的方式,比如說一集20分鐘的完整視頻被分割成一千多段一兩秒的小視頻,客戶端播放的時候是感覺是連續(xù),但如果你要下載這集視頻,那就要把一千多個小視頻全都下載然后自己拼接成一個完整視頻。拼接的話很簡單,像格式工廠等很多軟件都可以

    2024年02月12日
    瀏覽(16)
  • 視頻網(wǎng)站的工作原理-->m3u8視頻文件的提取與解析(理論)

    視頻網(wǎng)站的工作原理-->m3u8視頻文件的提取與解析(理論)

    目錄 一、視頻網(wǎng)站的工作原理 二、抓取視頻步驟 2.1、找到m3u8文件 2.2、把m3u8下載到ts文件 2.3、ts文件合并為mp4文件 ??????? 古老的視頻網(wǎng)站的視頻一般是在源碼放一個video src=\\\"xxx.mp4\\\"/video,用戶點(diǎn)擊播放視頻,會跳轉(zhuǎn)到src的連接進(jìn)行視頻資源的獲取進(jìn)行播放。 缺點(diǎn):視頻

    2024年02月13日
    瀏覽(27)
  • 抓取m3u8視頻

    抓取m3u8視頻

    視頻url:https://www.9meiju.cc/mohuankehuan/shandianxiadibaji/1-1.html 打開網(wǎng)址分析當(dāng)前視頻是由多個片段組成還是單獨(dú)一個視頻 如果是一個單獨(dú)視頻,則找到網(wǎng)址,直接下載即可,如果為多個片段的視頻,則需要找到片段的文件進(jìn)行處理,本案例以m3u8為例 找到m3u8文件后進(jìn)行下載,下載

    2024年02月11日
    瀏覽(22)
  • CRMEB知識付費(fèi)二次開發(fā) 加密阿里云視頻MP4點(diǎn)播鏈接為m3u8格式 hls blob協(xié)議

    CRMEB知識付費(fèi)二次開發(fā) 加密阿里云視頻MP4點(diǎn)播鏈接為m3u8格式 hls blob協(xié)議

    只有添加分發(fā)加速的域名才能使用HLS加密,同時也要做HTTPS證書添加,不然也會報(bào)錯。 1、這是電腦端視頻播放頁面效果 2、這個手機(jī)端H5視頻播放頁面效果 3、在網(wǎng)站后臺上傳你的視頻內(nèi)容 4、上傳完之后可以進(jìn)行預(yù)覽 5、在阿里云控制臺設(shè)置就好自己的轉(zhuǎn)碼模板 將不轉(zhuǎn)碼設(shè)為

    2024年02月08日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包