从起点到土壤用 Python 实现抓取网易云歌词|评论生成词云图 - 代码展示
最编程
2024-05-24 09:54:54
...
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 plt
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
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() # 获取cookies
cookie = [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.text
dict_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
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.text
dict_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_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
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.text
dict_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)")
continue
except 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)
break
else:
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()
- 慢用
- 晚安
推荐阅读
-
利用 Spring Boot 与 Spring Security + JWT + MySQL 实现基于令牌的身份验证
-
限制特定 IP 地址访问页面的 PHP 代码示例
-
Python 保留数据 删除 Excel 单元格 函数和公式
-
K8S:开源容器编排平台,实现高效稳定的容器化应用管理
-
局域网一对一视频聊天(含源代码)
-
Linux 云计算 | [第四阶段] NOSQL-DAY3
-
微服务 - 流程染色 - 3. 具体代码介绍
-
CMU 10423 生成式人工智能:LEC10(新鲜出炉、提示工程、情境学习)-1 概述
-
60 天持仓规则:畸变策略如何实现市场盈利
-
FileLink:跨网络文件传输体验,随时随地实现安全高效连接