20-python爬虫:bilibili弹幕爬取+词云生成

如果你懒得看下边的文字,我录了一个完整的教学视频在b站上。

我的B站教学:https://www.bilibili.com/video/av75377135?p=2

工作原理

b站是提供弹幕接口的,所以我们的整体操作进行如下:

  1. 到B站获取cid
  2. 将cid与网站固定格式进行链接
  3. 用python请求网页
  4. 进行简单的单词处理
  5. 生成词云

接下来我们就按照刚才说的顺序进行详细解释

操作顺序

1.到B站获取cid

首先点进一个视频网页,点击F12-network获取监测页面,然后一定要点击播放视频,我们就会在监测页面中看到一个叫heartbeat的XHR脚本,点开任意一个即可。

进入页面

点击之后我们需要看Headers,里边包括了我们想知道的信息。往下滚动就会发现cid,这个id是唯一的,也就是说下次抓取的时候还可以用这个id。
获取cid

2.将cid与网站固定格式进行链接

我们拿到cid之后就可以去检查一下是否可以获取弹幕了。获取的固定xml格式是:
https://comment.bilibili.com/视频的cid.xml

例如在这里我们的页面就是:

'https://comment.bilibili.com/94198756.xml'

我们把这个链接用网页的方式打开,就能看到如下内容:
弹幕内容

这样我们就确定可以爬取了。

3.用python请求网页

因为是开源的,我们也不需要设置代理agent什么的,直接获取就行

import requests
from bs4 import BeautifulSoup

url= 'https://comment.bilibili.com/94198756.xml'
request = requests.get(url)#获取页面
request.encoding='utf8'#因为是中文,我们需要进行转码,否则出来的都是unicode

通过之前的网页查看,我们发现弹幕的XML规律如下:

<d p="51.54300,5,25,15138834,1573385829,0,6fddce0f,24244993014628354">停车场反杀龙卷风</d>

都是d开头,所以我们只需要用beautifulsuop来选取所有的‘d’就可以

soup = BeautifulSoup(request.text, 'lxml') 
results = soup.find_all('d')#找出所有'd'
comments = [comment.text for comment in results]#因为出来的时候是bs4格式的,我们需要把他转化成list

这样一个完整的弹幕list就已经有了,这里要注意,b站弹幕提取上线是1000条,所以大于一千的就会随机选取1000调弹幕给你。

4.进行简单的单词处理

拿到之后的弹幕并不能直接满足我们进行单词分析,我们要进行一些简单的清理
(1)有一些英文我们需要统一大小写

comments = [x.upper() for x in comments]#统一大小写

(2)去掉弹幕中的空格
例:‘仙 人 指 路’ 和 ‘仙人指路’ 是没有区别的

comments_clean  = [comment.replace(' ','') for comment in comments]#去掉空格

(3)我们简单的看一下弹幕之后发现弹幕里边的’/test’是有很多,但是我们并不需要它,诸如此类:


set(comments_clean)#看一下都有啥类似的没用的词语

useless_words = ['//TEST',
 '/TESR',
 '/TEST',
 '/TEST/',
 '/TEXT',
 '/TEXTSUPREME',
 '/TSET',
 '/Y',
 '\\TEST']

comments_clean = [element for element in comments_clean if element not in useless_words]#去掉不想要的字符 

进行完上述处理之后,我们就可以进行词云的制作了。不过在制作之前,还是让我们简单的看一下词频。(不是最终的,因为一会要把句子里的词分开)

import pandas as pd
cipin = pd.DataFrame({'danmu':comments_clean})

cipin['danmu'].value_counts()

(4)分词
在这里我们把刚才得到的弹幕用jieba库进行分词

danmustr = ''.join(element for element in comments_clean)#把所有的弹幕都合并成一个字符串
import jieba
words = list(jieba.cut(danmustr))#分词

(5)进一步clean
分词之后,我们会发现里边有很多的符号或者是单字,这些是没有意义的,我们要去掉这一些。

fnl_words = [word for word in words if len(word)>1]#去掉单字

5.生成词云

至此我们可以通过词词频来生成词云了
首先我们要下载词云的包

pip install wordcloud

然后生成词云

import wordcloud
wc = wordcloud.WordCloud(width=1000, font_path='simfang.ttf',height=800)#设定词云画的大小字体,一定要设定字体,否则中文显示不出来
wc.generate(' '.join(fnl_words))

这样就生成了,我们现在来看一下

from matplotlib import pyplot as plt
plt.imshow(wc)

在这里插入图片描述

如果不满意样子的话是可以在wordcloud.WordCloud里边调整的,例如可以调整画布大小,随机字体颜色区间,画布背景等等。或者更傻的方式就是重新跑一下wc.generate(’ '.join(fnl_words))就可以出来新的图片了

最后保存一下我们做好的图片

wc.to_file(r"C:\Users\CCHANG\Desktop\danmu_pic.png")

顺带提一句,我们还可以拿一个图片作为蒙版按形状生成图片。

我们需要先上传一个图片,把它做成numpy.array的形式。
我们就自己画一个图吧,记住,上传的图片背景主题一定要对比鲜明
在这里插入图片描述

import cv2

img = cv2.imread(r'C:\Users\CCHANG\Desktop\circle.png', cv2.IMREAD_UNCHANGED) #直接读取成了数字格式
resized =  cv2.resize(img, (800, 800),interpolation = cv2.INTER_AREA)#我们把它重新设定一下大小

不过有的时候用cv2不是非常稳定,所以我们还有另一种方法

from PIL import Image
import numpy as np

img = Image.open(r'E:\录屏\course3\mask.jpg')
resized  = np.array(img)

然后我们调整wordcloud里边的一些设置,再生成一次


wc_1 = wordcloud.WordCloud(
    background_color='black',
    width=1000,
    height=800,
    mask=resized,
    font_path='simfang.ttf'
#    ,color_func = wordcloud.random_color_func()
)

wc_1.generate_from_text(' '.join(fnl_words))#绘制图片
plt.imshow(wc_1)
plt.axis('off')
plt.figure()
plt.show()  #显示图片

最后就变成了这样
在这里插入图片描述

记得保存哦~

wc_1.to_file(r'C:\Users\CCHANG\Desktop\danmu_pic_2.png') 

记得如果看不懂就去看我的B站教学:https://www.bilibili.com/video/av75377135?p=2

完整代码

import requests
from bs4 import BeautifulSoup
import pandas as pd
import jieba
import wordcloud
from matplotlib import pyplot as plt

url= 'https://comment.bilibili.com/94198756.xml'

request = requests.get(url)#获取页面
request.encoding='utf8'#因为是中文,我们需要进行转码,否则出来的都是unicode

soup = BeautifulSoup(request.text, 'lxml') 
results = soup.find_all('d')#找出所有'd'
comments = [comment.text for comment in results]#得到完整的list
comments = [x.upper() for x in comments]#统一大小写
comments_clean  = [comment.replace(' ','') for comment in comments]#去掉空格

set(comments_clean)#看一下都有啥类似的没用的词语

useless_words = ['//TEST',
 '/TESR',
 '/TEST',
 '/TEST/',
 '/TEXT',
 '/TEXTSUPREME',
 '/TSET',
 '/Y',
 '\\TEST']

comments_clean = [element for element in comments_clean if element not in useless_words]#去掉不想要的字符 
cipin = pd.DataFrame({'danmu':comments_clean})
cipin['danmu'].value_counts()#查看词频

danmustr = ''.join(element for element in comments_clean)#把所有的弹幕都合并成一个字符串
words = list(jieba.cut(danmustr))#分词
fnl_words = [word for word in words if len(word)>1]#去掉单字

wc = wordcloud.WordCloud(width=1000, font_path='simfang.ttf',height=800)#设定词云画的大小字体,一定要设定字体,否则中文显示不出来
wc.generate(' '.join(fnl_words))

plt.imshow(wc)#看图
wc.to_file(r"C:\Users\CCHANG\Desktop\danmu_pic.png")#保存

######################################################
#加蒙板的图片
import cv2

img = cv2.imread(r'C:\Users\CCHANG\Desktop\circle.png', cv2.IMREAD_UNCHANGED) #直接读取成了数字格式
resized =  cv2.resize(img, (800, 800),interpolation = cv2.INTER_AREA)#我们把它重新设定一下大小

#不过有的时候用cv2不是非常稳定,所以我们还有另一种方法
#from PIL import Image
#import numpy as np

#img = Image.open(r'E:\录屏\course3\mask.jpg')
#resized = np.array(img)

wc_1 = wordcloud.WordCloud(
    background_color='black',
    width=1000,
    height=800,
    mask=resized,
    font_path='simfang.ttf'
#    ,color_func = wordcloud.random_color_func()
)

wc_1.generate_from_text(' '.join(fnl_words))#绘制图片
plt.imshow(wc_1)
plt.axis('off')
plt.figure()
plt.show()  #显示图片
wc_1.to_file(r'C:\Users\CCHANG\Desktop\danmu_pic_2.png') 

章鱼哥的黑管:https://blog.csdn.net/johnchang0201/article/details/103004229

已标记关键词 清除标记
相关推荐
【为什么还需要学习C++?】 你是否接触很多语言,但从来没有了解过编程语言的本质? 你是否想成为一名资深开发人员,想开发别人做不了的高性能程序? 你是否经常想要窥探大型企业级开发工程的思路,但苦于没有基础只能望洋兴叹?   那么C++就是你个人能力提升,职业之路进阶的不二之选。 【课程特色】 1.课程共19大章节,239课时内容,涵盖数据结构、函数、类、指针、标准库全部知识体系。 2.带你从知识与思想的层面从0构建C++知识框架,分析大型项目实践思路,为你打下坚实的基础。 3.李宁老师结合4大国外顶级C++著作的精华为大家推出的《征服C++11》课程。 【学完后我将达到什么水平?】 1.对C++的各个知识能够熟练配置、开发、部署; 2.吊打一切关于C++的笔试面试题; 3.面向物联网的“嵌入式”和面向大型化的“分布式”开发,掌握职业钥匙,把握行业先机。 【面向人群】 1.希望一站式快速入门的C++初学者; 2.希望快速学习 C++、掌握编程要义、修炼内功的开发者; 3.有志于挑战更高级的开发项目,成为资深开发的工程师。 【课程设计】 本课程包含3大模块 基础篇 本篇主要讲解c++的基础概念,包含数据类型、运算符等基本语法,数组、指针、字符串等基本法,循环、函数、类等基本句法等。 进阶篇 本篇主要讲解编程中常用的一些技能,包含类的高级技术、类的继承、编译链接和命名空间等。 提升篇: 本篇可以帮助学员更加高效的进行c++开发,其中包含类型转换、文件操作、异常处理、代码重用等内容。
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页