python爬取B站视频中的弹幕并图形化展示

python爬取B站视频中的弹幕并图形化展示

新手上路,参考:https://blog.csdn.net/csdnnews/article/details/106754771案例
需要了解爬取的地址:
1:视频地址:https://www.bilibili.com/video/BV1PK4y1b7dt?t=1
2.对于参考文档中提到的B站API接口,是如何找到的,不是很清楚,故只能照搬过来:https://api.bilibili.com/x/v1/dm/list.so?oid=XXX,其中XXX需要在网页中获取
3.oid=XXX中的XXX获取:
获取cid:https://api.bilibili.com/x/player/pagelist?bvid=BV1PK4y1b7dt&jsonp=json
python爬取B站视频中的弹幕并图形化展示_第1张图片此处的cid,即所需XXX,如果视频是分段的,则会有多个cid值,这里只有一个
故完整的接口为:https://api.bilibili.com/x/v1/dm/list.so?oid=201056987
代码:我这是分两部分,爬取弹幕保存本地,本地读取构成词云图
本地爬取:

import requests
import json
import re
import chardet   #提供自动检测字符编码的功能
from pprint import pprint    #打印出任何python数据结构类的和方法,没用到
from wordcloud import wordcloud   #是一种将词语用图片表达出来的一种形式

'''根据bvid请求得到cid'''
def get_cid():
    #视频地址:https://www.bilibili.com/video/BV1PK4y1b7dt?t=1
    url='https://api.bilibili.com/x/player/pagelist?bvid=BV1PK4y1b7dt&jsonp=jsonp'
    res=requests.get(url).text
    #将获取的网页json编码字符串转换为python对象
    json_dict=json.loads(res)
    return json_dict["data"][0]["cid"]

'''根据cid请求弹幕,并解析所得数据'''
def get_data(cid):
    #https://api.bilibili.com/x/v1/dm/list.so?oid=XXX
    #最终爬取API:https://api.bilibili.com/x/v1/dm/list.so?oid=201056987
    try:
        final_url="https://api.bilibili.com/x/v1/dm/list.so?oid="+str(cid)
        final_res=requests.get(final_url)
        final_res.encoding='utf-8'
        final_res_encoding=chardet.detect(final_res.content)
        final_res=final_res.text
        pattern=re.compile('(.*?)')
        data=pattern.findall(final_res)
        print(u"获取的data=",data)
        return data
    except Exception as e:
        print("执行get_data失败:",e)

'''保存弹幕列表'''
def save_to_file(data):
    try:
        with open('zjl_mv.txt',mode="w",encoding='utf-8') as f:
            for i in data:
                f.write(i)
                f.write("\n")
        f.close()
    except Exception as e:
        print ("执行保存文件报错:",e)

构成词云图:

import pandas as pd   #用于数据导入及整理模块,对数据挖掘前期数据的处理
import jieba    #用于中文分词的模块,名为结巴分词库
from wordcloud import wordcloud   #是一种将词语用图片表达出来的一种形式
import matplotlib.pyplot as plt   #python的绘图库
from imageio import imread  #提供一个接口来读取和写入大量的图像数据

import warnings
'''忽略匹配的警告'''
warnings.filterwarnings("ignore")

'''将文本进行分词'''
def cut():
    try:
        with open('zjl_mv.txt',encoding='utf-8') as f:
            text=f.read()
        #text=text.replace('#后台播放','').replace('!','').replace('#','').split()  #以空格、\n为分隔符对text进行切片,是一个列表
        text=text.replace('#后台播放',' ').replace('后台播放',' ').split()  #以空格、\n为分隔符对text进行切片,是一个列表
        print("text=",text)
        jieba.suggest_freq('小公举',True)  #使得小公举这个词不被拆分
        data_cut=[jieba.lcut(x) for x in text if '\n' not in x]  #返回的是对X进行分词的列表,X
        print("data_cut=",data_cut)
        '''词频统计'''
        all_words=[]
        for i in data_cut:
            all_words.extend(i)  #将分词列表合成一个新的列表展示
        word_count=pd.Series(all_words).value_counts()  #返回一个包含所有值及其出现次数的Series,且为降序输出
        #print("排序分词:",word_count)
        f.close()
        return word_count
    except Exception as e:
        print("分词出错",e)
        return 1

'''词云图的制作'''
def citu(data_cut):
    try:
        bj_picture=imread(r"D:\code\pytest3\img\bj.jpg")   #读取背景图
        '''设置词云参数'''
        wc=wordcloud.WordCloud(font_path="G:\\6Tipdm\\wordcloud\\simhei.ttf",
               background_color="white",
               max_words=2000,
               mask=bj_picture,
               max_font_size=100,
               random_state=42)
        wc2=wc.fit_words(data_cut)
        '''绘制图云图片'''
        plt.figure(figsize=(10,6))
        plt.imshow(wc2)
        plt.axis("off")
        plt.show()
        wc.to_file("ciyun.png")
    except Exception as e:
        print("词云图制作报错:",e)

最终效果:
python爬取B站视频中的弹幕并图形化展示_第2张图片

总结:
1.json数据格式的使用,request获取的text,一般都是就json数据格式,需要使用json.loads(text)函数将就json编码格式转换程序python对象,反之可以使用json.dumps(text);
2.精准数据获取:针对json编码转python对象,json的object、array、string、number(ini)、number(real)、true、false、null分别对应python的dict、list、Unicode、int/long、float、True、False、None,可以根据python的各类操作进行数据获取
3.乱码问题:发送request.get请求得到的text文本,打印出现乱码问题,可以通过在发送request.get请求返回的response对象指明编码方式,再去获取text属性,如下图:
python爬取B站视频中的弹幕并图形化展示_第3张图片

用到的知识:
1.jieba库:用于中文分词的模块;
涉及的函数:jieba.lcut(s)–精确模式,返回一个列表类型,其中s是一个字符串;ps:具体用法参考:https://blog.csdn.net/qq_34337272/article/details/79554772
2.学到一个语句:其中text是一个字符串列表,得到的data_cut还是一个列表
python爬取B站视频中的弹幕并图形化展示_第4张图片
3.pandas库:数据分析工具;
用到了series(),能够保存任何类型的数据,以一维标记数据(相当于字典),区别在于,默认通过(0,n-1)作为key访问数据,也可以自己定义key,例如:obj=pd.Series([1,3,8,24,23],index=[‘a’,‘b’,‘c’,‘d’,‘e’]),通过a/b/c/d/e作为索引
4.词云这块没做细究,纯属搬运工

你可能感兴趣的:(python爬虫)