捣鼓一下爬虫,刚好这两天《姜子牙》的预告片挺火,就看看他的弹幕吧。
需求很简单:1.爬取哔哩哔哩视频网站的弹幕 2.制作词云图
在网上了解到哔哩哔哩的弹幕是放在cid对应的xml文件里面,首先找到这个cid,直接把他放在url里面请求获取到弹幕内容。
import requests
from bs4 import BeautifulSoup
import bs4
import re
#获取弹幕数据:在视频播放网页打开deverloper console,打开
#Network栏,找到https://api.bilibili.com/x/player/videoshot?aid=79004812&cid=135199764&jsonp=jsonp
#中的cid,请求cid对应的xml文件就是弹幕内容
r = requests.get('http://comment.bilibili.com/135199764.xml')
print(r.status_code)
#转换编码
r.encoding = 'utf-8'
r.text
返回内容:
然后对返回的内容进行提取,常用的解析方法有:这BeautifulSoup库,正则表达式,XPath。这里用BeautifulSoup库来解析。
#xml文件解析,
bs = BeautifulSoup(r.text)
print(bs.prettify()) #prettify()格式化换行标签的函数
datalist = '' #将弹幕拼成一个字符串
clist = bs.d.parent.contents
for child in clist:
cstr = child.string
if child.name == 'd':
datalist += cstr
然后进一步用正则表达式去除字符串中的特殊字符,标点符号等。
#去掉标点符号和特殊字符
pattern = re.compile(u'\t|\n|\.|-|:|;|\)|\(|\?|!|,|。|?|·|……|"') # 定义正则表达式匹配模式
string_data = re.sub(pattern, '', datalist) # 将符合模式的字符去除
string_data
最后结果:
词频统计和画词云图:先用jieba库进行分词,然后使用词频统计库collections来统计词频,输出前10看看效果,通常在统计词频的过程中,我们会对一些语气词等做一些优化,排除一些语气词和不恰当的词。这里输出词云时可以自定义背景图片,词云里有中文需要将字体设置为支持中文的字体,不然会显示乱码。
import jieba # 结巴分词
import numpy as np
import wordcloud # 词云展示库
import collections # 词频统计库
from PIL import Image # 图像处理库
import matplotlib.pyplot as plt # 图像展示库
#分词
cutlist = jieba.cut(string_data,cut_all=False)#精确分词
objlist = []
removelist = [u'的', u',',u'和', u'是', u'随着', u'对于', u'对',u'等',u'能',u'都',u'。',u' ',u'、',u'中',u'在',u'了',
u'通常',u'如果',u'我们',u'需要',u'我', u'啊',u'这', u'吧', u'你',u'看', u'啊啊啊', u'吗', u'可以'] # 自定义去除词库,去除口语等
for word in cutlist:
if word not in removelist:
objlist.append(word)
#统计词频
word_count = collections.Counter(objlist)
word_count_top10 = word_count.most_common(10)
print(word_count_top10)#输出检查
#画词云图
mask = np.array(Image.open('images/wordcloud.jpg')) # 定义词频背景
wc = wordcloud.WordCloud(
mask=mask, # 设置背景图
max_words=200, # 最多显示词数
font_path='C:/Windows/Fonts/simhei.ttf', # 设置字体格式
max_font_size=100 # 字体最大值
)
wc.generate_from_frequencies(word_count) # 从字典生成词云
image_colors = wordcloud.ImageColorGenerator(mask) # 从背景图建立颜色方案
wc.recolor(color_func=image_colors) # 将词云颜色设置为背景图方案
plt.imshow(wc) # 显示词云
plt.axis('off') # 关闭坐标轴
plt.show() # 显示图像
输出词云图