教你如何用python批量下载B站的视频

2019-10-11 12:14:41 浏览数 (1)

一开始,我本来是想要做一个将视频转换为字符串的视频的,首先就得找一个视频做素材,紧接我就逛逛B站,找我想要的视频,然后发现B站并没有下载的按钮,于是乎我就想,就做个小爬虫爬一个视频来用,然后我发现事情并没有我想象的那么简单。。。


想要爬取视频,首先就得去获取视频的url。首先先从这个大的搜索窗口里,获取视频的信息,url,标题,id编号等待,这里就直接在chromo浏览器里按F12,跳出下面的窗口后,按住ctrl shift c,然后就会出现一个定位的功能,(这是开发者工具左上角的箭头的快捷键),然后就可以回到网页上定位你想要的数据的代码,在你滑动的时候,开发者工具的代码也会随之而变,这样就可以快速定位了。

这里我选用的库是requests库来爬取B站,如果你的环境没有requests库的话,Windows下的,可在控制台窗口,输入pip install requests进行安装,其他操作系统可以自行百度去安装。代码中用到的其他的库,如果缺少也需要提前安装。

这里只截取了一部分重要一点的代码,其他的代码在后面贴出

代码语言:javascript复制
import requests
from bs4 import BeautifulSoup
import re
import os
import subprocessurl = 'https://search.bilibili.com/all?' 
      'keyword=海贼王&from_source=nav_search'def gethtml(url):
代码语言:javascript复制
        headers = {
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64;'
                ' x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                              'Chrome/76.0.3809.100 Safari/537.36'
        }
        repsonse = requests.get(url, headers=headers)
        repsonse.encoding = 'utf-8'
        return repsonserep = gethtml(url)
soup = BeautifulSoup(rep.text,'lxml')
divobj = soup.find_all('div',class_ = "headline clearfix")

gethtml(url)是最简单的获取网页的一个语句模块,因为会经常调用他所以我把这个弄成了一个函数。其中url作为参数传进来,因为b站有做反爬机制,所以如果不加headers的话会获取不到网页的数据,然后在将获取的数据返回回去,然后分析网页的这里我用的时beatifulsoup,Beatifusoup的第一个参数是网页的数据,然后第二个参数是声明解析器,除了lxml,还有html.parse,html5lib xml 【这个是唯一支持XML的解析器】。然后利用find_all查找所有标签,第一个参数是查找的标签的名称,第二个参数是要查找的class的名称。

根据上图定位的位置,然后找到上一层的div的位置,然后定位,并保存到divobj之中。

代码语言:javascript复制
objpath = os.getcwd() os.sep '海贼王视频'
if not os.path.exists(objpath):
        os.makedirs(objpath)
else:
        print('文件夹已存在!!')
videopath = os.getcwd() os.sep 'video'
if not os.path.exists(videopath):
        os.makedirs(videopath)
else:
        print('文件夹已存在!!')
audiopath = os.getcwd() os.sep 'audio'if not os.path.exists(audiopath):
        os.makedirs(audiopath)
else:
        print('文件夹已存在!!')

因为b站的视频获取到的时候是音画分离的,需要分开获取视频的和声音,所有这里就先定义两个文件夹来分开保存这些声音和视频,第一个海贼王视频是将声音和视频结合起来后最终的成品保存的文件夹。流程就是先获取程序所在地址,然后加一个文件夹名,如果不存在则创建文件夹,存在则输出已存在。

然后就是重要的获取视频链接了,我这里就紧随前人的步伐,不做一期抓包的过程,直接就知道了视频的链接和音频的链接都在获取的网页中 了,链接在一个video和audio后面,然后写个正则就可以把他们提取出来,提取的所有链接中,第一个是画质比较高的,越往后质量越差,因此提取第一个即可。

这里就是提取视频的url的代码,aid是获取视频的av编号,vid是视频的链接

aid是音频的链接,title是获取这个视频的标题,以防这个视频的链接获取失败,所有加了个try进行判断,

这个是后续代码,将获取的链接,下载成视频,并保存到先前创建好的文件夹中,用他的视频的编号进行命名,当然也可以用他的标题命名,但是先做好命名的时候将一些不能用的字符替换掉即可。

紧接着在用ffmpeg去将音画合并成一个视频,并输出到另外一个文件夹中,要使用ffmpeg需要提取下载ffmpeg,并将将这个下载路径添加到系统路径之中,要调用ffmpeg之前,需要下载subprocess库,然后利用subprocess

.run函数。这个函数就是相当于打开cmd窗口输入run()里面的内容一样。

最终的效果就是这样:


这里我想说一件事情就是前几天有人邀请我入驻了腾讯云 社区,然后我的文章也自动同步到了云社区了,如果有玩腾讯云的话,可以同名搜索一下,点一波关注。

最后祝大家假期快乐。

0 人点赞