搗鼓一下爬蟲只洒,剛好這兩天《姜子牙》的預(yù)告片挺火祝钢,就看看他的彈幕吧窖杀。
需求很簡(jiǎn)單:1.爬取嗶哩嗶哩視頻網(wǎng)站的彈幕 2.制作詞云圖
在網(wǎng)上了解到嗶哩嗶哩的彈幕是放在cid對(duì)應(yīng)的xml文件里面角骤,首先找到這個(gè)cid,直接把他放在url里面請(qǐng)求獲取到彈幕內(nèi)容养葵。
import requests
from bs4 import BeautifulSoup
import bs4
import re
#獲取彈幕數(shù)據(jù):在視頻播放網(wǎng)頁打開deverloper console征堪,打開
#Network欄,找到https://api.bilibili.com/x/player/videoshot?aid=79004812&cid=135199764&jsonp=jsonp
#中的cid关拒,請(qǐng)求cid對(duì)應(yīng)的xml文件就是彈幕內(nèi)容
r = requests.get('http://comment.bilibili.com/135199764.xml')
print(r.status_code)
#轉(zhuǎn)換編碼
r.encoding = 'utf-8'
r.text
返回內(nèi)容:
然后對(duì)返回的內(nèi)容進(jìn)行提取佃蚜,常用的解析方法有:這BeautifulSoup庫庸娱,正則表達(dá)式,XPath爽锥。這里用BeautifulSoup庫來解析涌韩。
#xml文件解析,
bs = BeautifulSoup(r.text)
print(bs.prettify()) #prettify()格式化換行標(biāo)簽的函數(shù)
datalist = '' #將彈幕拼成一個(gè)字符串
clist = bs.d.parent.contents
for child in clist:
? ? cstr = child.string
? ? if child.name == 'd':
? ? ? ? datalist += cstr
然后進(jìn)一步用正則表達(dá)式去除字符串中的特殊字符氯夷,標(biāo)點(diǎn)符號(hào)等臣樱。
#去掉標(biāo)點(diǎn)符號(hào)和特殊字符
pattern = re.compile(u'\t|\n|\.|-|:|;|\)|\(|\?|!|腮考,|雇毫。|?|·|……|"') # 定義正則表達(dá)式匹配模式
string_data = re.sub(pattern, '', datalist) # 將符合模式的字符去除
string_data
最后結(jié)果:
詞頻統(tǒng)計(jì)和畫詞云圖:先用jieba庫進(jìn)行分詞踩蔚,然后使用詞頻統(tǒng)計(jì)庫collections來統(tǒng)計(jì)詞頻棚放,輸出前10看看效果,通常在統(tǒng)計(jì)詞頻的過程中馅闽,我們會(huì)對(duì)一些語氣詞等做一些優(yōu)化飘蚯,排除一些語氣詞和不恰當(dāng)?shù)脑~。這里輸出詞云時(shí)可以自定義背景圖片福也,詞云里有中文需要將字體設(shè)置為支持中文的字體局骤,不然會(huì)顯示亂碼。
import jieba # 結(jié)巴分詞
import numpy as np
import wordcloud # 詞云展示庫
import collections # 詞頻統(tǒng)計(jì)庫
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'對(duì)于', u'對(duì)',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)
#統(tǒng)計(jì)詞頻
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, # 設(shè)置背景圖
? ? max_words=200, # 最多顯示詞數(shù)
? ? font_path='C:/Windows/Fonts/simhei.ttf', # 設(shè)置字體格式
? ? max_font_size=100 # 字體最大值
)
wc.generate_from_frequencies(word_count) # 從字典生成詞云
image_colors = wordcloud.ImageColorGenerator(mask) # 從背景圖建立顏色方案
wc.recolor(color_func=image_colors) # 將詞云顏色設(shè)置為背景圖方案
plt.imshow(wc) # 顯示詞云
plt.axis('off') # 關(guān)閉坐標(biāo)軸
plt.show() # 顯示圖像
輸出詞云圖