写在前面:
此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出。欢迎各位前来交流。(部分材料来源网络,若有侵权,立即删除)

Python实现爬取网易云歌词|评论生成词云图

  • 免责声明
  • 情况说明
  • 效果展示
  • 代码讲解
    • cookie
    • 歌曲ID
    • 获取评论
    • 获取歌单中的歌曲和ID
    • 获取歌词
    • 分词
    • 生成词云图
    • 主菜单
    • 最后的主函数
  • 代码展示

免责声明

  • 代码仅用于学习,如被转载用于其他非法行为,自负法律责任
  • 代码全部都是原创,不允许转载,转载侵权

情况说明

  • python爬虫
  • 实现了对音乐歌词的爬取
  • 实现了对评论的爬取并生成词云图

效果展示

  • 菜单

  • 1:获取歌词


  • 2:歌曲评论词云图

代码讲解

cookie

参考博客

  • 这边使用的是Selenium模拟登录的方法
  • 函数如下:
def get_cookies():driver = webdriver.Firefox()#启动浏览器url = 'https://music.163.com/'driver.get(url)  # 发送请求# 打开之后,手动登录一次time.sleep(3)input('完成登陆后点击enter:')time.sleep(3)dictcookies = driver.get_cookies()  # 获取cookiescookie = [item["name"] + "=" + item["value"] for item in dictcookies]cookiestr = ';'.join(item for item in cookie)print(cookiestr)with open('wyycookie.txt', 'w') as f:f.write(cookiestr)print('cookies保存成功!')driver.close()
  • 这一行代码是将driver中获取到的cookie转换成requests能直接使用的格式
 cookie = [item["name"] + "=" + item["value"] for item in dictcookies]cookiestr = ';'.join(item for item in cookie)
  • 然后写入文件
with open('wyycookie.txt', 'w') as f:f.write(cookiestr)print('cookies保存成功!')driver.close()
  • 读取cookie
def read_cookie():try:print("[INFO]:正常尝试读取本地cookie")with open('wyycookie.txt', 'r', encoding='utf8') as f:Cookies = f.read()# print(Cookies)except:print("[ERROR]:读取失败,请手动登录并更新")get_cookies()read_cookie()return Cookies
  • 这边也有读取的机制和读取失败的机制

歌曲ID

  • 网易云每一首歌曲都是有唯一ID的
  • 并且网易云的URL中几乎都是用ID进行传参数的
  • 所以我们需要将歌名转换成ID
def get_ID(name):url = 'https://music.163.com/api/search/get/web?csrf_token=hlpretag=&hlposttag=&s={'+str(name)+'}&type=1&offset=0&total=true&limit=1'r = rs.get(url, headers=headers)r.encoding = 'utf-8'str_r=r.textdict_r = json.loads(str_r)#print(dict_r)#print(dict_r["result"]['songs'][0]['id'])ID=dict_r["result"]['songs'][0]['id']return ID

获取评论

  • 这边找到了一个接口
  • 也没使用解析库
  • 直接提取出来了
def get_comments(id):comments=[]url = 'http://music.163.com/api/v1/resource/comments/R_SO_4_{}?limit=100&offset='.format(id)r = rs.get(url, headers=headers)r.encoding = 'utf-8'str_r = r.textdict_r = json.loads(str_r)test=dict_r["comments"][1]#print(','.join(map(str, sorted(dict_r.keys()))))#print(test)for i in range(100):comment=dict_r["comments"][i]['content']comments.append(comment)#print(comment)# for i in comments:#     print(i)return comments

获取歌单中的歌曲和ID

  • 这个其实不属于本项目
  • 但是刚好做了
  • 就一起放出来了
def get_list(musiclistid):Info = []url = 'https://music.163.com/playlist?id={}'.format(musiclistid)rs = requests.session()r = rs.get(url, headers=headers)soup = BeautifulSoup(r.content, 'lxml')hide = soup.find('ul', {'class': 'f-hide'})a = hide.find_all('a')for every in a:data = []uid = re.search(r'id=(.*)', every['href'], re.M | re.I)uid = uid.group(1)data.append(uid)data.append(every.text)Info.append(data)# for i in Info:#     print(i[0])return Info
  • 输出的结果就是歌单里的所有的歌名和ID

获取歌词

  • 这边也是找到了一个接口
  • 然后提取出来
  • 并且解析
  • 最后保存为txt文本
def get_poem(name,id):url = 'https://music.163.com/api/song/lyric?id={}&lv=1&kv=1&tv=-1'.format(id)r = rs.get(url, headers=headers)r.encoding = 'utf-8'str_r = r.textdict_r = json.loads(str_r)print(dict_r['lrc']['lyric'])with open(name+'歌词.txt', 'w') as f:f.write(dict_r['lrc']['lyric'])print('歌词保存成功!')

分词

def cut_words(top_search):top_cut=[]for top in top_search:top_cut.extend(list(jieba.cut(top)))  #使用精确模式切割词汇return top_cut

生成词云图

  • 这个没什么好说的
  • 可以参考以前做的豆瓣评论词云图博客
def commment_pic(comment):all_words = cut_words(comment)stop = []words_cut = []for word in all_words:if word not in stop:words_cut.append(word)word_count = pd.Series(words_cut).value_counts()back_ground = imread("F:\\flower.jpg")wc = WordCloud(font_path="C:\\Windows\\Fonts\\simhei.ttf",  # 设置字体background_color="white",  # 设置词云背景颜色max_words=400,  # 词云允许最大词汇数mask=back_ground,  # 词云形状max_font_size=400,  # 最大字体大小random_state=90  # 配色方案的种数)wc1 = wc.fit_words(word_count)  # 生成词云plt.figure()plt.imshow(wc1)plt.axis("off")# plt.get_current_fig_manager().full_screen_toggle()plt.show()

主菜单

def main():#print_menu()while True:print_menu()# 获取用户输入try:num = int(input("[INFO]:请输入需要的操作:"))except ValueError:# except Exception:print("输入错误,请重新输入(1.2.3)")continueexcept IndexError:print("请输入一个有效值:(1.2.3)")continue# 根据用户的数据执行相应的功能if num == 1:name=input("[INFO]:请输入歌曲名称:")id=get_ID(name)print(id)get_poem(name,id)print("=" * 500)elif num == 2:name = input("[INFO]:请输入歌曲名称:")id = get_ID(name)comments=get_comments(id)commment_pic(comments)print("=" * 500)elif num == 3:name = input("[INFO]:请输入歌曲名称:")id = get_ID(name)save_music(name,id)print("=" * 500)elif num == 4:print("[END]:感谢您的使用,欢迎下次再见")print("=" * 500)breakelse:print("[ERROR]:输入错误")print("=" * 500)def print_menu():print ("="*500)print ("[INFO]:1. 获取指定音乐歌词")print ("[INFO]:2. 生成指定音乐评论词云图")print ("[INFO]:3. 下载歌曲")print ("[INFO]:4. 退出系统")print("=" * 500)

最后的主函数

if __name__ == "__main__":print("=" * 500)print("[INFO]:欢迎使用zack的网易云音乐系统")Cookies=read_cookie()headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36','Cookie': '{}'.format(Cookies)}main()

代码展示

from lxml import etree
import requests
import time
import json
from selenium import webdriver
from bs4 import BeautifulSoup
import re
import jieba
from wordcloud import WordCloud
import pandas as pd
from imageio import imread
import matplotlib.pyplot as pltdef read_cookie():try:print("[INFO]:正常尝试读取本地cookie")with open('wyycookie.txt', 'r', encoding='utf8') as f:Cookies = f.read()# print(Cookies)except:print("[ERROR]:读取失败,请手动登录并更新")get_cookies()read_cookie()return Cookiesdef get_cookies():driver = webdriver.Firefox()url = 'https://music.163.com/'driver.get(url)  # 发送请求# 打开之后,手动登录一次time.sleep(3)input('完成登陆后点击enter:')time.sleep(3)dictcookies = driver.get_cookies()  # 获取cookiescookie = [item["name"] + "=" + item["value"] for item in dictcookies]cookiestr = ';'.join(item for item in cookie)print(cookiestr)with open('wyycookie.txt', 'w') as f:f.write(cookiestr)print('cookies保存成功!')driver.close()rs = requests.session()def get_comments(id):comments=[]url = 'http://music.163.com/api/v1/resource/comments/R_SO_4_{}?limit=100&offset='.format(id)r = rs.get(url, headers=headers)r.encoding = 'utf-8'str_r = r.textdict_r = json.loads(str_r)test=dict_r["comments"][1]#print(','.join(map(str, sorted(dict_r.keys()))))#print(test)for i in range(100):comment=dict_r["comments"][i]['content']comments.append(comment)#print(comment)# for i in comments:#     print(i)return commentsdef get_ID(name):url = 'https://music.163.com/api/search/get/web?csrf_token=hlpretag=&hlposttag=&s={'+str(name)+'}&type=1&offset=0&total=true&limit=1'r = rs.get(url, headers=headers)r.encoding = 'utf-8'str_r=r.textdict_r = json.loads(str_r)#print(dict_r)#print(dict_r["result"]['songs'][0]['id'])ID=dict_r["result"]['songs'][0]['id']return IDdef get_list(musiclistid):Info = []url = 'https://music.163.com/playlist?id={}'.format(musiclistid)rs = requests.session()r = rs.get(url, headers=headers)soup = BeautifulSoup(r.content, 'lxml')hide = soup.find('ul', {'class': 'f-hide'})a = hide.find_all('a')for every in a:data = []uid = re.search(r'id=(.*)', every['href'], re.M | re.I)uid = uid.group(1)data.append(uid)data.append(every.text)Info.append(data)# for i in Info:#     print(i[0])return Infodef get_poem(name,id):url = 'https://music.163.com/api/song/lyric?id={}&lv=1&kv=1&tv=-1'.format(id)r = rs.get(url, headers=headers)r.encoding = 'utf-8'str_r = r.textdict_r = json.loads(str_r)print(dict_r['lrc']['lyric'])with open(name+'歌词.txt', 'w') as f:f.write(dict_r['lrc']['lyric'])print('歌词保存成功!')def cut_words(top_search):top_cut=[]for top in top_search:top_cut.extend(list(jieba.cut(top)))  #使用精确模式切割词汇return top_cutdef commment_pic(comment):all_words = cut_words(comment)stop = []words_cut = []for word in all_words:if word not in stop:words_cut.append(word)word_count = pd.Series(words_cut).value_counts()back_ground = imread("F:\\flower.jpg")wc = WordCloud(font_path="C:\\Windows\\Fonts\\simhei.ttf",  # 设置字体background_color="white",  # 设置词云背景颜色max_words=400,  # 词云允许最大词汇数mask=back_ground,  # 词云形状max_font_size=400,  # 最大字体大小random_state=90  # 配色方案的种数)wc1 = wc.fit_words(word_count)  # 生成词云plt.figure()plt.imshow(wc1)plt.axis("off")# plt.get_current_fig_manager().full_screen_toggle()plt.show()def main():#print_menu()while True:print_menu()# 获取用户输入try:num = int(input("[INFO]:请输入需要的操作:"))except ValueError:# except Exception:print("输入错误,请重新输入(1.2.3)")continueexcept IndexError:print("请输入一个有效值:(1.2.3)")continue# 根据用户的数据执行相应的功能if num == 1:name=input("[INFO]:请输入歌曲名称:")id=get_ID(name)print(id)get_poem(name,id)print("=" * 500)elif num == 2:name = input("[INFO]:请输入歌曲名称:")id = get_ID(name)comments=get_comments(id)commment_pic(comments)print("=" * 500)elif num == 4:print("[END]:感谢您的使用,欢迎下次再见")print("=" * 500)breakelse:print("[ERROR]:输入错误")print("=" * 500)def print_menu():print ("="*500)print ("[INFO]:1. 获取指定音乐歌词")print ("[INFO]:2. 生成指定音乐评论词云图")print ("[INFO]:4. 退出系统")print("=" * 500)if __name__ == "__main__":print("=" * 500)print("[INFO]:欢迎使用zack的网易云音乐系统")Cookies=read_cookie()headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36','Cookie': '{}'.format(Cookies)}main()
  • 慢用
  • 晚安

从入门到入土:Python实现爬取网易云歌词|评论生成词云图相关推荐

  1. python自动化爬取网易云歌词并制作词云图

    图片需要用透明图片:这就体现你的搜索能力了 import jieba # 中文分词库 import wordcloud # 词云图库 import imageio # 图像模块#读取图片 file = ...

  2. Python爬虫之js加密破解,抓取网易云音乐评论生成词云

    js破解历程 前言 技能点 界面概况 静态网页动态网页 页面解析 step1: 找参数step2:分析js函数step3:分析参数step4: 校验step5:转为python代码 编写爬虫 很多人学 ...

  3. 爬虫之js加密破解抓取网易云音乐评论生成词云

    js破解历程 前言 技能点 界面概况 静态网页 动态网页 页面解析 step1: 找参数 step2:分析js函数 step3:分析参数 step4: 校验 step5:转为python代码 编写爬虫 ...

  4. python爬取评论_python爬取网易云音乐评论

    本文实例为大家分享了python爬取网易云音乐评论的具体代码,供大家参考,具体内容如下 import requests import bs4 import json def get_hot_comme ...

  5. python爬取网易云音乐评论并进行可视化分析

    2019独角兽企业重金招聘Python工程师标准>>> 前言 今天为大家一个爬取网易云音乐评论的Python案例,并用Python的第三方库来进行可视化分析,生成图表样式,可以清晰地 ...

  6. python网易云_用python爬虫爬取网易云音乐

    标签: 使用python爬虫爬取网易云音乐 需要使用的模块 只需要requests模块和os模块即可 开始工作 先去网易云音乐网页版找一下你想要听的歌曲点击进去.按键盘F12打开网页调试工具,点击Ne ...

  7. python爬取网易云歌单_详解python selenium 爬取网易云音乐歌单名

    目标网站: 首先获取第一页的数据,这里关键要切换到iframe里 打印一下 获取剩下的页数,这里在点击下一页之前需要设置一个延迟,不然会报错. 结果: 一共37页,爬取完毕后关闭浏览器 完整代码: u ...

  8. python爬取网易云音乐热评_python爬取网易云音乐评论

    本文实例为大家分享了python爬取网易云音乐评论的具体代码,供大家参考,具体内容如下 import requests import bs4 import json def get_hot_comme ...

  9. python爬取网易云评论最多的歌_python爬取网易云音乐评论

    本文实例为大家分享了python爬取网易云音乐评论的具体代码,供大家参考,具体内容如下 import requests import bs4 import json def get_hot_comme ...

  10. Python爬虫—爬取网易云音乐【热歌榜】歌曲的精彩评论(写入txt文本文件或者MySQL数据库)

      最近在学Python爬虫,看了Blibili爬取网易云音乐评论的视频,视频中是将一首歌的评论存入json文件,我在此代码的基础上扩展了三点:     1.爬取热歌榜200首歌曲的精彩评论:     ...

最新文章

  1. 全局变量和局部变量的区别_值得收藏!8大技巧,带你了解菜鸟和高手的区别!...
  2. tsf php,TSF:腾讯推出的 PHP 协程方案
  3. SQLite 使用教程2 语法
  4. python数据建模数据集_Python中的数据集
  5. jQuery中eq与get的区别(整理)
  6. android gallery效果,Android RecyclerView封装的Gallery效果控件,android galleryview
  7. 20130830sqlplus使用及联机文档
  8. 化繁为简|华天软件参数化,将轴承设计变为数与数的组合
  9. IP模拟工具modify header
  10. DNN硬件加速器设计2 -- Survey of DNN Development Resouces and DNN Hardware(MIT)
  11. 邮件内容安全刻不容缓
  12. python中的utils模块_Python中的模块及扩展库
  13. MP3音频解码详细过程(二)
  14. 360前端校招2019笔试编程题
  15. 二叉平衡树的基本操作(完整代码)
  16. 多媒体图像切换与中值区分法
  17. 如果学好SQL有啥好?
  18. 天池数字生态创新大赛-遥感
  19. 【下载查询资料】资料链接
  20. 通用Mapper条件查询后并分页

热门文章

  1. 抽样调查之分层随机抽样
  2. 一文了解DataStore(Preferences)
  3. LIFELONG LEARNING WITH DYNAMICALLY EXPANDABLE NETWORKS论文阅读+代码解析
  4. 支教日记软件测试,教学实习每周工作计划精选 .doc
  5. 面试技巧:带走面试官的节奏
  6. Leetcode每日一题 面试题56 - I.数组中数字出现的次数
  7. 贝叶斯网络R语言学习笔记1
  8. ROS智能车定位导航仿真(原赛道自主导航,构建地图再导航)
  9. 项目小记录—拼音码demo
  10. 监听浏览器刷新事件,拦截浏览器返回,js监听移动端浏览器页面显示、隐藏