教你如何用python批量下载B站的视频—更新版

  • 2019 年 12 月 15 日
  • 笔记

由于B站的更新,之前的代码已经不能够去爬取视频了,于是乎更新一下。

由于B站在获取它的aid编号的地方换成了其他的东西,所以会导致错误,这时候换个地方去获取它的aid编号便可以顺利获取视频了。

这块就是要修改的代码,把注释的第一行换成接下来的三行即可。

其他的仍不需要改动。


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

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

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

import requests  from bs4 import BeautifulSoup  import re  import os  import subprocessurl = 'https://search.bilibili.com/all?'         'keyword=%E6%B5%B7%E8%B4%BC%E7%8E%8B&from_source=nav_search'def gethtml(url):
        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之中。

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()里面的内容一样。

最终的效果就是这样: