使用Google colab, python得到B站系列视频的弹幕

环境:
Google colab, 

python 3.8

为什么使用 Colab

使用colab可以免去安装jupyter配置python等麻烦,......

刨去这些外在的,

首先连接Google drive

import os
from google.colab import drive
drive.mount('/content/drive')
 
path = "/content/drive/My Drive"
 
os.chdir(path)
os.listdir(path)

并且将绝对路径设置为自己创建的路径

这里我将在MyDanMu的文件夹目录下设置为主目录

%cd /content/drive/MyDrive/BilBilDanMuPaQu/MyDanMu

以上的Colab标准开端, 如果你使用的是jupyter 可以忽略以上,

PS: 最推荐Colab, 我试过jupyter会有些莫名其妙的错误

------------------------------------------------------------分界线------------------------------------------------------------

我们正式开始, 首先引入我们用到的包,

一,用到的库

import requests
from bs4 import BeautifulSoup
import re
import pandas as pd
import time
import numpy as np
from PIL import Image
import jieba
import wordcloud

其中requests和bs4以及re是爬虫的主力军,而numpy、Image、jieba、wordcloud就是生成词云要用到的东西。pandas是便于格式化来输出文件是。

二,定义一些要用到的数据结构和请求头

我们将想要的B站视频的url 和 一些我们需要的列标题 和 需要的headers 设为常量

( 为了过审, 将具体的网页给删除了需要自己添加)

headers = {}
# 视频位置(s)
video_time=[]

# 评论时间
abstime=[]

# 用户id
userid=[]

# 弹幕颜色
colorM=[]

# 弹幕内容
comment_content=[]

# 总时间
_duration_ = []

# 编程类视频的列表
codingUrl = [
    
]

# 日语类视频的列表
japaneseLanguageUrl = [
    
]

三,寻找API

经过查询资料,我们知道类似于一个链接(被和谐)可以获取到部分弹幕信息。然后我们来访问看一看。

是个xml文件,我们发现只需要获取这个oid参数就能获取某个视频的弹幕信息。

然后寻找视频对应的oid信息。

接着我们发现了一个链接(被和谐)。这个链接就能获取视频链接的oid,就是这个cid

接着是获取bvid,这个就是视频链接中包含的信息。

四,获取cid

def get_cid(url):
    data = requests.get(url=url,headers=headers)
    data = data.json()
    cid = data['data'][0]['cid']
    return cid

我们发现获取cid的页面是个json文件,然后我们可以将直接取json文件中的cid的值。

五,获取弹幕信息

def get_info(url):
    html = requests.get(url=url, headers=headers)
    html.encoding = html.apparent_encoding
    
    soup = BeautifulSoup(html.text,'lxml')
    
    data_number=re.findall('d p="(.*?)">',html.text)
    data_text=re.findall('">(.*?)</d>',html.text)
    
    comment_content.extend(data_text)
    for each_numbers in data_number:
        
        each_numbers=each_numbers.split(',')
        
        video_time.append(each_numbers[0])           
        abstime.append(time.strftime("%Y/%m/%d %H:%M:%S", time.localtime(int(each_numbers[4]))))      
        userid.append(each_numbers[6])
        
    result={'用户id':userid,'评论时间':abstime,'视频位置(s)':video_time,'弹幕内容':comment_content}
    results=pd.DataFrame(result)
    final= results.drop_duplicates()
    final.info()
    final.to_excel('B站弹幕.xls')

这里我们还是获取那个xml文件,然后利用正则表达式获取xml中各个列的值,我们保存用户编号,评论时间,弹幕的视频位置,弹幕内容。然后保存到xls文件中。

六,爬取系列视频

现在根据我们已经可以爬取单个视频的弹幕了.

如果我们要爬取系列视频怎么办呢? 稍微调整代码:

1.获得CID LIst码 获得各个视频的时间

def get_cid(urlList):
    cid = []
    video_time = []
    for url in urlList:
      // 还是臭审核
      cid_url = "https://" + "api.bil" + "ibili.c" + "om/x/player/pagelist?bvid="+str(url[31:43]) +"&jsonp=jsonp"
      print("\"" + str(url[31:43])+ "\"" + ",")
      data = requests.get(url=cid_url,headers=headers)
      data = data.json()
      for i in data['data']:
        cid.append(i['cid'])
        video_time.append(i['duration'])
    return cid,video_time

2.获得ori_url LIst码

def get_ori_cid(cidUrlList):
    oriUrlList = []
    for cid in cidUrlList:    
      // 可恶的审核
      oriUrl = 'ht'+ 'tps:/' + '/api.bi' + 'lib' + 'ili.c'+ 'om/x/' + 'v1/dm/list.so?oid='+str(cid)
      oriUrlList.append(oriUrl)
    return oriUrlList

3.制作弹幕表

def make_info_of_danMu():
    Number = 0
    for i in range(50):
        video_time=[]
        abstime=[]
        userid=[]
        colorM=[]
        comment_content=[]
        _duration_=[]
        cur = 0
        for url in oriUrlList:
            if 10*i+10 > cur >= 10*i:
                html = requests.get(url=url, headers=headers)
                html.encoding = html.apparent_encoding
                
                soup = BeautifulSoup(html.text,'lxml')
                
                data_number=re.findall('d p="(.*?)">',html.text)
                data_text=re.findall('">(.*?)</d>',html.text)
                
                comment_content.extend(data_text)
                for each_numbers in data_number:
                    # Number = Number + 1
                    each_numbers=each_numbers.split(',')
                    video_time.append(each_numbers[0])           
                    abstime.append(time.strftime("%Y/%m/%d %H:%M:%S", time.localtime(int(each_numbers[4]))))      
                    userid.append(each_numbers[6])
                    colorM.append(each_numbers[3])
                    _duration_.append(duration[cur])
                    # theNumber.append(Number)

            cur = cur + 1

        # print(len(theNumber))
        print(len(userid))
        print(len(abstime))
        print(len(video_time))
        print(len(comment_content))
        print(len(colorM))
        print(len(_duration_))
    
        result={'用户id':userid,'评论时间':abstime,'视频位置(s)':video_time,'弹幕内容':comment_content,'颜色':colorM,'总时间':_duration_}
        results=pd.DataFrame(result)
        final= results.drop_duplicates()
        final.info()
        final.to_excel(str(i)+'B站编程弹幕.xls')

七.总函数

if __name__ == "__main__":
    // 输入系类视频的url
    cidUrlList,duration = get_cid(codingUrl)
    oriUrlList = get_ori_cid(cidUrlList)
    make_info_of_danMu()

写在最后, 欢迎访问我的主页. (因为审核还是别访问了!!!!!!!!!!!!)

来访问!!!哈哈哈哈改成转载的QAQ, 

老罗的主页

UI的期末作业, 不强但是很自豪.

也请大神多多提意见

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值