python多線程爬取加密後ts文件,解密後合成mp4視頻

python多線程爬取加密後ts文件,解密後合成mp4視頻

聲明:僅供技術交流,請勿用於非法用途,如有其它非法用途造成損失,和本博客無關

前言

  • 續我前幾天發佈的上篇博客:python多線程爬取ts文件併合成mp4視頻,說道爬視頻有三種級別,上篇的例子屬於中等級別,那麼接下來的這篇是困難級別的。
  • 其實,這裏再修正一下,爬視頻應該不止是3種級別,還有很多更加困難的網站。
  • 所以,學無止境,儘管路途遙遠,也要勇往直前~

廢話不多說,下面直接開始吧,本次爬取的網站是點擊跳轉

一、分析頁面

其實,這個網站跟我的上一篇博客的頁面差不多,都屬於同類型的網站,只不過是它的ts文件是加密的,如果直接運用上一篇的爬取邏輯,下載下來的ts文件合成mp4也是播放不了的,因爲ts文件已經加過密了,需要解密才能播放。(跟上一篇的頁面分析差不多,這裏就不過多講述了)

這個網站跟我的上一篇博客爬取的視頻網站有三點不一樣的地方:

  1. 用requests來請求播放頁和js文件都會得不到網頁的源代碼,而是一個需要執行的JavaScript代碼,因此,本文在拿到所有ts文件之前的操作均使用selenium來獲取,比如獲取播放頁的網頁源代碼、獲取js文件的響應內容。
    在這裏插入圖片描述
  2. js文件的響應內容裏直接明文展示了所有劇集的m3u8文件的網址,而上一篇博客裏的視頻網站裏的那個js文件是用base64來對m3u8文件網址進行編碼加密的,因此,本文無需導入base64庫來進行解密了。
    在這裏插入圖片描述
  3. ts文件是經過加密處理的,下載下來的ts需要對其解密才能播放,這正是本文的重點,隨機打開一個播放頁,看到在第二個m3u8文件中多出了一行說明:
    在這裏插入圖片描述
    可以看到METHOD=AES-128說明是用AES-128的加密方法,其祕鑰的鏈接爲後面URI,請求這個鏈接得到加密祕鑰:
    在這裏插入圖片描述

二、視頻解密

根據給出的祕鑰即可以完成視頻解密的操作,基本步驟是:將請求ts文件得到的響應內容進行解密之後,再做保存操作,下面以第一集視頻解密爲例,具體代碼如下:

# 導入相關包或模塊
import threading, queue
import time, os, subprocess
import requests, urllib, parsel
import random, re
from Crypto.Cipher import AES

# 下載ts文件
def download_ts(urlQueue,aes,headers): 
    while True:
        try: 
            #不阻塞的讀取隊列數據 
            temp = urlQueue.get_nowait()
            url=temp[0]
            n=temp[1]
        except Exception as e:
            break
        response=requests.get(url,stream=True,headers=headers)
        ts_path = "./ts/%04d.ts"%n  # 注意這裏的ts文件命名規則
        with open(ts_path,"wb+") as file:
            for chunk in response.iter_content(chunk_size=1024):
                if chunk:
                    after=aes.decrypt(chunk)
                    file.write(after)
        print("%04d.ts OK..."%n)

if __name__ == '__main__':
    url='https://mahua-kb.com/20200330/2q4zN34n/2000kb/hls/index.m3u8' # 驅魔神醫粵語版第一集
    headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400'}
    r=requests.get(url,headers=headers)
    urlQueue = queue.Queue()  # 存儲ts文件的網址
    for i in r.text.split('\n'):
        if i.endswith('.ts'):
            urlQueue.put([urllib.parse.urljoin(url,i),urlQueue.qsize()])
        elif 'URI' in i:
            URI=urllib.parse.urljoin(url,re.findall('URI="(.*?)"',i)[0]) # 祕鑰的網址
            key=requests.get(URI,headers=headers).text  # 得到祕鑰
            aes=AES.new(key,AES.MODE_CBC,key)  # 通過祕鑰新建解密器
    # 下面開始多線程下載
    startTime = time.time()
    threads = []
    # 可以適當調節線程數,進而控制抓取速度
    threadNum = 4
    for i in range(threadNum):
        t = threading.Thread(target=download_ts, args=(urlQueue,aes,headers,))
        threads.append(t)
    for t in threads:
        t.start()
    for t in threads:
        t.join()
    endTime = time.time()
    print ('Done, Time cost: %s ' %  (endTime - startTime))

    # 下面是執行cmd命令來合成mp4視頻
    command=r'copy/b D:\python3.7\HEHE\爬蟲\ts\*.ts D:\python3.7\HEHE\爬蟲\mp4\驅魔神醫-第一集.mp4'
    output=subprocess.getoutput(command)
    print('驅魔神醫-第一集.mp4  OK...'

    # 下面是把這一集所有的ts文件給刪除
    file_list = []
    for root, dirs, files in os.walk('D:/python3.7/HEHE/爬蟲/ts'):
        for fn in files:
            p = str(root+'/'+fn)
            file_list.append(p)
    for i in file_list:
        os.remove(i)

ps:以上代碼只是單獨拿出了一集視頻,來說明怎麼將加密後ts進行解密併合成爲mp4,完整的爬取整個電視劇的源代碼可以關注我的微信公衆號,回覆:20200606,即可下載本篇文章的全部源代碼
在這裏插入圖片描述


寫在最後

因爲我的上一篇博客說了我本人對爬視頻難度的劃分,並且上一篇的難度爲中等難度,於是就想再找一篇困難級別的網站來分析,所以就找到了這個網站,不過我發現這個網站有的視頻需要解密,而有的又不需要,這其中最關鍵的就是看第二個m3u8文件響應裏是否說明了加密的方法以及其加密的祕鑰,所以有的話就可以參考本篇文章所使用的邏輯方法,沒有的話就可以參考我的上一篇博客。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章