突然想到了這個題目,先開了題,看能不能一次搞定,#后記,花了兩天時間搞定的,一直想用自己的方法爬,但是效果都不好
首先去分析一下bilibili的網站請求,但是彈幕的異步傳輸的包抓不到(或者隱藏的好,或者是我技術水平有限),然后網上比較一致的看法是在JS里暴露了一個彈幕xml文件的id,然后用一個新的請求把xml文件下載下來,然后分析。
大體思路是:用avid去拿到cid,cid獲取到彈幕文件,解析彈幕文件,生成雲圖
搞了兩天,先把代碼扔上來
from selenium import webdriver from bs4 import BeautifulSoup import re from wordcloud import WordCloud from scipy.misc import imread import matplotlib.pyplot as plt driver=webdriver.PhantomJS() driver.get('http://www.bilibili.com/video/av15719999/') #用的是selenium和webdriver,試過用requests庫的get方法,不成功 soup = BeautifulSoup(driver.page_source,'lxml') #把返回的html解析出來 sc = soup.find('script',text=re.compile("EmbedPlayer*"))#找到有特定詞‘EmbedPlayer’的script標簽 sc1 =str(sc) #截取cid的值 a = sc1.find('cid='); b = sc1.find('&'); sc2=sc1[a+4:b] # print(sc2)
driver.get("http://comment.bilibili.com/"+sc2+".xml") #這個是重點,通過剛才拿到的cid去把彈幕的xml文件拿下來 soupxml = BeautifulSoup(driver.page_source,'lxml') ds =soupxml.find_all('d')#拿到所有的彈幕節點 cuttext ='' for d in ds: cuttext = cuttext+' '+str(d.text);#使用一個字符串把文件串起來 #print(cuttext)
#初始化詞雲 color_mask = imread("425176.jpg") # 讀取背景圖片 cloud = WordCloud( # 設置字體,不指定就會出現亂碼,這個文件是字體文件,可以去網上下載一個,然后寫上路徑 font_path="SourceHanSerif-Heavy.ttc", # 設置背景色 background_color='white', # 詞雲形狀,就是剛才讀取的背景圖片 mask=color_mask, # 允許最大詞匯,出os報錯的時候可能就是這個設置過大了 max_words=100, # 最大號字體,出os報錯的時候可能就是這個設置過大了 # max_font_size=40 ) word_cloud = cloud.generate_from_text(cuttext) # 產生詞雲 word_cloud.to_file("3.png") # 保存圖片 # 顯示詞雲圖片 plt.imshow(word_cloud) plt.axis('off') plt.show()
不嫌棄的話可以訪問我的個人主頁,已經把功能集成到上邊去了。在Funs功能列表中
http://1163949417-jack.55555.io/west/main/