python歌词统计单词词频_Python爬虫网易云歌词及词频统计
采用詞云對鄧紫棋的熱門前50歌曲進行可視化展示。
本次可視化步驟需要掌握的內容有:了解爬蟲的原理
掌握xpath的用法
掌握詞云工具wordcloud的使用
了解分詞根據jieba的使用
首先,需要找到網易云音樂的音樂人的網頁鏈接,再根據熱門歌曲獲取每一首熱門歌曲的歌詞。獲取每首歌的歌曲ID,歌曲名稱
獲取每首歌的歌詞,匯總成一個歌詞文本
創建詞云模型,進行展示。
下面是一些進行項目時候的一些小錯誤,直接用pycharm的debug功能仔細查看哪一個步驟出錯了,需要細心去寫代碼,爬蟲很容易出現一些非語法方面的錯誤。
獲取指定歌手頁面的xpath的時候,少打了一個@ ,導致沒有獲取到相應歌曲的網頁鏈接的ID。
獲取網易云音樂歌詞的時候,打錯了關鍵字,將歌詞 'lrc'錯打成了 'lyc',導致沒有歌詞輸出,同時正則表達式少打了一個 ]
# -*- coding:utf-8 -*-
# 網易云音樂 通過歌手ID,生成該歌手的詞云
import requests
import os
import re
import sys
from wordcloud import WordCloud
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np
import jieba
from lxml import etree
headers = {
'Referer': 'http://music.163.com',
'Host': 'music.163.com',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'User-Agent': 'Chrome/10'
}
# 得到某首歌的歌詞
def get_song_lyric(headers,lyric_url):
res = requests.request('GET',lyric_url,headers=headers)
if 'lrc' in res.json():
# lyric = res.json()['lyc']['lyric'] # 根據頁面獲取歌詞文件
lyric = res.json()['lrc']['lyric'] # 根據頁面獲取歌詞文件
# new_lyric = re.sub(r'[\d:.[\]','',lyric) # 對歌詞里面的時間等進行正則表達式替換
new_lyric = re.sub(r'[\d:.[\]]','', lyric) # 對歌詞里面的時間等進行正則表達式替換
return new_lyric
else:
return ''
# print(res.json())
# 去掉停用詞
def remove_stop_words(f):
stop_words = ['作詞', '作曲', '編曲', 'Arranger', '錄音', '混音', '人聲', 'Vocal', '弦樂', 'Keyboard', '鍵盤', '編輯', '助理',
'Assistants', 'Mixing', 'Editing', 'Recording', '音樂', '制作', 'Producer', '發行', 'produced', 'and',
'distributed']
for stop_word in stop_words:
f = f.replace(stop_word,"")
return f
# 得到指定歌手頁面 熱門前50的歌曲ID,歌曲名
def get_songs(artist_id):
page_url = 'https://music.163.com/artist?id=' + artist_id
# 獲取網頁 HTML
res = requests.request('GET',page_url,headers=headers)
# 用xpath 解析熱門前50的歌曲信息
html = etree.HTML(res.text)
href_xpath = "//*[@id='hotsong-list']//a/@href"
name_xpath = "//*[@id='hotsong-list']//a/text()"
# href_xpath = "//*[@id='hotsong-list']//a/@href"
# name_xpath = "//*[@id='hotsong-list']//a/text()"
hrefs = html.xpath(href_xpath)
names = html.xpath(name_xpath)
# 設置熱門歌曲的ID,歌曲名稱
song_ids = []
song_names = []
for href,name in zip(hrefs,names):
song_ids.append(href[9:])
song_names.append(name)
print(href,' ',name)
return song_ids,song_names
# 生成詞云
def creat_word_cloud(f):
print("根據詞頻,開始生成詞云!")
f = remove_stop_words(f)
cut_text = " ".join(jieba.cut(f,cut_all=False,HMM=True))
wc = WordCloud(
font_path="./wc.ttf",
max_words=100,
width = 2000,
height = 1200,
)
print(cut_text)
wordcloud = wc.generate(cut_text)
# 寫詞云文件
wordcloud.to_file("artist_wordcloud.jpg")
# 展示詞云文件
plt.imshow(wordcloud)
plt.axis("off")
plt.show()
# 設置歌手 ID,鄧紫棋為 7763
artist_id = '7763'
[song_ids,song_names] = get_songs(artist_id)
# 所有歌詞
all_words = ''
# 獲取每首歌歌詞
for (song_id,song_name) in zip(song_ids,song_names):
# 歌詞api url
lybric_url = 'http://music.163.com/api/song/lyric?os=pc&id=' + song_id + '&lv=-1&kv=-1&tv=-1'
lyric = get_song_lyric(headers,lybric_url)
all_words = all_words + " " + lyric
print(song_name)
# 根據詞頻生成詞云
creat_word_cloud(all_words)
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的python歌词统计单词词频_Python爬虫网易云歌词及词频统计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python快速入门期末版_史上最全Py
- 下一篇: python入门之函数结构函数的参数_p