B站无水印流媒体爬取教程(附代码+终端命令)

0 阅读12分钟

💡 写给新手的贴心提示:全程无复杂专业术语,每一步都带具体操作截图式描述,跟着做就能成功!目标是抓取B站无水印视频,合并后得到干净资源,用于二创(放心,步骤简单,零基础也能上手)。

一、先搞懂2个核心问题(新手必看,不绕弯)

1. 为什么我们要爬“m4s”格式?

新手宝子可能会问:直接在B站下载视频不就行了?其实B站直接下载的视频,会带有B站的频道标志(水印),而且格式是加密的,没法直接用于二创。

而B站的视频,本质是“流媒体”——简单说就是 边看边传,不是一次性下载完整文件,而是把视频拆成一个个小小的“碎片”(就是m4s格式),其中一个碎片是纯画面(视频流),另一个是纯声音(音频流),我们只要把这两个碎片下载下来,合并在一起,就能得到无水印、干净的完整视频啦!

2. 流媒体到底是什么?(一句话讲懂)

流媒体 = 边传输、边播放,不用等整个文件下载完。就像喝水,不用把整瓶水都倒在杯子里再喝,而是打开水龙头,流一点喝一点,既省时间,又不占设备内存,这就是流媒体发明的意义——解决了“大视频下载慢、看不了”的问题,也是我们能在线看B站、刷直播的核心技术~

二、前置准备(新手必做,一步都不能少)

准备好这2样东西,后续操作一路顺畅,提前检查好哦!

1. 安装Python和必备工具(附终端命令,直接复制)

首先,你得有Python(如果没装,先去官网下载:www.python.org/,安装时记得勾选“Add Python to PATH”,不然后续会报错!)

安装完成后,打开「终端」(Windows按Win+R,输入cmd回车;Mac按Command+空格,输入terminal回车),复制下面的命令,粘贴进去,按回车,等待安装完成即可(全程不用手动操作):

# 安装Python必备依赖(下载文件用)
pip install requests ffmpeg-python

# 重点!安装FFmpeg(合并音视频用,必装)
# 1. 先下载FFmpeg:https://ffmpeg.org/download.html(新手直接选“Windows builds by BtbN”或“MacOS”,下载对应系统的压缩包)
# 2. 解压压缩包,找到里面的“bin”文件夹(里面有ffmpeg.exe文件)
# 3. 把这个“bin”文件夹的路径,添加到系统环境变量(新手可以搜“Windows/Mac 环境变量添加”,跟着步骤来,很简单)
# 4. 验证是否安装成功:终端输入下面的命令,不报错就说明没问题
ffmpeg -version

✅ 新手小提示:如果输入ffmpeg -version后,显示“不是内部或外部命令”,就是环境变量没添加好,再重新检查一遍哦!

2. 准备好目标B站视频

打开B站,找到你想爬取的视频,记住视频页面的链接,后续会用到~

三、核心步骤:抓取m4s流媒体碎片(新手手把手教)

这一步是关键,也是新手最容易懵的地方,我会写得特别详细,跟着操作,保证能抓到!

  1. 打开B站目标视频页面,确保视频能正常播放(先播放10秒,再暂停,方便后续抓包)。

  2. 打开「开发者工具」:按键盘上的 F12 键(如果是笔记本,可能需要按Fn+F12);或者用鼠标右键点击视频页面空白处,选择「检查」(英文是Inspect),就能打开一个右侧/底部的面板。

  3. 切换到「Network」(网络)面板:打开开发者工具后,顶部会有一排选项(Elements、Console、Network等),点击「Network」,这个面板就是用来“捕捉”视频碎片的。

  4. 过滤出m4s碎片:在「Network」面板的顶部,有一个“Filter”(过滤框),输入 m4s(小写,不用加引号),这样就能只显示我们需要的视频/音频碎片,避免其他无关内容干扰。

  5. 刷新页面,捕捉碎片:勾选面板顶部的「Disable cache」(禁用缓存,新手不用管什么意思,勾选就对了,避免抓不到最新的碎片),然后点击浏览器的「刷新」按钮(或按F5),重新加载视频页面。

  6. 找到两个关键碎片(重点!):刷新后,面板里会出现2个(或多个)以.m4s结尾的文件,我们只需要关注两个:

    • 视频流(纯画面):文件名里带「-1-」(比如36758620302-1-30016.m4s),数字1代表这是视频碎片;

    • 音频流(纯声音):文件名里带「-2-」(比如36758620302-1-30216.m4s),数字2代表这是音频碎片。

  7. 复制请求信息(新手福音工具推荐):新手直接复制链接可能会遗漏请求参数,导致下载失败,这里推荐一个超实用工具——curl命令转Python代码工具(tool.lu/curl/。操作方法很简单:右键选中m4s请求(视频流/音频流),选择「Copy → Copy as cURL (bash)」,复制完整的curl请求信息;打开该工具,将复制的内容粘贴进去,就能一键生成对应的Python请求代码,自动带出请求头、请求参数和链接,不用手动写代码,彻底解决新手不会构造请求的难题!

  8. 提取关键信息:从工具生成的Python代码中,直接提取出「视频流链接、音频流链接、音频参数」,保存到记事本备用,后续替换到我们的Python代码中即可(不用管工具生成代码里的其他内容,只提取这3样就好)。

✅ 新手小提示:如果刷新后没出现m4s文件,就重新播放视频,或者再刷新一次;如果出现多个m4s,只选带「-1-」和「-2-」的两个就好!

四、完整Python代码(新手直接复制,只需改3处)

新建一个记事本,把下面的代码全部复制进去,然后把记事本的后缀改成「.py」(比如bilibili_crawl.py),保存好(建议保存到桌面,方便后续找到)。

🔔 重点修改3处(新手必看):把代码里「配置区」的视频链接、音频链接、音频参数,替换成从**curl转代码工具(tool.lu/curl/)**中提取…

import requests
import ffmpeg
import os

# -------------------------- 配置区(新手必改!3处)--------------------------
# 1. 替换成你抓包复制的【视频流m4s链接】(带-1-的那个)
VIDEO_URL = 'https://b-baaac10nxz3a75cr81cljvml1d.edge.mountaintoys.cn:4483/upgcxcode/02/03/36758620302/36758620302-1-30016.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&platform=pc&mid=0&deadline=1774007977&gen=playurlv3&uipk=5&trid=0000e4e1b166412b4c6095b0a49cf54ea43u&nbs=1&os=mcdn&og=cos&oi=0x2409875ea0301001001f000000000679&upsig=b59c050bfb887f22b7f11ca96314e22f&uparams=e,platform,mid,deadline,gen,uipk,trid,nbs,os,og,oi&mcdnid=50046093&bvc=vod&nettype=0&bw=376845&lrs=65&dl=0&f=u_0_0&qn_dyeid=b1503f91b13bd6de0066685969bd1a89&agrr=1&buvid=56B99F77-2460-1DCF-9443-88CFE8C2D4CB14612infoc&build=0&orderid=0,3'

# 2. 替换成你抓包复制的【音频流m4s链接】(带-2-的那个)
AUDIO_URL = 'https://xy123x184x54x141xy.mcdn.bilivideo.cn:8082/v1/resource/36758620302-1-30216.m4s'

# 3. 替换成你抓包时,音频流的【参数】(新手:抓音频流时,右键→Copy→Copy params,粘贴到这里)
AUDIO_PARAMS = {
    'agrr': '1',
    'build': '0',
    'buvid': '56B99F77-2460-1DCF-9443-88CFE8C2D4CB14612infoc',
    'bvc': 'vod',
    'bw': '65674',
    'deadline': '1774007977',
    'dl': '0',
    'e': 'ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=',
    'f': 'u_0_0',
    'gen': 'playurlv3',
    'lrs': '65',
    'mcdnid': '50046172',
    'mid': '0',
    'nbs': '1',
    'nettype': '0',
    'og': 'hw',
    'oi': '0x2409875ea0301001001f000000000679',
    'orderid': '0,3',
    'os': 'mcdn',
    'platform': 'pc',
    'qn_dyeid': 'b1503f91b13bd6de0066685969bd1a89',
    'sign': '5aa649',
    'traceid': 'trdsiOfnMrnnhE_0_e_N',
    'uipk': '5',
    'uparams': 'e,oi,trid,os,og,nbs,platform,gen,mid,deadline,uipk',
    'upsig': '3704e9c08314935660250016e10e54ef',
}

# 下面的内容不用改!不用改!不用改!
HEADERS = {
    'accept': '*/*',
    'accept-language': 'zh-CN,zh;q=0.9',
    'origin': 'https://www.bilibili.com',
    'referer': 'https://www.bilibili.com/video/BV1G5wQzQEtQ/?spm_id_from=333.1007.tianma.3-3-9.click',
    'sec-ch-ua': '"Chromium";v="146", "Not-A.Brand";v="24", "Google Chrome";v="146"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Windows"',
    'sec-fetch-dest': 'empty',
    'sec-fetch-mode': 'cors',
    'sec-fetch-site': 'cross-site',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36',
    'Connection': 'keep-alive'
}

# 临时文件(下载的碎片,合并后会自动删除)
VIDEO_TEMP = 'temp_video.m4s'
AUDIO_TEMP = 'temp_audio.m4s'
# 最终无水印视频(保存到桌面,名字可以自己改)
FINAL_VIDEO = 'bilibili_clean_video.mp4'
# -------------------------- 配置区结束 --------------------------

# 下载文件(新手不用管这个函数,不用改)
def download_file(url, save_path, params=None):
    try:
        print(f'开始下载【{save_path}】,耐心等一等...')
        response = requests.get(url, headers=HEADERS, params=params, stream=True)
        response.raise_for_status()
        total_size = int(response.headers.get('content-length', 0))
        downloaded_size = 0
        with open(save_path, 'wb') as f:
            for chunk in response.iter_content(chunk_size=8192):
                if chunk:
                    f.write(chunk)
                    downloaded_size += len(chunk)
                    if total_size > 0:
                        progress = (downloaded_size / total_size) * 100
                        print(f'\r下载进度: {progress:.1f}%', end='')
        print(f'\n【{save_path}】下载完成!')
        return True
    except Exception as e:
        print(f'下载失败,原因:{e}')
        return False

# 合并音视频(新手不用管这个函数,不用改)
def merge_audio_video(video_path, audio_path, output_path):
    try:
        print('\n开始合并音视频,马上就能得到无水印视频啦!')
        video = ffmpeg.input(video_path)
        audio = ffmpeg.input(audio_path)
        # 不压缩、不加水印,直接合并
        ffmpeg.output(video, audio, output_path, vcodec='copy', acodec='copy', overwrite_output=True).run()
        print(f'合并成功!无水印视频保存为:{output_path}(在桌面就能找到)')
        return True
    except Exception as e:
        print(f'合并失败,原因:{e}(大概率是FFmpeg没装对,检查一下环境变量)')
        return False

# 主程序(新手不用改,运行代码就靠它)
if __name__ == '__main__':
    # 1. 下载视频碎片
    video_ok = download_file(VIDEO_URL, VIDEO_TEMP)
    # 2. 下载音频碎片
    audio_ok = download_file(AUDIO_URL, AUDIO_TEMP, params=AUDIO_PARAMS)
    
    # 3. 合并碎片,得到无水印视频
    if video_ok and audio_ok:
        merge_audio_video(VIDEO_TEMP, AUDIO_TEMP, FINAL_VIDEO)
        # 自动删除临时碎片,不占内存
        os.remove(VIDEO_TEMP)
        os.remove(AUDIO_TEMP)
        print('临时文件已自动清理,搞定!')
    else:
        print('下载失败,无法合并,请检查链接是否正确~')

五、运行代码+终端命令(新手手把手教)

代码修改完成后,就可以运行啦,两种方式,新手选第一种,更简单!

方式1:直接双击运行(最推荐,新手首选)

  1. 找到你保存的「bilibili_crawl.py」文件(在桌面);

  2. 双击它,会弹出一个黑色的终端窗口,开始自动下载、合并;

  3. 等待运行完成,窗口会显示「合并成功」,此时桌面会出现一个「bilibili_clean_video.mp4」文件,就是无水印的完整视频啦!

方式2:用终端运行(备用,防止双击报错)

  1. 打开终端(Windows cmd,Mac terminal);

  2. 输入「cd 桌面」(回车,意思是进入桌面目录,因为我们的代码保存在桌面);

  3. 输入下面的命令(回车),开始运行代码:

python bilibili_crawl.py

✅ 新手小提示:如果输入python后报错,试试输入「python3 bilibili_crawl.py」(部分电脑需要这样输入)。

六、补充步骤:用FFmpeg工具在终端手动实现音视频融合

若代码自动合并失败,或想手动操作验证,可直接用FFmpeg工具在终端完成音视频融合,步骤简单,新手也能快速上手(前提:已安装FFmpeg并配置好环境变量)。

手动融合核心步骤(全程终端操作)

  1. 确认文件路径:先确保下载好的「视频流m4s文件」「音频流m4s文件」和「终端当前目录一致」(建议都放在桌面,和代码文件同目录,方便操作)。

  2. 打开终端并进入对应目录:

    • Windows:按Win+R输入cmd,输入「cd 桌面」(回车),进入桌面目录;

    • Mac:按Command+空格输入terminal,输入「cd 桌面」(回车),进入桌面目录。

  3. 输入FFmpeg手动融合命令(直接复制,替换文件名即可):

核心命令格式(复制后修改括号内文件名)

ffmpeg -i 视频流文件名.m4s -i 音频流文件名.m4s -c:v copy -c:a copy 最终无水印视频名.mp4

示例(对应代码中的临时文件,可直接复制使用,前提是代码已下载好临时文件)

ffmpeg -i temp_video.m4s -i temp_audio.m4s -c:v copy -c:a copy bilibili_clean_video.mp4

  1. 执行命令:粘贴命令后按回车,终端会开始融合,无需手动操作,等待10-30秒(视视频大小而定),出现「frame=xxx」且无报错,即融合成功。

  2. 查看结果:回到桌面,找到生成的「最终无水印视频名.mp4」,打开即可看到无水印、有画面有声音的完整视频。

✅ 新手小提示:

  • 命令中「-c:v copy -c:a copy」表示“不压缩视频和音频,直接复制合并”,速度最快,且不损失画质音质;

  • 若报错“找不到文件”,检查文件名是否输对(区分大小写),或文件是否在当前终端目录下;

  • 融合完成后,临时的m4s文件可手动删除(代码运行成功会自动删除,手动融合需手动删除)。

七、新手常见问题(避坑指南,必看!)

  1. 报错“下载失败”:大概率是m4s链接失效了(B站的m4s链接只有几分钟到几小时有效期),重新抓包复制新的链接即可;

  2. 报错“合并失败”:基本是FFmpeg没装对,检查环境变量是否添加,或者重新安装FFmpeg;若代码合并失败,可尝试上述「终端手动融合」方法;

  3. 下载的视频没声音/只有声音:是把视频链接和音频链接弄混了,重新替换配置区的链接;

  4. 视频有水印:不可能!只要是按步骤抓m4s碎片合并,得到的都是无水印视频,放心用于二创~

八、总结

全程核心流程:打开视频→F12抓m4s碎片→复制链接替换到Python代码→运行代码(或手动用FFmpeg终端融合)→得到无水印视频,全程不用懂复杂技术,跟着步骤来,零基础也能上手!

最后提醒:爬取的视频仅用于个人二创,请勿用于商业用途,尊重原作者版权哦~