Python爬取bilibili弹幕并生成词云
目标网站:
我这里以 TES vs SN 第四场决胜局为例:
私信小编01即可获取大量Python学习资料
探索经历:
首先我们要找到我们想要爬取的弹幕都发在哪:
我们先播放这个视频,随便记住一条弹幕,到审查元素里面搜索
哎,可以找到,然后我们再查看一下网页的源代码,没有搜索结果。。。。。。这说明bilibili的弹幕是动态加载的,是js请求的数据,可能是json,也可能是XML
通常我们都会通过翻页等操作让网页进行js请求,我们在“后台”盯着,看有没有多出来的文件,依次翻看一下里面的东西,看看有没有存放弹幕的文件,于是我继续播放视频,列表里也确实多了很多文件
但很可惜并没有找到我想要的存储弹幕的文件
我觉得播放视频还是没能请求到弹幕文件,于是我找到了第二种方法:(需要先登陆一下)
如图,切换不同的日期可以找到我们想要的存储弹幕文件,是个XML文件:
这样,我们就找到了目标url,复制url打开就是我们想要的弹幕页面
同样,我们也找到了规律这里有两个可以更换的参数:
(1)oid:这个就是视频的id(这个可不太好找)
(2)date:这个很明显是日期
真正目标:
传送门:https://api.bilibili.com/x/v1/dm/list.so?oid=249509876&date2020-10-26
思路与方法:
(1)这个XML文件也是标签语言,用BeautifulSoup可以轻松爬取,存储到本地txt文件中
(2)利用jieba库对txt内容进行分词,再合并成一个空格分割的字符串(用于Wordcloud参数)
(3)使用Wordcloud生成词云并保存到本地
部分细节讲解:
弹幕标点符号和空格的去除:
这个是老生常谈了,我之前有一篇博客也说过:
SimHei字体:https://www.uslogger.com/details/3
完整代码:
import requests
import re
import os
from bs4 import BeautifulSoup
import jieba
from wordcloud import WordCloud
def getHTMLText(url):
try:
kv = {"user-agent":"Mozilla/5.0"}
r = requests.get(url,headers = kv)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
print("getHTMLText失败!")
return ""
def fillbarrages(url,path_txt):
html = getHTMLText(url)
soup = BeautifulSoup(html,'html.parser')
with open(path_txt,'a',encoding='utf-8') as f:
for d in soup.find_all("d"):
# 使用正则表达式去除空格和标点,W 表示匹配非数字字母下划线
barrage = re.sub('W+','',d.text)
f.write(barrage)
f.close()
def getWordCloud(path_txt,path_jpg):
barrages_cut = jieba.lcut(open(path_txt,'r',encoding='utf-8').read()) #jieba分词
barrages = " ".join(barrages_cut) #回拼成字符串并用空格分割
wc= WordCloud(
font_path=r"F:FontsSimHei.ttf",
background_color="skyblue",
max_words=100,
width=1080,
height=720
)
wc.generate(barrages)
wc.to_file(path_jpg)
def main():
url = "https://api.bilibili.com/x/v1/dm/list.so?oid=249509876&date2020-10-26"
path_txt = "TESvsSN第四场.txt"
path_jpg = "TESvsSN第四场.jpg"
fillbarrages(url,path_txt)
print("fillbarrages成功")
getWordCloud(path_txt,path_jpg)
print("getwordcloud成功")
main()