有時(shí)候,我們?cè)诰W(wǎng)頁上追劇得時(shí)候,出于各種原因,希望將這些視頻下載到本地。接下來,我們用python擼一段代碼來實(shí)現(xiàn)。
1 抓包:獲取.m3u8得請(qǐng)求地址具體步驟:
在瀏覽器中打開視頻網(wǎng)頁F12打開開發(fā)者工具,并切換至網(wǎng)絡(luò)標(biāo)簽刷新該網(wǎng)頁,發(fā)現(xiàn)網(wǎng)絡(luò)得列表中加載了多個(gè)請(qǐng)求在篩選器框中,輸入m3u8過濾其他無關(guān)得請(qǐng)求
點(diǎn)擊m3u8請(qǐng)求,切換至預(yù)覽,確認(rèn)下請(qǐng)求文本是否是ts文件得請(qǐng)求列表,如果是,說明我們抓取得地址是正確得,ts文件是視頻在線播放時(shí),被切割得視頻片段,我們專業(yè)從中任意復(fù)制一條,在瀏覽器中打開,瀏覽器會(huì)自動(dòng)彈出下載該文件得對(duì)話框,下載完成后,其實(shí)是專業(yè)用視頻播放軟件播放該視頻得。2 擼代碼2.1 使用requests,請(qǐng)求上一步得.m3u8結(jié)尾得url
import requestsfrom fake_useragent import UserAgent# .m3u8得請(qǐng)求地址url = 'https://m3u.haiwaikan感謝原創(chuàng)分享者/xm3u8/c67187e521c6459f9cdd4731bff1e96e3c32d6d99d6c4f68be0469232320c8389921f11e97d0da21.m3u8'# 設(shè)置代理(有些網(wǎng)站需要最新科學(xué)上網(wǎng)才能訪問)proxies = {"https": "感謝分享127.0.0.1:10887"}# 將請(qǐng)求包裝成瀏覽器端訪問,防止有些網(wǎng)站反爬蟲ua = UserAgent()headers = {'User-Agent': ua.random}response = requests.get(url, headers=headers, proxies=proxies)content = response.textprint(content)
debug看下已經(jīng)拿到了ts文件列表了
2.2 解析上面得響應(yīng)結(jié)果,提取ts鏈接列表# 將文本拆分為行l(wèi)ines = content.split('\n')ts_urls = []# 遍歷文本提取ts視頻片段得地址for i in range(0, len(lines)):if lines[i].startswith("https:"):ts_urls.append(lines[i])
2.3 遍歷ts鏈接列表,使用requests逐個(gè)訪問各個(gè)列表,將結(jié)果寫入本地磁盤,該步驟會(huì)在盤符下生成多個(gè)ts文件;
# 指定保存得文件路徑:因?yàn)闄?quán)限問題,該路徑必須先創(chuàng)建好save_dir = '/Users/zhaoyang/Downloads/ts_demo/'for i in range(0, len(ts_urls)):ts_resp = requests.get(ts_urls[i], headers=headers, proxies=proxies)with open(save_dir + 'video_' + str(i) + '.ts', 'wb') as f:f.write(ts_resp.content)
2.4 將多個(gè)ts文件合并一個(gè)大得ts文件
with open(save_dir + 'all.ts', 'wb') as outfile:for i in range(0, 351):file_name = save_dir + 'video_' + str(i) + '.ts'with open(file_name, 'rb') as infile:outfile.write(infile.read())
多個(gè)ts文件合并成大文件
2.5 使用ffmpeg將大得.ts文件轉(zhuǎn)換成.mp4需要在電腦上安裝好ffmpeg,并添加到環(huán)境變量
# 轉(zhuǎn)換為MP4格式subprocess.call(['ffmpeg', '-i', save_dir + 'all.ts', '-c', 'copy', save_dir + 'output.mp4'