用Python爬取Bilibili上二次元妹子的视频

本文详细介绍使用Fiddler抓包结合Python与Requests库,实现从Bilibili网站下载视频的全过程。涵盖视频包抓取、Headers参数分析、视频下载代码实现及UP主主页视频信息爬取技巧。

点击上方“菜鸟学Python”,关注

文末干货立马到手

作者:Mike_Shine

来源:https://urlify.cn/2qyMBb

一直想爬取BiliBili的视频,无奈一直没有去研究一下。

最近,在旭哥的指点之下,用了Fiddler抓包,抓到了一直期待的视频包,完成了下载。

下面写一下我做这个爬虫的过程。

# 相关依赖  :Fiddler+Python3 + Requests

下面看一下我做这个爬虫的具体步骤:

1. 进入某个具体视频的页面抓取视频包测试。

进入这个页面:https://www.bilibili.com/video/av26019104,如下图所示。点击播放按钮。

可以看到Fiddler已经抓到了很多包。别着急,现在还没有视频包出现。由于需要时间下载,所以具体视频包会过一会才能弹出来。

过大概一两分钟,就会看到这个包,如下图。可以清楚的看到这个是Flv形式的视频流的包,看这个包的大小也可以看出来,是相当的大。

下面分析一下这个包的具体参数。点击上图红色圈圈那个“Raw",会弹出下面这个窗口

可以看到是一个Get请求,请求的url和Headers都很清楚。

这时候就可以实验一下,来写一小段代码测试一下是否可以通过requests.get()方法来下载视频。

#######################################################################import requests
with open("D:\video\bilibili.mp4") as f:  f.write(requests.get(url, headers = headers, verify = False).content)       #这里的Verify=False是跳过证书认证  print("下载完成") # 这里只是写了核心部分,headers和url没有写,直接copy过来就好了,# 注意Url前面要加Host.   真正的请求地址是http://主机Host地址/upgcx.......############################################################################

可以看到如果你运行这段代码,已经可以把视频下载到了本地。

这里你可以多试几个视频,可能会发现,有些视频按照抓包得到的Headers,请求之后只能Get到一部分视频,比如视频8M,你Get到只有2M。你去看一下Headers就会发现,他多了一个Range参数。把这个删除掉,就可以下载了。

经过我的实验,所有视频请求的Headers格式都可以统一为下图这样。里面有2个参数哈。

1.host,主机名,就是从你爬出来的URL中正则出来的host

2. 视频标号。

2. 获取请求Headers参数和请求源URL:

要找URL,可以看一下URL中的内容,里面的hfa=xxxxxxxx和hfb=xxxxxxx应该是加密的?这可怎么办。这时候用Fiddler,从抓来的包里搜索一下这两个参数,肯定藏在某个包里。用CTRL + F 输入hfa 搜索。可以看到包含HFA关键字的包都被找出来了。

进去一看,其实包含在网页源代码的包,也就是说URL中的参数包含在网页源代码里。

回到最初的那个视频页面,看一下网页源代码。搜索一下URL。

惊喜的发现,其实整个URL都在网页源码里。这岂不是太简单了。

不过需要注意的是,这个URL中含有的hfa等加密部分是会动态变化的。所以在最终脚本的代码结构中,需要拿一个URL,及时用来做get请求。下载完成之后再拿下一个URL。

我之前就犯过这样的错,由于URL过期,导致部分视频下载不到。

3. 从UP主的主页爬取所有视频的信息(视频编号,标题)。

在之前的实验之上,现在只要有视频编号,我们就可以下载到对应的视频了。所以接下来要做的工作就是从Up主的主页来获取所有的视频信息。

访问某个Up主的主页

点击圈圈的更多,可以进入所有视频的页面。

这时候看Filddler抓包的结果,看到这个json包,里面包含了本页所有视频的信息。

同样,看一下包头。如下图

也做一下实验,可以发现Cookie是不必须的参数。

同之前下载视频的Get方法,同样可以Get到这个Json包。然后就可以把内容通过Json解析的语句拿出来。

这里我并没有做翻页的工作,而是直接请求了100个视频。想做翻页的同学,加一点代码就好了。

近期热门:

● 80%的人都不知道,全球Python库下载前10名
● 我珍藏的一些好的Python代码,技巧|上篇
● 爬取300本Python书籍,用Python告诉你哪家强?
● 简单几步,100行代码用Python画一个蝙蝠侠的logo
● 我用Python分析了《青春有你2》109位漂亮小姐姐,真香!
● 牛逼操作!用Python做了一个编程语言20年的动态排行榜!
● 我打赌,学会这6招,谁再敢笑你的Python程序慢!


点击阅读原文,原创400篇干货文章
<think>好的,用户需要Python代码来爬取Bilibili视频并保存到文件夹。首先,我得回忆一下之前关于B站爬虫的方法。B站的视频通常有分片,音视频可能分开,所以可能需要分别下载然后合并。首先,用户需要获取视频的aid和cid,这样才能请求到视频的播放源。可能需要解析网页或者使用B站的API。根据引用[3],用户提到使用F12获取请求链接,可能需要找到接口和参数。比如,视频信息可能通过API接口获取,比如通过视频的BV号来获取cid,然后构造请求链接。然后,下载视频和音频部分。B站的视频可能用了m4s格式,分视频和音频流,需要分别下载。下载完成后,可能需要用ffmpeg或者moviepy来合并。不过用户可能希望用Python代码实现,所以得考虑调用这些工具的方法。 保存到文件夹的话,需要处理路径,创建目录,确保文件正确保存。代码中需要用到os模块来管理文件夹结构。另外,可能需要处理反爬机制,比如headers中添加User-Agent和Referer,否则可能被拒绝访问。引用[1]和[2]提到使用requests和BeautifulSoup,但实际现在B站的页面可能动态加载,直接解析HTML可能不够,需要找到正确的API接口。 综合这些步骤,代码的大致流程应该是:输入视频URL,解析出aid和cid,请求API获取视频和音频的URL,分别下载,然后用ffmpeg合并。需要确保依赖库安装,比如requests,moviepy等。可能遇到的问题:API参数加密,比如cid可能需要从网页中提取,或者通过另一个接口获取。此外,下载链接可能带有鉴权参数,有效期有限,需要及时下载。 用户可能需要代码示例,所以得写出结构清晰的函数,比如获取视频信息、下载文件、合并音视频。同时,要处理异常,比如网络错误,文件保存错误等。最后,测试代码是否有效,可能需要更新API的获取方式,因为B站可能会更改接口。所以代码中可能需要动态获取参数,或者使用现有的第三方库如bilibili-api来简化流程,但用户可能希望自己实现,所以得用基础的方法。</think>### Python实现Bilibili视频爬取与保存 #### 核心步骤说明 1. **获取视频参数**:通过B站API获取视频的`bvid`和`cid`参数 2. **请求播放源**:使用`web_playurl`接口获取音视频分片地址[^3] 3. **下载文件**:分别下载视频流(`.m4s`)和音频流(`.m4s`) 4. **合并文件**:使用`moviepy`库合并音视频文件[^2] 5. **保存管理**:自动创建文件夹并按标题分类存储 #### 完整代码示例 ```python import os import requests from moviepy.editor import VideoFileClip, AudioFileClip def get_video_info(url): headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36", "Referer": "https://www.bilibili.com/" } resp = requests.get(url, headers=headers).json() return { "title": resp['data']['title'], "video_url": resp['data']['durl'][0]['url'], "audio_url": resp['data']['dash']['audio'][0]['base_url'] } def download_file(url, filename, folder): path = os.path.join(folder, filename) with requests.get(url, stream=True) as r: with open(path, 'wb') as f: for chunk in r.iter_content(chunk_size=8192): f.write(chunk) def merge_av(video_path, audio_path, output_path): video = VideoFileClip(video_path) audio = AudioFileClip(audio_path) video.set_audio(audio).write_videofile(output_path) def main(bvid): base_api = f"https://api.bilibili.com/x/player/playurl?bvid={bvid}&qn=80" info = get_video_info(base_api) folder = os.path.join("Downloads", info['title']) os.makedirs(folder, exist_ok=True) video_file = os.path.join(folder, "video.m4s") audio_file = os.path.join(folder, "audio.m4s") output_file = os.path.join(folder, f"{info['title']}.mp4") download_file(info['video_url'], "video.m4s", folder) download_file(info['audio_url'], "audio.m4s", folder) merge_av(video_file, audio_file, output_file) if __name__ == "__main__": bvid = input("请输入视频BV号(如BV1xx411x7xq):") main(bvid) ``` #### 使用说明 1. 安装依赖库:`pip install requests moviepy` 2. 获取视频BV号(浏览器地址栏可见) 3. 运行代码后输入BV号 4. 下载文件将保存在`Downloads/视频标题`目录 #### 注意事项 1. 需要处理B站的反爬机制,建议添加`cookies`参数[^1] 2. 高清视频需要`qn=80`参数(1080P) 3. 合并过程依赖ffmpeg,需确保环境变量配置正确[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值