# Bilibili Tools  

## 内容列表
- [背景](#背景)
- [已完成](#已完成)
- [安装](#安装)
- [使用说明](#使用说明)
- [维护者](#维护者)

## 背景   
本项目主要是通过爬虫获取Bilibili各种信息，包括个人信息，视频下载，弹幕下载等。具体有多少功能主要取决于我自己有什么需求。但是会尽可能多
的实现各种功能。这些功能并不会以web应用或者GUI等形式出现，更像是以一个可调用的库的形式出现，这样可以很方便的给我自己去构建很多应用。当
然我自己感觉这个项目算是自己对于Python的一个实践吧。学了很多，但是平常写的机会挺少的，好些技巧都已经忘记了，借着这次机会也是重新学习和
巩固（如果不是这次疫情还抽不出这么多时间来写）。最后本项目仅用于学习交流，请勿用于任何商业用途。

## 已完成    
* 目前所有的代码都是在Windows下完成的，并没有在Linux下进行测试，但是应该没有太大问题。   
* 视频下载(在2020年2月23号B站开始使用BV号而不是AV号，昨天稍微修把项目修改了一下)
* 视频信息获取(包括点赞数，弹幕等)

## 安装   
首先要确保你的电脑安装了ffmpeg并且设置了环境变量，如果没有，那么请前往它的[官网](http://ffmpeg.org/)下载。在确保你安装了ffmpeg的情况
下，请在命令行输入如下的命令以此来安装运行该项目所必须的依赖。   
```
pip3 install biget
```   

## 使用说明   
首先导入该模块
```
from biget import Video
```
然后给Video类的构造函数传递参数来构建video对象，传入的参数就是视频的bv号
```
v = Video('BV1fE411F7AF')
```
在这个情况下v对象有如下的属性：   
* bv：视频的bv号码
* bv_url：视频地址
* title：视频标题
* date：视频发布日期
* page_list：B站的视频可能一个视频有多个p也就是多集，这里是bv号下所有的视频的信息
* page_num：集数也就是p的数量
* data：关于视频的信息，在没有调用access方法之前改返回值为None否则返回值为下面的形式
```
{
    'bvid': 视频bv号码,
    'aid': 视频对应的av号码,
    'page_num': 同一个bv下p的数量,
    'title': 视频标题,
    'date': 发布日期,
    'owner': up主,
    'owner_id': up主id,
    'view': 观看量,
    'danmaku': 弹幕数量,
    'reply': 评论数,
    'favorite': 收藏数量,
    'coin': 投币数量,
    'share': 转发数量,
    'now_rank': 当前排名,
    'his_rank': 全站排名,
    'like': 点赞数,
    'page': 每一个p的信息,
    'tags': 视频的标签信息,
}
```
* bullet_comments: 视频的弹幕内容，在默认情况下为None，在调用了get_bullet方法之后才会有数据。执行之后该对象的bullet_comments会是
一个二维list对象，该对象存的每一个元素是一个bs4.element.Tag对象，要想获取里面的文本信息可以使用.text方法。

对象方法(下面假设类对象是video)：
* download(pages, path='.', cover=True, keep=True, bilingual=True, insert=False)
    * pages：要下载该bv号下管理的哪几集视频，需要传入一个可迭代对象，如果想下载全集可以传入range(video.page_num)。如果你想选择跳跃
    的集数，那么请记住，输入的集数要比真实的小1。例如你想要获取第2集，第5集，那么你可以传入[1, 4]。
    * path：下载的路径，默认情况下会在当前如路径下载（下载的视频会在给定路径下创建文件夹，以视频名字命名）
    * cover：当cover为True的时候会如果文件夹里有同名文件会直接覆盖
    * keep：是否保存m4s文件，因为b站直接爬取保存的是m4s，将m4s做处理之后才是我们的最终文件
    * bilingual：为True时，视频在合并字幕的时候会合并两个CC字幕，当然这个的前提是该视频有两个CC字幕（当CC字幕数量大于2的时候就会取前
    两个CC字幕），否则只合并一个
    * insert：是否将CC字幕作为内嵌字幕，为True是则是作为内嵌字幕，（如果为True可能会需要比较长的时间处理），该参数为True只有在
    bilingual为false的情况下才有效
* access()
* get_bullet(pages)
    * pages：因为bv下的每一个视频都有自己的弹幕，所以你可以选择要获取的集数，同download需要传入一个可迭代对象，如果想下载全集则传入
    range(video.page_num)，如果你想选择跳跃的集数，那么请记住，输入的集数要比真实的小1。例如你想要获取第2集，第5集，那么你可以传入
    [1, 4]。


## 维护者    
| 维护者                                         | 邮箱                                                        |
| --------------------------------------------- | ------------------------------------------------------------ |
|[@ujay-zheng](https://github.com/ujay-zheng)   | 897013045@qq.com|