【PythonPlanet】数据可视化_词云展示

本文介绍了如何使用Python爬虫从网易云音乐获取毛不易的歌词,通过XPath解析HTML获取歌曲ID和名称,然后利用歌词API获取歌词内容。在数据预处理阶段,去除停用词并生成词云。最后,使用WordCloud库创建词云图片,展示歌词中的高频词汇。整个过程涵盖了Python爬虫、XPath解析和词云可视化等技术。
摘要由CSDN通过智能技术生成

今天做一个数据可视化的项目。

我们经常需要对分析的数据提取常用词,做词晕展示。比如一些互联网公司会抓取用户的画像,或者每日讨论话题的关键词,形成词云并进行展示。再或者,假如你喜欢某个歌手,想了解这个歌手创作的歌曲中经常用到哪些词语,词云就是个很好的工具。最后,只需要将词云生成一张图片就可以直观地看到结果。

在今天的项目里有3个目标需要掌握:

  1. 掌握词云分析工具,并进行可视化呈现;
  2. 掌握Python爬虫,对网页的数据进行爬取;
  3. 掌握XPath工具,分析提取想要的元素。

制作歌词词云

假如我们现在要给毛不易的歌词做个词云,那么需要怎么做呢?我们先把整个项目的流程梳理下:
在这里插入图片描述

  1. 准备阶段:我们主要使用Python爬虫获取HTML,用XPath对歌曲的ID、名称进行解析,然后通过网易云音乐的API接口获取每首歌的歌词,最后将所有的歌词合并得到一个变量。
  2. 在词云分析阶段,我们需要创建WordCloud词云类,分析得到的歌词文本,最后可视化。

基于上面的流程,编写代码如下:


# -*- coding:utf-8 -*-
# 网易云音乐 通过歌手ID,生成该歌手的词云
import requests
import sys
import re
import os
from wordcloud import WordCloud
import matplotlib.pyplot as plt
import jieba
from PIL import Image
import numpy as np
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()['lrc']['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
# 生成词云
def create_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=5000,
       height=2500,
    )
    # print(cut_text)
    wordcloud = wc.generate(cut_text)
    # 生产词云文件
    wordcloud.to_file("wordcloud.jpg")
    # 显示词云图片
    plt.imshow(wordcloud)
    plt.axis("off")
    plt.show()
# 得到指定歌手页面 热门前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()"
    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
# 设置歌手ID,毛不易为12138269,周杰伦为6452
artist_id = '12138269'
[song_ids, song_names] = get_songs(artist_id)
# 所有歌词
all_word = ''
# 获取每首歌歌词
for (song_id, song_name) in zip(song_ids, song_names):
    # 歌词API URL
    lyric_url = 'http://music.163.com/api/song/lyric?os=pc&id=' + song_id + '&lv=-1&kv=-1&tv=-1'
    lyric = get_song_lyric(headers, lyric_url)
    all_word = all_word + ' ' + lyric
    print(song_name)
#根据词频 生成词云
create_word_cloud(all_word)

运行结果:
在这里插入图片描述

解释说明

这个过程中,有一些模块需要说明下。

首先编写get_songs函数,可以得到制定歌手页面中热门前50的歌曲ID、歌曲名。在这个函数里,我们使用requests.request函数获取毛不易歌手页面的HTML。这里需要传入制定的请求头(headers),否则获取不到完整的信息。然后用XPath解析获取指定的内容,这个模块中,我想获取的是歌曲的链接和名称。

其中歌曲的链接类似/song?id=536099160这种形式,你能看到字符串第9位之后,就是歌曲的ID。

一般来说,XPath解析99%的可能性都是以//开头,因为你需要获取所有符合这个XPath的内容。我们通过分析HTML代码,能看到关键的部分:id=‘hotsong-list’。这个代表热门歌曲列表,也正是我们想要解析的内容。我们想要获取这个热门歌曲列表下面所有的链接,XPath解析就可以写成//*[@id=‘hotsong-list’]//a。然后你能看到歌曲链接是href属性,歌曲名称是这个链接的文本。

获取歌曲ID之后,我们还需要知道这个歌曲的歌词,对应代码中的get_song_lyric函数,在这个函数里调用了网易云的歌词API接口,比如

http://music.163.com/api/song/lyric?os=pc&id=536099160&lv=-1&kv=-1&tv=-1

你能看到歌词文件里面还保存了时间信息,我们需要去掉这部分。因此我们使用了re.sub函数,通过正则表达式匹配,将[]中数字信息去掉,方法为re.sub(r’[\d:.[]]’ ,’’,lyric)。

然后,我们还需要设置一些歌词中常用的停用词,比如“作词”“作曲”“编曲”等,编写remove_stop_words函数,将歌词文本中的停用词去掉。

最后编写create_word_cloud函数,通过歌词本文生成词云文件。

禅定时刻

在今天的项目中,前期的数据准备在整个过程中占了很大一部分。如果用Python作为数据采集工具,就需要掌握Python爬虫和XPath解析。

今天讲到了词云工具WordCloud,它是一个很好用的Python工具,可以将复杂的文本通过词云图的方式呈现。需要注意的是,当我们需要使用中文字体的时候,比如黑体SimHei,就可以将WordCloud中的font_path属性设置为SimHei.ttf,你也可以设置其他艺术字体。

在这里插入图片描述

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值