Selenium爬取36万条数据告诉你:网易云音乐热评究竟有什么规律?
优采云 发布时间: 2022-06-28 18:00Selenium爬取36万条数据告诉你:网易云音乐热评究竟有什么规律?
文 |沐沐
来源:GOGO数据「ID: mu_science」
嗨!朋友,我是沐沐
欢迎你来到学习python的宝藏基地~~
长按下方二维码可以添加我为好友哦
网易云音乐火不火我不知道,可是评论很火,之前也见过不少的帖子抓取网易云音乐评论,今天咱们也来试试
这篇文章主要介绍了python selenium爬取网易云音乐热评,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
Selenium安装
在此之前我们首先要准备好selenium的配置和安装,如下:
selenium可以直接可以用pip安装。
pip install selenium
chromedriver安装
要注意的是chromedriver的版本一定要与Chrome的版本一致,不然就不起作用。
有两个下载地址分别如下:
1、
2、
当然,你首先需要查看你的Chrome版本,在浏览器中输入
chrome://version即可查看浏览器版本信息
目标确定
我们可以选择任意自己喜欢的音乐来采集评论,我这里就以 岁月神偷 为例来采集36万+条评论然后来做可视化分析
导入所需模块
以下为我们此次爬取网易云热评所需的python库
import random<br />from selenium import webdriver<br />from icecream import ic<br />import time<br />import csv
目标网址
我们要获取的网易云音乐链接如下,我们要获取的内容有该音乐下的评论作者、评论时间和评论内容
https://music.163.com/#/song?id=28285910
打开浏览器并且加载网页内容
执行如下代码之后会自动跳转到我们所要爬取的网易云音乐页面
网易云音乐相比于其他网站它的内容都嵌套在iframe中,相当于多了一个门。所以我们想要获取到内容必须先要进入到iframe中
# 驱动加载<br />driver = webdriver.Chrome()<br /><br /># 打开网站<br />driver.get('https://music.163.com/#/song?id=28285910')<br /><br /># 等待网页加载完成,不是死等;加载完成即可<br />driver.implicitly_wait(10)<br /><br /># 定位iframe<br />iframe = driver.find_element_by_css_selector('.g-iframe')<br /><br /># 先进入到iframe<br />driver.switch_to.frame(iframe)<br />
我们要获取评论内容必须要拉到网页最底部才可以完全加载出div标签,这段逻辑我们交由js来实现
# 下拉页面到最底部<br />js = 'document.documentElement.scrollTop = document.documentElement.scrollHeight'<br />driver.execute_script(js)
获取网页信息
如上分析,所有评论信息都存在网页对应的div标签之中
所以接下来我们的思路就很清晰,已经进入到了iframe中。接下俩就可以所有的div标签再去提取内部我们所需要的信息
# 获取所有评论列表 div标签<br />divs = driver.find_elements_by_css_selector('.itm')<br />print(len(divs))<br /><br />'''<br />35<br />'''
第一页是15条热评+20条评论已经成功获取到,下一步提取我们所需要的评论内容
提取网页信息
接下来我们就在div标签中提取我们所需要的信息
咱们再提取的时候如果你会一点点js的话就可以使用id(#),class(.)的方法,
如果你不懂的话直接右键copy xpat或者selector都是可以实现的
for div in divs:<br /> user_name = div.find_element_by_css_selector('.cnt.f-brk a').text<br /> hot_cmts = div.find_element_by_css_selector('.cnt.f-brk').text.split(':')[1]<br /> cmts_time = div.find_element_by_css_selector('.time.s-fc4').text<br /><br /> ic(user_name, hot_cmts, cmts_time) <br /> <br />'''<br />ic| user_name: '什么事都让我分心'<br /> hot_cmts: '上个月你结婚了,新娘和你很般配,嗯。你从当年的小男生长成了大男孩。亲她的时候,我突然想起高二那个中午,你偷亲我,你不知道的是,其实当时我没有睡着。现在我也有了女朋友,准备明年结婚了,祝彼此幸福。'<br /> cmts_time: '2016年4月13日'<br />ic| user_name: '吴繁繁'<br /> hot_cmts: '枕在奶奶腿上听这首歌,奶奶七十多,像个好奇宝宝一样用手指小心地划着我的手机屏幕,看看歌词看看封面,把手机凑近耳朵听。时间是让人猝不及防的东西。'<br /> cmts_time: '2015年7月12日'<br />ic| user_name: 'jjjkkklllmmm'<br /> hot_cmts: '刚进大学寝室的时候,发现床板上有人用记号笔画了一张请假条,请假原因是毕业,离校时间是6.20,返校时间是永不。 其实老师唯一没骗我们的一句话就是'<br /> cmts_time: '2016年5月13日'<br />ic| user_name: '南说哦'<br /> hot_cmts: '大家都说我的性子很慢,其实我也可以很快 比如,后面有狗追我 或者,你在前面等我'<br /> cmts_time: '2017年5月21日'<br />ic| user_name: '_时光慢点_VI'<br /> hot_cmts: '听歌的时候,旋律永远是第一感觉,然后才是歌词,歌词过后才是细节。<br /> 就像读小说,一开始只对剧情感兴趣,慢慢你开始琢磨小说中的人物,最后才发掘小说的内涵。'<br /> cmts_time: '2015年2月9日'<br />ic| user_name: '刘家鑫很蠢'<br /> hot_cmts: ('逛留言板上看到的一句话 "我对你这么好 你却总这样不冷不热的 可我毫无办法 谁叫一开始主动的人是我 偶尔也会想想 当我终于消失在追逐你的长途里 '<br /> '某个夜里你的手机微微一震 你会不会恍然地以为 还是我给你的温柔"一个恍惚瞬间戳到泪点。')<br /> cmts_time: '2016年4月26日'<br />'''
数据保存
数据成功提取接下来我们将数据保存在csv中便于后续可视化展示
f = open('suiyue.csv', mode='a', encoding='utf-8-sig', newline='')<br />csv_writer = csv.DictWriter(f, fieldnames=[<br /> '用户名称',<br /> '评论时间',<br /> '评论内容'<br />])<br /><br />dit = {<br /> '用户名称': user_name,<br /> '评论时间': cmts_time,<br /> '评论内容': hot_cmts<br /> }<br /> csv_writer.writerow(dit)
多页获取
我们定个小目标,先获取300页数据
for page in range(1, 300+1):<br /> print(f'-------------正在抓取第{page}页-------------')<br /> time.sleep(random.random() * 3) # 延时防止被反爬<br /> spider_page()<br /> # 点击翻页<br /> driver.find_element_by_css_selector('.znxt').click()
总共获取了3000条测试数据,如果你有时间和兴趣可以获取更多哈
数据处理
接下来就是对数据去重和去空处理了,然后随机抽取五条数据展示如下:
# 读取数据<br />rcv_data = pd.read_csv('./岁月神偷.csv', encoding='gbk')<br /><br /># 删除重复记录<br />rcv_data = rcv_data.drop_duplicates()<br /># 删除缺失值<br />rcv_data = rcv_data.dropna()<br /><br /># 抽样展示5条数据<br />print(rcv_data.sample(5))<br /><br />'''<br /> 用户名称 评论时间 评论内容<br />153 清风不识字何故乱翻书_2027 11月25日 22:21 时间是让人猝不及防的东西,我的青春,随着这首歌结束了。。。<br />1796 小花不快乐 9月21日 22:34 对不起 是对我自己说的<br />610 烟非烟雨亦雨 11月9日 04:23 [多多比耶]<br />1817 气氕氘氚氙 9月21日 11:02 3Q<br />1048 颜颜柒柒柒 10月21日 00:38 还好嘛,现在是21年10月21日了<br />'''
词频展示
文章评论出现频率最高的前十个词分别如下:
# 词频设置<br />all_words = [word for word in result.split(' ') if len(word) > 1 and word not in stop_words]<br />wordcount = Counter(all_words).most_common(10)<br /><br />'''<br />('我们', '时间', '一个', '喜欢', '现在', '没有', '真的', '自己', '一起', '知道')<br />(187, 168, 163, 156, 150, 142, 130, 115, 104, 95)<br />'''
接下来我们使用气泡图和饼图来直观的展示如下:
词云展示
我们使用结巴分词
最后使用stylecloud绘制漂亮的词云图展示
gen_stylecloud(text=result,<br /> icon_name='fas fa-comment',<br /> font_path='msyh.ttc',<br /> background_color='white',<br /> output_name=pic,<br /> custom_stopwords=stop_words<br /> )<br /> print('词云图绘制成功!')
情感分析