前言
本文的文字及圖片來源於網絡,僅供學習、交流使用,不具有任何商業用途,如有問題請及時聯系我們以作處理。
-
確定需求 (確定要爬的內容是什么?)。只有知道數據要的是什么,才能根據實際情況去分析 它的來源
-
怎么去分析 (開發者工具[瀏覽器都自帶 鼠標右鍵點擊插件或者F12]) 抓包分析
所有的ts文件內容 來自 m3u8
- 發送請求 對於視頻的詳情頁url地址發送請求
- 獲取數據 獲取視頻的詳情頁網頁源代碼
- 解析數據 提取 m3u8的 url地址 標題
- 發送請求 對於m3u8的 url地址 發送請求
- 獲取數據 獲取所有ts url地址(不是完整是需要拼接)
- 發送請求 對於 ts url地址 發送請求
- 保存數據 保存ts 視頻片段 一個一個視頻片段
- 合成視頻 一個整體視頻內容
import requests # 數據請求模塊 pip install requests import re # 正則表達式 內置模塊 不需要安裝 import os # 文件操作 import zipfile # 做壓縮文件
url = f'https://www.acfun.cn/v/ac23857874 headers = { 'User-Agent': ' Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36' } response = requests.get(url=url, headers=headers) print(response)
運行代碼,返回值為200
元字符 * +
.*? 通配符 可以匹配任意字符(除了\n) 匹配文字 匹配數字 字母 特殊字符 re.S
\ 轉義字符 把含有特殊含義的字符轉成除了字符本身以外 沒有其他意思
[0] 正則表達式提取出來的內容 返回是列表 [0] 0 是指列表索引位置 索引位置是0 是列表里面的第一個元素
[0,1,2,3,4,5] img\ 我轉義我自己
() 表示精確匹配 ? 非貪婪匹配
title = re.findall('<title >(.*?) - AcFun彈幕視頻網 - 認真你就輸啦 \(\?ω\?\)ノ- \( ゜- ゜\)つロ</title>', response.text)[0] m3u8_url = re.findall('"backupUrl(.*?)\"]', response.text)[0].replace('\"', '').split('\')[2] m3u8_data = requests.get(url=m3u8_url, headers=headers).text print(m3u8_url)
正則表達式替換 re.sub() join 是把列表轉成字符串
\d 匹配數字 \d+匹配多個數字 * 匹配前一個字符0個或者多個無數個
m3u8_data = re.sub('#EXTM3U', '', m3u8_data) m3u8_data = re.sub('#EXT-X-VERSION:\d', '', m3u8_data) m3u8_data = re.sub('#EXT-X-TARGETDURATION:\d', '', m3u8_data) m3u8_data = re.sub('#EXT-X-MEDIA-SEQUENCE:\d', '', m3u8_data) m3u8_data = re.sub('#EXTINF:\d\.\d+,', '', m3u8_data) m3u8_data = re.sub('#EXT-X-ENDLIST', '', m3u8_data) m3u8_data = m3u8_data.split() for link in m3u8_data: # 字符串拼接 加上 才是完整url地址 構建完整的url地址 link_url = 'https://tx-safety-video.acfun.cn/mediacloud/acfun/acfun_video/hls/' + link
link_content = requests.get(url=link_url, headers=headers).content link_name = link.split('.')[1] with open(filename + link_name + '.ts', mode='w') as f: f.write(link_content)
files = os.listdir(filename) print('開始視頻片段合成..................') with zipfile.ZipFile(filename + title + '.mp4', mode='w') as z: for file in tqdm(files): path_file = filename + file z.write(path_file) os.remove(path_file) print('視頻片段合成完畢..................')