python采集A站m3u8视频格式视频


基本开发环境 ()

  • Python 3.6
  • Pycharm

相关模块的使用 ()

import requests
import re
from tqdm import tqdm
import os

安装Python并添加到环境变量,pip安装需要的相关模块即可。

确定目标需求 ()

既然选择爬取视频了,那肯定优先选择小姐姐的视频呀

懂得都懂~

网页数据分析,找寻数据来源 ()

A站视频是m3u8格式,整个视频分为很多小段,一段对应一个ts文件。

所以只需要找到这个m3u8的数据来源就可以获取所有的ts文件。

url链接的请求参数 pkey 是会改变的。但是这个参数是可以在网页源代码中找到的。包括m3u8的请求链接也是在网页源代码中可以获取的。

整体思路 ()

1、请求视频地址,获取源代码中的m3u8的url地址。
2、请求m3u8的地址,获取所有的ts文件地址
3、保存ts文件并且合并ts文件成mp4视频格式

实现代码 ()

import requests
import re
from tqdm import tqdm
import os
 
 
def change_title(title):
    pattern = re.compile(r"[\/\\\:\*\?\"\<\>\|]")  # '/ \ : * ? " < > |'
    new_title = re.sub(pattern, "_", title)  # 替换为下划线
    return new_title
 
 
def get_response(html_url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36'
    }
    response = requests.get(url=html_url, headers=headers)
    return response
 
 
def save(name, video, title):
    path = f'{name}\\'
    if not os.path.exists(path):
        os.makedirs(path)
    with open(path + title + '.ts', mode='wb') as f:
        f.write(video)
 
 
def get_m3u8_url(html_url):
    html_data = get_response(html_url).text
    m3u8_url = re.findall('backupUrl(.*?)\"]', html_data)[0].replace('"', '').split('\\')[-2]
    title = re.findall('"title":"(.*?)"', html_data)[0]
    new_title = change_title(title)
    m3u8_data = get_response(m3u8_url).text
 
    m3u8_data = re.sub('#EXTM3U', "", m3u8_data)
    m3u8_data = re.sub(r'#EXT-X-VERSION:\d', "", m3u8_data)
    m3u8_data = re.sub(r'#EXT-X-TARGETDURATION:\d', "", m3u8_data)
    m3u8_data = re.sub(r'#EXT-X-MEDIA-SEQUENCE:\d', "", m3u8_data)
    m3u8_data = re.sub(r'#EXT-X-ENDLIST', "", m3u8_data)
    m3u8_data = re.sub(r'#EXTINF:\d\.\d,', "", m3u8_data)
    m3u8 = m3u8_data.split()
 
    for link in tqdm(m3u8):
        ts_url = 'https://tx-safety-video.acfun.cn/mediacloud/acfun/acfun_video/hls/' + link
        video = get_response(ts_url).content
        ts_title = link.split('?')[0].split('.')[1]
        save(new_title, video, ts_title)
    print(f'{title}已经下载完成,请验收....')
 
 
if __name__ == '__main__':
    video_id = input('请输入你要下载的视频ID:')
    url = f'认真你就输啦 (?ω?)ノ- ( ゜- ゜)つロ'
    print('正在下载请稍后.....')
    get_m3u8_url(url)

最简单的合并方式有手就行