python多線程爬取加密後ts文件,解密後合成mp4視頻
聲明:僅供技術交流,請勿用於非法用途,如有其它非法用途造成損失,和本博客無關
前言
- 續我前幾天發佈的上篇博客:python多線程爬取ts文件併合成mp4視頻,說道爬視頻有三種級別,上篇的例子屬於中等級別,那麼接下來的這篇是困難級別的。
- 其實,這裏再修正一下,爬視頻應該不止是3種級別,還有很多更加困難的網站。
- 所以,學無止境,儘管路途遙遠,也要勇往直前~
廢話不多說,下面直接開始吧,本次爬取的網站是點擊跳轉
一、分析頁面
其實,這個網站跟我的上一篇博客的頁面差不多,都屬於同類型的網站,只不過是它的ts文件是加密的,如果直接運用上一篇的爬取邏輯,下載下來的ts文件合成mp4也是播放不了的,因爲ts文件已經加過密了,需要解密才能播放。(跟上一篇的頁面分析差不多,這裏就不過多講述了)
這個網站跟我的上一篇博客爬取的視頻網站有三點不一樣的地方:
- 用requests來請求播放頁和js文件都會得不到網頁的源代碼,而是一個需要執行的JavaScript代碼,因此,本文在拿到所有ts文件之前的操作均使用selenium來獲取,比如獲取播放頁的網頁源代碼、獲取js文件的響應內容。
- js文件的響應內容裏直接明文展示了所有劇集的m3u8文件的網址,而上一篇博客裏的視頻網站裏的那個js文件是用base64來對m3u8文件網址進行編碼加密的,因此,本文無需導入base64庫來進行解密了。
- 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文件響應裏是否說明了加密的方法以及其加密的祕鑰,所以有的話就可以參考本篇文章所使用的邏輯方法,沒有的話就可以參考我的上一篇博客。