python爬取bilibili弹幕_Python抓取BiliBili拦河坝并生成单词云,爬取,bilibili,弹幕

木秀于林,风亦惧之;虽为萤火,亦绽光芒。

Python爬取bilibili弹幕并生成词云

目标网站:

哔哩哔哩:

https://www.bilibili.com/

我这里以 TES vs SN 第四场决胜局为例:

探索经历:

首先我们要找到我们想要爬取的弹幕都发在哪:

我们先播放这个视频,随便记住一条弹幕,到审查元素里面搜索

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNDk2MTI3,size_16,color_FFFFFF,t_70#pic_center

哎,可以找到,然后我们再查看一下网页的源代码,没有搜索结果。。。。。。这说明bilibili的弹幕是动态加载的,是js请求的数据,可能是json,也可能是XML

通常我们都会通过翻页等操作让网页进行js请求,我们在“后台”盯着,看有没有多出来的文件,依次翻看一下里面的东西,看看有没有存放弹幕的文件,于是我继续播放视频,列表里也确实多了很多文件

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNDk2MTI3,size_16,color_FFFFFF,t_70#pic_center

但很可惜并没有找到我想要的存储弹幕的文件

我觉得播放视频还是没能请求到弹幕文件,于是我找到了第二种方法:(需要先登陆一下)

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNDk2MTI3,size_16,color_FFFFFF,t_70#pic_center

如图,切换不同的日期可以找到我们想要的存储弹幕文件,是个XML文件:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNDk2MTI3,size_16,color_FFFFFF,t_70#pic_center

这样,我们就找到了目标url,复制url打开就是我们想要的弹幕页面

20201027160509828.png#pic_center

同样,我们也找到了规律这里有两个可以更换的参数:

(1)oid:这个就是视频的id(这个可不太好找)

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNDk2MTI3,size_16,color_FFFFFF,t_70#pic_center

(2)date:这个很明显是日期

真正目标:

思路与方法:

(1)这个XML文件也是标签语言,用BeautifulSoup可以轻松爬取,存储到本地txt文件中

(2)利用jieba库对txt内容进行分词,再合并成一个空格分割的字符串(用于Wordcloud参数)

(3)使用Wordcloud生成词云并保存到本地

部分细节讲解:

弹幕标点符号和空格的去除:

使用正则表达式可以轻松搞定:(如果有下划线可以用replace()替换成空)

barrage = re.sub('\W+','',d.text)#\W 表示匹配非数字字母下划线

jieba的cut()和lcut()方法的区别:

jieba.cut():生成的是一个生成器,generator,可以通过for循环来取里面的每一个元素

jieba.lcut():直接生成一个list

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:\Fonts\SimHei.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()

词云展示:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNDk2MTI3,size_16,color_FFFFFF,t_70#pic_center

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值