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

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

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()
  • 慢用
  • 晚安

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/57774.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用python写一个爬取周杰伦所有歌词的爬虫

写一个爬虫爬一下周董的所有歌词看看这么多年他为啥这么火 唱的都是什么主题的歌可以这么经久不衰,他凭啥被称为流行歌曲天王。废话不多说 直接上代码 今天比较晚了 之后再慢慢完善讲解。代码比较low因为是编自学边完成的,所以只是实现了基本的功能&…

buuoj 来首歌吧 writeup

题目(二十三): 【题型】Misc 【题目】来首歌吧 【来源】(buuoj)https://buuoj.cn/challenges#%E6%9D%A5%E9%A6%96%E6%AD%8C%E5%90%A7 【思路】通过音频的节奏得出摩斯密码,得到flag。 【具体步骤】 Step1&a…

chatgpt赋能python:Python打折代码:为你的电商网站提供更便捷的价格管理工具

Python打折代码:为你的电商网站提供更便捷的价格管理工具 在当前这个竞争激烈的市场,随时提供大量的优惠促销活动是吸引消费者注意力和提高销售额的必要手段之一。而电商网站在进行促销活动时,一个鲜为人知的秘密是——打折代码。打折代码作…

利用Python实现有道翻译的功能

这是上学期在Python课堂上老师讲的利用Python实现有道翻译的功能。 流程如下:网址:有道翻译 输入翻译名称,按F12对网页进行分析,通过查询到translate开头的连接中我们找到了翻译的数据参数 首先将参数以urlencode编码的方式传入到…

中英文自动翻译(有道翻译、彩云小译)

一.有道翻译 1)获取应用ID 和 应用密钥 https://ai.youdao.com/doc.s#guide 2)遵循接口参数接入 具体参考接口文档:https://ai.youdao.com/DOCSIRMA/html/%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E7%BF%BB%E8%AF%91/API%E6%96%87%E6%A1%A3/…

Unity 接入有道智云AI - 文本翻译

接入接口前首先需要申请应用ID和应用秘钥,登录有道智云AI开放平台,创建应用,获取应用ID和秘钥。 定义接口响应类数据结构,接口实际返回内容和官方文档有点出入,大概是文档未更新吧。 以下是官方文档给出的说明&#x…

【Python爬虫】有道翻译新旧API接口

🌈据说,看我文章时 关注、点赞、收藏 的 帅哥美女们 心情都会不自觉的好起来。 前言: 🧡作者简介:大家好我是 user_from_future ,意思是 “ 来自未来的用户 ” ,寓意着未来的自己一定很棒~ ✨个…

Translate插件的有道翻译

在plugins下载Translate插件 setting-> Tools->Translation 没有id和密钥就申请注册 登录后 创建应用 创建成功后输入id和密钥 点击鼠标右键即可使用 翻译效果 over

python利用有道词典翻译_Python利用有道词典接口制作即时翻译的工具

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 以下文章来源于Python 实用宝典,作者Python 实用宝典 前言 在编程时经常会遇到需要将中文词汇翻译成英文的情况。 比如变量名的定义、取一个合…

如何用python“优雅的”调用有道翻译

文章目录 前言分析分析url分析参数01分析参数02加密分析 模拟请求注意点请求代码执行结果 结语 前言 其实在以前就盯上有道翻译了的,但是由于时间问题一直没有研究(我的骚操作还在后面,记得关注),本文主要讲解如何用python调用有道翻译&…

Python 调用有道的翻译接口

最近为了熟悉一下 js 用有道翻译练了一下手,写一篇博客记录一下,也希望能对大家有所启迪,不过这些网站更新太快,可能大家尝试的时候会有所不同。 首先来看一下网页 post 过去的数据 大家不难发现,我们翻译的内容是…

使用python打造一个中英互译软件(基于有道翻译)

(本博客简洁明了,适合小白入门) 首先明确整体构架: 1.爬虫部分 2.界面部分 3.打包 涵盖的库: import urllib.request import urllib.parse import json import tkinter as tk import tkinter.messagebox 先确定爬…

ubuntu最好用的划词翻译词典:有道词典和GoldenDict

目录 1、安装有到词典 2、安装GoldenDict 3、GoldenDict的一些简单配置以及相关bug修改 用惯了Windows下的有道词典,其划词翻译功能用起来令人极其舒适~Ubuntu系统中也有有道词典以及一个类似的类似的软件GoldenDict,下面就分别介绍下这两…

有道翻译接口 破解

有道翻译 API 最近有些任务需要将中文翻译成英文,由于个人英文水平问题,每次都要打开好几个在线翻译网页,一句一句的丢进去,取最佳者为所用,甚是麻烦。 任务完成之后,就稍微研究了一下各个翻译接口&#…

对接有道翻译api中英翻译软件

中译英翻译软件对接了有道翻译API的翻译数据接口,通过数据接口,我们可以获得文本的批量翻译并对我们的译后文本进行内容自动编辑,通过调用有道翻译API数据接口,我们可以在我们的中译英翻译软件中更灵活地对我们的文本进行翻译处理…

百度、阿里、腾讯、有道各平台翻译API申请教程

文章目录 文章推荐 vscode插件 var-translate-en 中翻英转驼峰命名百度翻译申请腾讯翻译申请阿里翻译申请有道翻译申请 文章推荐 vscode插件 var-translate-en 中翻英转驼峰命名 快捷 一键转换为英文,并生成多种命名风格支持多平台翻译服务配置(谷歌、腾…

塔望 · ​食界​人物|红牛饮料背后的两个企业家

关注行业,更要关注行业发展背后的人。关注企业,更要关注企业的人格化身——“企业家”。人类在任何领域的创新和进步,都离不开企业家精神。优秀的企业家和企业家精神,是经济社会发展的重要推动力。 本期塔望【​食界​人物】将带…

正则表达式爬取红牛分公司数据

正则表达式还是很好玩的,爬取红牛官网分公司信息 import requests import re import pandas as pd response requests.get(url"http://www.redbull.com.cn/about/branch") company re.findall(<h2>(.*?)</h2>, response.text) add re.findall("…

列表表达式爬取红牛分公司数据

列表达式爬取红牛官网分公司信息 import requests import pandas as pd import bs4 response requests.get("http://www.redbull.com.cn/about/branch") main_page bs4.BeautifulSoup(response.text,"html.parser") company [i.text for i in main_pag…

红牛商标所有者泰国天丝集团将投资逾10亿元深化在华布局

全球红牛品牌及“红牛”商标的创始者和所有者 -- 泰国天丝集团宣布&#xff0c;未来三年将对其在华业务进行一系列投资&#xff0c;总额高达10.6亿人民币。具体包括深化在华合作伙伴战略关系、在中国设立新的代表处、组建国内团队、扩建新的生产基地以及推出集团旗下更多新产品…