【哔哩哔哩】 Python爬虫下载bilibili视频

SunriseCai 2020-11-13 11:28:44
Python 爬虫 下载 视频 bilibili


此博客仅为我业余记录文章所用,发布到此,仅供网友阅读参考,如有侵权,请通知我,我会删掉。

前言

近日,有小伙伴说想看一篇关于视频下载的文章,这不,拿bilibili来开刀了。
由于没有深入的对bilibili进行研究,导致文章可读性比较差,不喜勿喷。
虽是浅尝辄止。但是下载视频的目的可以达到。

关于清视频晰度:

方法 描述
未登录状态 抓取的视音频url参数:mid=0
登录状态 抓取的视音频url参数:mid=xxx(一串数字)

如果是未登录状态,那就没有什么清晰度可言。
若你登录状态下打开一个视频,选择高清,那么!!用你这串mid去请求的视频都是高清(视频本身没有高清除外)。

1. 思路

在这里说下整体思路!

  1. 找到视音频的url是关键
  2. 分别下载视音频后,再进行视音频混流(即画面和声音合成一个文件)。

话不多说,下面开始!!!

2. 分析

文章以下图中的视频为例。文中为Firefox浏览器,方便展示抓包效果。在这里插入图片描述
首先就是打开开发者工具抓包啦。如下图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

看到抓包页面的媒体分类,都是mp4格式的数据包,数据包的大小从107字节到2.30MB不等。有一个很有趣的规律如下:

  1. 107字节的数据包都是通过OPTIONS的方式请求。
  2. 大一些的数据包都是通过GET方式请求。
  3. 有两个重复多次的URL(猜测是视音频)
  4. 请求头的Range字段,下一个文件会接上上一个文件的字节尾数,1文件是0-973,2文件是974-1653。。。

既然如此,下面用代码来请求一下看看。
在这里插入图片描述
执行代码后,生成了一个1kbtest.mp4文件,很显然,打开时候报错了
在这里插入图片描述
为什么会报错呢??我觉得是文件太小了,修改请求头的Range值为0-1024000,再次运行代码。
这次生成了一个1001kbmp4文件,且可以播放!!但是视频没有声音,证实 了bilibili的视频文件是视音频分离的。
在这里插入图片描述

上面有说到,抓到的数据包大部分是两个重复的URL,现在请求另一个URL看看。

代码只是将URL做了修改,请求头没有变化。
在这里插入图片描述
(图中看不出是音频,但是是有声音的),这样,就完成本次抓包工作了。
在这里插入图片描述


到了这里,抓包工作已经完成,视音频的由来也清楚了,那问题来了,这么长的一串URL是从哪里来的呢?
!!! 看源码。
百思不得其解,却忘记了最简单的方法,查看网页源码(花费了好一会儿时间才发现,原来源码里面就有!!!)

video的URL:
在这里插入图片描述
audio的URL:
在这里插入图片描述
到了这里,剩下的用正则匹配源码里面的video和audio的URL都不是问题了吧!!!


剩余问题:

  • 还需将视频和音频混流,这个可以用ffmpeg完成或使用格式工厂。

2.1 ffmpeg合成音视频

2.1.1 安装ffmpeg

ffmpeg官网:https://ffmpeg.zeranoe.com/builds/

点击进去下载对应的电脑版本即可。
在这里插入图片描述

下载文件解压缩后入下图所示:
在这里插入图片描述
然后将bin这个文件的目录添加到系统环境变量即可。如下图:
在这里插入图片描述


稍稍解释一下这里用到的ffmpeg的命令的意思:

方法 描述
-c copy 拷贝所有的流
-i 输入文件
-loglevel 使用的日志记录级别
quiet 跟在loglevel后面,表示不输出日志

感兴趣的小伙伴可以点击ffmepeg中文文档,深入了解。

这里还用到了subprocess模块,用来生成子进程,并可以通过管道连接他们的输入/输出/错误,以及获得他们的返回值。

import subprocess
def merge_video_and_audio(video_name):
"""
音视频合并函数,利用ffmpeg合并音视频
:param video_name: 传入标题
:return:
"""
cmd = f'ffmpeg -i "{video_name}.m4s" -i "{video_name}.mp3" -c copy "{video_name}.mp4" -loglevel quiet'
subprocess.Popen(command, shell=True)
print(f'{video_name}.mp4合并完成!!!')

执行代码后的样子:

  • 可以看到已经成功合成mp4格式的视频了。

在这里插入图片描述

2.2 格式工厂合成音视频

ps:这里用了其他视频做示例。
1.下载好的视音频:
在这里插入图片描述
2.打开格式工厂:
在这里插入图片描述
3.视音频混流:
在这里插入图片描述
最后,静静等待混流完成即可。
以上代码,在这里下载。
代码自取: https://github.com/SunriseCai/spiderCode

3. 后面的话

小伙伴们如果感兴趣的话,可以完善代码。几个建议如下:

  1. 增加可以手动输入搜索视频的功能
  2. 利用Pyqt5做成可视化的bilibili视频下载小工具

小伙伴们若是完善后代码记得发我一份哦!!!

版权声明
本文为[SunriseCai]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_45081575/article/details/104334749

  1. 利用Python爬虫获取招聘网站职位信息
  2. Using Python crawler to obtain job information of recruitment website
  3. Several highly rated Python libraries arrow, jsonpath, psutil and tenacity are recommended
  4. Python装饰器
  5. Python实现LDAP认证
  6. Python decorator
  7. Implementing LDAP authentication with Python
  8. Vscode configures Python development environment!
  9. In Python, how dare you say you can't log module? ️
  10. 我收藏的有关Python的电子书和资料
  11. python 中 lambda的一些tips
  12. python中字典的一些tips
  13. python 用生成器生成斐波那契数列
  14. python脚本转pyc踩了个坑。。。
  15. My collection of e-books and materials about Python
  16. Some tips of lambda in Python
  17. Some tips of dictionary in Python
  18. Using Python generator to generate Fibonacci sequence
  19. The conversion of Python script to PyC stepped on a pit...
  20. Python游戏开发,pygame模块,Python实现扫雷小游戏
  21. Python game development, pyGame module, python implementation of minesweeping games
  22. Python实用工具,email模块,Python实现邮件远程控制自己电脑
  23. Python utility, email module, python realizes mail remote control of its own computer
  24. 毫无头绪的自学Python,你可能连门槛都摸不到!【最佳学习路线】
  25. Python读取二进制文件代码方法解析
  26. Python字典的实现原理
  27. Without a clue, you may not even touch the threshold【 Best learning route]
  28. Parsing method of Python reading binary file code
  29. Implementation principle of Python dictionary
  30. You must know the function of pandas to parse JSON data - JSON_ normalize()
  31. Python实用案例,私人定制,Python自动化生成爱豆专属2021日历
  32. Python practical case, private customization, python automatic generation of Adu exclusive 2021 calendar
  33. 《Python实例》震惊了,用Python这么简单实现了聊天系统的脏话,广告检测
  34. "Python instance" was shocked and realized the dirty words and advertisement detection of the chat system in Python
  35. Convolutional neural network processing sequence for Python deep learning
  36. Python data structure and algorithm (1) -- enum type enum
  37. 超全大厂算法岗百问百答(推荐系统/机器学习/深度学习/C++/Spark/python)
  38. 【Python进阶】你真的明白NumPy中的ndarray吗?
  39. All questions and answers for algorithm posts of super large factories (recommended system / machine learning / deep learning / C + + / spark / Python)
  40. [advanced Python] do you really understand ndarray in numpy?
  41. 【Python进阶】Python进阶专栏栏主自述:不忘初心,砥砺前行
  42. [advanced Python] Python advanced column main readme: never forget the original intention and forge ahead
  43. python垃圾回收和缓存管理
  44. java调用Python程序
  45. java调用Python程序
  46. Python常用函数有哪些?Python基础入门课程
  47. Python garbage collection and cache management
  48. Java calling Python program
  49. Java calling Python program
  50. What functions are commonly used in Python? Introduction to Python Basics
  51. Python basic knowledge
  52. Anaconda5.2 安装 Python 库(MySQLdb)的方法
  53. Python实现对脑电数据情绪分析
  54. Anaconda 5.2 method of installing Python Library (mysqldb)
  55. Python implements emotion analysis of EEG data
  56. Master some advanced usage of Python in 30 seconds, which makes others envy it
  57. python爬取百度图片并对图片做一系列处理
  58. Python crawls Baidu pictures and does a series of processing on them
  59. python链接mysql数据库
  60. Python link MySQL database