python用selenium爬取b站评论并制作词云图
前言
b站视频下的评论是下拉加载的。要想爬取所有评论,要么找到加载评论的链接寻找其规律,要么下拉到低等待页面评论全部加载。我小白一个,找不出规律,用下拉这种笨办法。
要是评论太多,下拉要好久,于是上网发现有selenium可以模拟浏览器的各种行为。这个不仅要导入模块,还要下载浏览器驱动,要配置好一会儿。
制作词云图还要停用词,网上可以下载,但还是要根据需求自己加些词。
提示:以下是本篇文章正文内容,下面案例可供参考
一、爬取b站评论
1.selenium配置
附上参考链接。如何配置selenium
2.代码
附上参考链接。用selenium爬取b站评论
上面的代码下拉只有一两次,拉不到低。我改进了一下,可以自己定下拉几次。
代码如下:
from selenium import webdriver
from time import sleep
import sys
l1=[]
av=input("请输入av号:")
from selenium.common.exceptions import NoSuchElementException #防止错误
def pa(): #定义函数,进行爬取
list = driver.find_elements_by_css_selector(
'#comment > div > div.comment > div.bb-comment > div.comment-list > div > div.con > p')
for i in list:
l1.append(i.text)
def la(a):#定义下拉函数
for i in range (a):
driver.execute_script('window.scrollBy(0,1000)')
sleep(0.25)
return
url = 'https://www.bilibili.com/video/'+av
edge_path = "D:\Edge驱动\msedgedriver.exe" #驱动的路径
driver = webdriver.Edge(executable_path=edge_path)
driver.get(url)
sleep(7)
driver.execute_script('window.scrollBy(0,document.body.scrollHeight)')
sleep(1.5)#页面滚动到底部
driver.execute_script('window.scrollBy(0,1000)')
sleep(1.5)
#等待网络
la(300)#下拉的次数,定太少爬不全,定太多爬太久,自己多试几次
sleep(7)
pa()
while (1):
try:
c =driver.find_element_by_css_selector("#comment > div > div.comment > div.bb-comment > div.bottom-page.paging-box-big > a.next")
#print(c)
c.click()#模拟点击下一页,当没有下一页的时候就会进行下面一个操作
sleep(5)
pa()
sleep(0.5)
except NoSuchElementException as e:
print("没")
break
for i in l1:
print(i)
f=open('神兵小将.txt','w',encoding='utf-8')#创建文本文件
f.writelines(l1)#保存到文本文件中
这个只能爬取视频下的评论,不能爬取评论的评论。
二、制作词云图
1.下载停用词
我下载了一个停用词,又根据制作词云图的结果进行了一些添加。提取码是ybdw
2.代码
from wordcloud import WordCloud#导入词云模块
import PIL .Image as image#导入图片模块
import numpy as np#导入矩阵计算模块
import jieba#导入分词模块
import re#导入正则表达模块
def trans_CN(text):#定义分词函数,将连续的文本分为词组
word_list = jieba.cut(text)#将文本切开
#print(word_list)
result = " ".join(word_list)#词组间插入空格
result = result.replace("小破 站","小破站")#将划错的词连回去
result = result.replace("憨 憨","憨憨")#将划错的词连回去
result = result.replace("b 站","b站")#将划错的词连回去
result = result.replace("爷 青回","爷青回")#将划错的词连回去
result = result.replace("虎父无犬 子","虎父无犬子")#将划错的词连回去
#print(result)
single = re.compile(r'( . )',re.S)#定义正则表达式,将单个字挑出
Single = re.findall(single,result)#将单个字挑出,放入Single列表
for item in Single:#遍历单个字列表
result = result.replace(str(item)," ")#把每个字替换为空格
pass
return result#将结果作为函数返回值
with open("C:\\Users\\Ophiuchus\\source\\repos\\Python爬虫学习项目\\PythonApplication2\\神兵小将评论.txt",encoding='utf-8') as fp:#根据文件路径打开源数据
text = fp.read()#读取文本内容到text
text = trans_CN(text)#执行分词函数,并将返回值赋予text
mask = np.array(image.open("C:\\Users\\Ophiuchus\\Pictures\\Saved Pictures\\神兵小将.png"))#打开词云图的形状图片,并定义为掩膜
wordcloud = WordCloud(
max_words=400,#定义词云图显示的最大词量,默认为200
mask=mask,#确定掩膜
min_font_size=1,#确定最小词大小
max_font_size=50,#确定最大词大小
scale=5, #确定清晰度,按比列放大,数值越大,词云越清晰
#background_color='white',设定背景颜色
background_color=None, mode="RGBA",#将背景颜色设定为透明
stopwords = [line.strip() for line in open('C:\\Users\\Ophiuchus\\Desktop\\stopword.txt', 'r', encoding="gb18030").readlines()],#导入停用词
font_path = "C:\\Windows\\Fonts\\msyh.ttc"#确定字体
).generate(text)#词云图的各项设置
image_produce = wordcloud.to_image()#制作词云图
image_produce.save("filename.png")#保存名称与路径
image_produce.show()#展示词云图
3.注意事项
- jieba划词并不准确,比如会把“小破站”划成“小破”和“站”两个词,因此需要把这些词接回去。
- 尽管有停用词屏蔽了很多无效词,但还是有许多单个字的词在词云图,意义并不明确。因此进行了对单个字挑出剔除的工作。
- 为了让词云图显得更紧密,可以把最大词的大小与最小词的大小差值设大些。字太小了会模糊,可以通过scale调整清晰度。
- 记得背景颜色设置成透明,这样更方便后期使用。也可以改成白色。
三、制作成品
1.初期成品
这个看不太清词云图形状,可以在底下垫一层原图,通过ppt在中间加一层半透明的白色蒙版。透明度10%到20%就行了,太透明了影响看词的效果。
2.成品
哇咔咔咔,开心。