输入av号爬取b站弹幕生成词云
本帖最后由 森岛帆高 于 2020-2-13 15:55 编辑import re
import wordcloud
from PIL import Image
import numpy
import requests
import jieba
from lxml import etree
import sys
import threading
# 生成词云图 text传入的文本,name保存文件的名字
def getPic(text, name):
# 使用numpy.array生成mask,可以让文字显示在有颜色的地方(要传入)
mask = numpy.array(Image.open("img/timg.jpg"))
# wordcloud.ImageColorGenerator(mask)可以让文字和图片的颜色保持一致(要传入)
color_fun = wordcloud.ImageColorGenerator(mask)
# 创建WordCould对象
wc = wordcloud.WordCloud(font_path="ttf/SIMYOU.TTF", background_color='white', mask=mask, color_func=color_fun,
max_words=160, min_font_size=5, )
# 向对象传入文本
wc.generate(text=text)
# 保存图片
wc.to_file('词云图/%s弹幕词云.png' % name)
# 根据av号获取html,返回main网页文本和main视频标题
def getHtml(avnum):
main = []
headers = {
'User-Agent': 'Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14'
}
url = "https://www.bilibili.com/video/av%s" % avnum
root = requests.get(url, headers=headers)
html = root.content.decode('utf-8')
text = root.text
e = etree.HTML(html).xpath('//*[@id="viewbox_report"]/h1/span/text()')
try:
# 这里获取的是etree的啥result对象,要编码再解码
e = e.encode('utf-8').decode('utf-8')
# av号不正确时退出程序
except IndexError as error:
print("你找的视频不存在哦!")
print("错误信息:" + str(error))
sys.exit()
main.append(text)
main.append(e)
return main
# http://comment.bilibili.com/->cid-<.xml 根据cid获取视频弹幕信息
# 根据正则表达式获取cid号并返回
def getCid(yy):
rer = re.compile(r'"cid":\d+')
a = re.search(pattern=rer, string=yy)
txt = a.group()
t = txt.split(':')
return t
# 获取弹幕(传入cid号)
def getDm(yy):
url = 'http://comment.bilibili.com/%s.xml' % getCid(yy)
headers = {
'User-Agent': 'Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14'
}
html = requests.get(url, headers=headers).content
xml = etree.XML(html)
ds = xml.xpath("//d/text()")
text = ''
# 获取弹幕文字合成一个字符串
for d in ds:
text += d.encode().decode('utf-8')
# 使用jieba.lcut切割词语再用空格分隔
text = ' '.join(jieba.lcut(text))
return text
# 打开图片
def imgopen():
img = Image.open('词云图/%s弹幕词云.png' % ma)
img.show()
if __name__ == "__main__":
av = input('请输入av号:')
# ma:返回的网页内容,ma:视频标题
ma = getHtml(av)
getPic(getDm(yy=ma), ma)
threading.Thread(target=imgopen).start()
print('视频名称:%s' % ma)
print('词云已生成...')
代码素材链接:https://www.lanzouj.com/i9bc8mh 问一个不该问的,什么是AV号,我顺着标题摸进来的,真心发问
这个效果挺好看
luanshils 发表于 2020-2-13 12:55
问一个不该问的,什么是AV号,我顺着标题摸进来的,真心发问
这个效果挺好看
AV号是 B站作品的代号如 AV3514841(瞎打的) 你就可以找到这个作品 这个有点6 虽然没有看懂是些什么,但是还是觉得很厉害 本帖最后由 森岛帆高 于 2020-2-13 13:11 编辑
luanshils 发表于 2020-2-13 12:55
问一个不该问的,什么是AV号,我顺着标题摸进来的,真心发问
这个效果挺好看
这个![](https://s2.ax1x.com/2020/02/13/1qsS8f.th.jpg) 这波操作还是挺个性的,感谢楼主分享学习了
luanshils 发表于 2020-2-13 12:55
问一个不该问的,什么是AV号,我顺着标题摸进来的,真心发问
这个效果挺好看
相当于每个视频有一个id值,作为唯一标识符 不明觉厉